VIM实用技巧笔记

2016-01-24 Lanffy 更多博文 » 博客 » GitHub »

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/

  1. 使用超级用户权限保存文件

使用场景:当前用户用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复制的文本粘贴到光标所在处。

在文件中跳转

  1. 跳转到光标下的文件:gf;

宏的使用

宏的定义:

www.google.com

录制宏:q:开始录制宏,接着输入任意一个小写的字母作为宏的名字a,输入名字后就可以开始录制宏的内容了,直到再次按下q为止,所有的按键操作都会被记录下来。

使用宏:

  1. 将光标定位到想要运行宏的位置;
  2. 按下:@a,即对当前位置的内容执行宏a
  3. @@,执行上一次运行的宏
  4. n@a,n代表数字,连续n次执行宏a。

上面的宏执行都是串行执行,如果在执行的过程中出错,那么宏将终止执行,出错后的内容将不会被宏处理。这样的情况就需要并行执行宏,就算有一些行报错也不形象其他行的执行。并行执行宏的命令:

  1. 高亮选中想要执行宏的行
  2. 执行命令::'<,'>normal @a.

查看宏的内容::reg a

附加宏内容

  1. 假设现在有一个名为a的宏,现在要在其后附件几个命令
  2. 输入命令:qA,开始附件录制命令
  3. 命令录入完毕后,再次按下q即可

...待续