VIM实用技巧笔记
原文链接 https://lanffy.github.io/2016/01/24/VIM%E5%AE%9E%E7%94%A8%E6%8A%80%E5%B7%A7%E7%AC%94%E8%AE%B0
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
关于本书:http://book.douban.com/subject/25869486/
- 使用超级用户权限保存文件
使用场景:当前用户用vim打开了一个只有只读权限的文件,修改后想保存改怎么办呢?
命令: :w !sudo tee % > /dev/null
%: 在vim命令中,%符号表示当前文件的完整路径
使用无名寄存器进行删除,复制,粘贴
- s:
删除光标所在字符,同时进入插入模式
- x:
删除光标所在字符
- dd:
删除光标坐在行
- ndd:
从光标所在行算起,一共删除n行,n是数字
- diw:
删除光标所在当前单词
- y:
复制可视模式下选中的文本
- yy:
复制当前行
- nyy:
从光标所在行算起,一共复制n行,n是数字
VIM中还有很多命令可以用来快速删除一个字符,一个单词,一个字符串,一行数据,一段数据等等。所有这些删除操作再删除文本的同时,还将被删除的文本保留在了寄存器中,这个寄存器即是无名寄存器。无名寄存器中的内容只保留最新的,当有新的内容被写入时,之前的内容就会被覆盖掉,这里有点像操作系统中的粘贴板,没次复制都会把上次复制的内容覆盖掉。
无名寄存器中的内容可以再普通模式下按p输出到光标所在点的后面。
那么问题来了。
我先用yy复制了当前行,然后用dd删除了当前行的下一行,在用p复制。。。结果把删除的行复制出来了,根据上面所说的,yy复制的行已经被dd删除的行覆盖了。那么怎样在不进入插入模式下完成上面的操作呢?这是时候就需要用到黑洞寄存器了。
所谓黑洞寄存器和跟Linux中的/dev/null
是一个意思,就是将其中的内容丢弃。
在上面的dd操作前面加上"_
即"_dd
即可将改行删除并且不放入无名寄存器中。
主要还是这个名字比较厉害。
一些tips:
- 复制文本到指定的寄存器:
"ay
-> 复制选中的文本到a寄存器 - 粘贴指定的寄存器的文本:
"ap
-> 粘贴a寄存器中的文本 - 复制专用寄存器,vim复制的文本都保存在0寄存器中,即使用
"0p
可以把之前使用y复制的文本粘贴到光标所在处。
在文件中跳转
- 跳转到光标下的文件:
gf
;
宏的使用
宏的定义:
录制宏:q:开始录制宏,接着输入任意一个小写的字母作为宏的名字a,输入名字后就可以开始录制宏的内容了,直到再次按下q为止,所有的按键操作都会被记录下来。
使用宏:
- 将光标定位到想要运行宏的位置;
- 按下:
@a
,即对当前位置的内容执行宏a @@
,执行上一次运行的宏n@a
,n代表数字,连续n次执行宏a。
上面的宏执行都是串行执行,如果在执行的过程中出错,那么宏将终止执行,出错后的内容将不会被宏处理。这样的情况就需要并行执行宏,就算有一些行报错也不形象其他行的执行。并行执行宏的命令:
- 高亮选中想要执行宏的行
- 执行命令:
:'<,'>normal @a
.
查看宏的内容::reg a
附加宏内容
- 假设现在有一个名为a的宏,现在要在其后附件几个命令
- 输入命令:
qA
,开始附件录制命令 - 命令录入完毕后,再次按下q即可
...待续