复制与粘贴
Vim 的剪切、复制、粘贴有别于其他编辑器。
命令 Others Vim 复制 copy yank 剪切 cut delete 粘贴 paste put
Vim 的 put 命令与粘贴命令完全相同。
Vim 的 yank 命令等同于复制操作。至于为什么用 yank 而不是 copy ,这就是历史遗留原因了。 当时的 c 命令被用于 修改(change)操作了,所以被迫换成了 yank 这个名字。
Vim 的 delete 也与标准的剪切操作一致。该命令会把指定文本复制到寄存器后再从文档中删掉。
用无名寄存器实现删除、复制与粘贴操作
通常情况下,复制、粘贴和操作指的是操纵系统的剪贴板。在 Vim 中,操作的是寄存器。
调换字符
手速太快有时候会习惯性的输错某个单词,常见的比如两个字母的顺序输错了。
Practica lvim
上面把 “l” 和空格的顺序输入反了,现在我的光标在最后一个字母 "m" 上, 按下 F<space> 在本行文本中找到光标之前的空格,按下 x 把光标下的字符剪切下来放到无名寄存器。最后按下 p 命令将无名寄存器的内容粘贴到光标后面。
最后把两个命令组合到一起,即 xp ,可以 “调换光标后的两个字符”,现在我的光标在最后一个字母 "m" 上, 按下 F<space> 在前文中找到空格,按下 x 把光标下的字符剪切下来放到无名寄存器。最后按下 p 命令将无名寄存器的内容粘贴到光标后面。
Practical vim
调换文本行
类似的,也可以方便的调换两行文本的顺序。这次,用 dd 命令剪切当前行,将内容放到无名寄存器中,再按下 p 会把内容粘贴到当前行的下一行。
把命令连接起来即 ddp ,可以用来“调换当前行和它的下一行”。
// before
我是第二行
我是第一行
我是第三行
// after
我是第一行
我是第二行
我是第三行
创建文本行的副本
类似调换文本行,创建文本行的副本只需要将剪切行的命令 dd 换成复制一行文本的命令 yy 即可,连起来是 yyp,可以用来“复制当前行并在下一行粘贴文本”。
// before
我是第一行
我是第二行
// after
我是第一行
我是第一行
我是第二行
深入理解 Vim 寄存器
引用一个寄存器
Vim 的删除、复制和粘贴都会用到众多寄存器中的一个 。 可以通过给命令加 "{register} 前缀的方式指定要用的寄存器。若不指明,Vim 将使用无名寄存器。
- 举例
如果想把当前单词复制到寄存器 a 中, 可以执行 "ayiw 。
把当前整行文本剪切到寄存器 b 中, 可以执行 "bdd 。
"ap 可以粘贴来及寄存器 a 的单词, "bp 可以粘贴来及寄存器 b 的一行文本,两者互不干扰。
无名寄存器("")
倘若我们没有指定使用寄存器, Vim 将缺省使用无名寄存器,它可以双引号表示。
- 举例
例如 ""p 这个命令,他完全等同于 p 命令。
复制专用寄存器 ("0)
当使用 y{motion} 命令时,要复制的文本不仅会拷贝到无名寄存器中,同时也拷贝到了复制专用寄存器中。后者可以用数字 “0” 加以引用。
- 举例
例如有以下代码
var myCat1 = new cat();
var myCat2 = new dog();
现在想要把 "dog" 换为 "cat"。若是之前不知道寄存器这个概念的话,场景会是这样:
- 光标到 “cat” 上面,按下 yiw 复制这个单词
- 把光标移动到 “dog” 上面,按下 diw 删除这个单词
- 按下 p 粘贴
- 变成傻逼:本来想粘贴 “cat” 的,结果粘贴的内容却是 “dog” ,第一步复制的 “cat” 不见了
发生这个问题原因是一直使用的是无名寄存器,当删除单词时,删除操作会把单词放到无名寄存器中,把之前复制的内容给“挤”走了。
现在有了复制专用寄存器就不虚了。在最后粘贴的时候按下 "0p 而不是 p 就完美的解决了这个问题。
var myCat1 = new cat();
var myCat2 = new cat();
有名寄存器("a - "z)
Vim 提供了一组以 26 个英文字母命名的寄存器,这意味着我们可以复制、剪切或者粘贴多达 26 段文本。
上面改名字的问题使用有名寄存器也能很轻松地解决,这里就不再赘述了。
- 用小写字母引用有名寄存器,会覆盖该寄存器的原有内容。
- 用大写字母引用有名寄存器,会将新内容添加到原有内容之后。
黑洞寄存器 ("_)
想要删除一段文本而不想保留副本时,黑洞寄存器就很管用了。
使用 "_diw 删除一个单词时, 不会将之前无名寄存器的内容覆盖。
系统剪切板("+)与选择专用寄存器("*)
到目前为止,讨论的寄存器都是 Vim 内部的,如果想从 Vim 复制内容到外部,则必须使用系统剪切板。
Vim 的加号寄存器与系统剪切板等效,可用 +号引用。
比如现在从别的程序中复制了一段文本,在 Vim 中,就可以通过 "+p 命令将其粘贴到 Vim 内部。
如果在 Vim 的复制、粘贴和剪切命令之前加上 "+ ,相应的文本会捕捉至系统剪切板。
在 Windows 和 Mac OS 中, "+ 寄存器 和 "* 寄存器 可以混用。