Vim实用技巧-1
背景
时光荏苒,转眼又回到了Vim的世界里,我决心将此前《Vim实用技巧》一书看完,以慰寡淡之生活,读本书之开始,是基于此前所定计划「深度Vim工作者」,尽管Python的学习步履维艰,但还是知道没得办法,迟早又要回头,既然实在不想看,那么就值此反感之间隙,摸一摸别的。
内容
vim中显示行号
1 2 3 4 5 6 7 8
| # 在文件中执行命令 :set number
# 或者执行命令 :set nu
# 或者修改home下的配置文件.vimrc,追加内容 set nu
|
撤销修改
修改大小写
vim中当一个操作符命令被连续调用两次时,它会作用于当前行,但是有一个除外,即gU。
1 2 3 4 5 6 7
| gU: 将指定区域全部转换为大写 gu:将指定区域全部转换为小写 g~:将指定区域的大小写进行转换
如: gUaw:表示将当前光标的单词全部转化为大写 gUU:表示将当前光标所在行单词全部转换为大写
|
你也会发现,上述的操作并没有作用到最小单元:字母。
1 2
| # vim使用~可以将当前光标所在的字符转为其对应的大/小写 ~
|
屏幕绘制
除了寻常的H、M、L切换光标在窗口的位置方式外,还可以重回当前窗口的内容
内容复制、修改
普通模式下,除了yy之类,还可以通过其他方式在一行中快速复制想要的内容
1 2
| # 快速复制当前光标到下一个,之间的内容 yt,
|
有时,我们需要重复选择前一次选中的内容
而有时我们需要跨多行对内容进行修改,此时可以使用块选择操作符
1 2 3 4 5 6 7 8 9 10 11
| # 启动块选择以后,移动选择区域 Ctrl + v
# 执行修改命令,在行首/行尾修改 I/A
# 也可以选中单词进行修改 w + c
# ESC退出选择 ESC
|
命令行
在vim中每一个常见指令都可以找到与其对应的命令,命令的格式大致如下:
1
| :{start},{end}命令 [action]
|
在{start}, {end}中常用的标识符如下:
1 2 3 4 5 6 7
| .:表示当前行 $:表示文档最末尾 %:表示文档中所有行 <':表示选中区域的左侧起始位置 >':表示选中区域的右侧起始位置 /<html>/:表示文档中标志的内容位置,当有/内容时,可用\/表示 /<html>/+1:表示根据定位的位置产生偏移
|
每次执行命令后,:都会记录下我们最后一次执行的命令,同时默认缓存区会缓存下20条历史命令,当我们需要重复执行最后一次执行的命令的时候:
1 2 3 4 5
| # 初次重复执行最后一次执行的命令 @:
# 当再次需要重复执行的时候 @@
|
与操作指令类似,在命令行中有查看、复制、移动、替换的命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 查看指定行的内容 :{start},{end}p
# 复制粘贴命令,对应:y。 :{start},{end}t {address} # :2,5t 6 --> 表示将第2~5行内容复制到第6行下
# 移动命令 :{start},{end}m {address} # :2,5m 6 --> 表示将第2~5行内容剪切到第6行下
# 替换, g表示一行多个匹配,c表示确认替换 :{start},{end}s/old/new/gc
# start、end不填默认为当前光标所在行
|
同样vim对于批量操作有着更为高级的命令normal,它可以一次性直接对选定的区域执行相同的操作指令
1 2 3 4 5 6
| :{start},{end}normal [操作命令]
# :2,19normal A; --> 将第2到19行的行后都加上;
# 由于当执行normal命令时,它会自动的将光标移动到行首,所以在行首插入命令时,直接使用i和I效果都是一样的 :2,19normal i# --> 将第2到19行的行首加上#
|
可能你也会恐惧命令集的多,为此可以在输入命令的时候,通过如下方式获取vim的智能提示
1 2 3 4 5 6 7 8
| # 会展示出所有的匹配命令 Ctrl + d
# 依次循环补足匹配的指令 tab
# 反向循环补足匹配的指令 Shift + tab
|
有时,我们必须将vim文本中的内容输入到命令行中,如替换文本指令,这个时候手敲自然显得不那么高明,vim也为我们提供了快捷的方式
1 2 3 4 5
| # 在命令行状态下,复制当前光标所在的单词 C-r + C-w
# 在命令行状态下,复制当前光标所在的字符串 C-r + C-a
|
同样,有时我们需要对历史命令进行编辑重组成新的命令,然后执行,如果手动敲一遍不免有点繁琐,vim其实也提供了历史命令编辑功能
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 进入历史命令窗口 q:
# 编辑命令同普通模式下的编辑一样 a/i/A/I
# 记录一个特殊指令:J。它可以删除当前行的换行符,将当前行与下一行进行合并
# 退出历史命令窗口 :q
# 多个连贯的指令可以通过|来链接,譬如将当前行复制,然后将复制的内容中2003替换为2004 :t. | s/2003/2004/g
|
在vim作业中,很多时候需要切换回bash状态下去执行命令,比如修改配置文件中的路径,很多时候就必须要出去检查配置的是否准确。为此,vim中提供了shell指令,但是一般并不使用它,而是采用另一种解决方案:
1 2 3 4 5 6 7 8
| # 执行一次命令 :! [cmd]
# 需要执行多次命令,则将vim作业挂起,直接切换回bash shell Ctrl + z
# 执行完毕后回vim作业 fg
|
vim命令的另一个高明之处在于其直接可以调用外部linux命令对vim中指定的内容进行筛选作业
1 2 3 4 5
| # 将指定区域的内容直接 :{start},{end}! [cmd]
# 譬如将csv文件中的内容按照第二行进行排列 :2,$!sort -t',' -k2
|