vi中的删除基本上都是剪切操作,比如normal模式下的x命令看似是删除一个字符,实则是在删除的同时把删除的内容也放在剪贴板里了。当然这个剪贴板并不是系统剪贴板,实际上是vi中的匿名寄存器。
关于寄存器的介绍可以见这篇文章:使用 Vim 寄存器 | Harttle Land
Vim提供了10类寄存器,可在Vim中通过:help registers查看帮助。
匿名寄存器 ""
编号寄存器 "0 到 "9
小删除寄存器 "-
26个命名寄存器 "a 到 "z
3个只读寄存器 ":, "., "%
Buffer交替文件寄存器 "#
表达式寄存器 "=
选区和拖放寄存器 "*, "+, "~
黑洞寄存器 "_
搜索模式寄存器 "/
其中,对黑洞寄存器的介绍是:黑洞寄存器",所有删除或拷贝到黑洞寄存器的文本将会消失。 这是为了在删除文本的同时不影响任何寄存器的值,"通常用于Vim脚本中。
借助黑没事寄存器,我们就可以实现用x命令删除一个字符而不是剪切,具体命令是:"_x
寄存器操作都是双引号开头,所以上面命令中的双引号就不要忽略了。
每次都要进行这样的寄存器操作当然是很麻烦的,有的是办法让它更快捷——在.vimrc中进行如下设置:
nnoremap x "_x
nnoremap X "_X
nnoremap d "_d
nnoremap dd "_dd
nnoremap D "_D
vnoremap d "_d
vnoremap dd "_dd
nnoremap <leader>x ""x
nnoremap <leader>X ""X
nnoremap <leader>d ""d
nnoremap <leader>dd ""dd
nnoremap <leader>D ""D
vnoremap <leader>d ""d
vnoremap <leader>dd ""dd
那么,做了以上的修改怎么做剪切呢?用Visual模式下的x/X就可以实现啦。注意visual模式下的X是删除整行
通常在vi中复制粘贴的内容与系统剪切板是隔离的。系统剪贴板默认是对应"+寄存器的。如果要使系统剪贴板与vi剪贴板相通,办法在.vimrc中做以下的设置:
set clipboard=unnamed
即将系统剪贴板与匿名寄存器对应起来。
关于寄存器另一个简单的介绍:
寄存器 描述 可复写
0 上一次复制的文本 是
- 上一次删除的文本 否
. 上一次插入的文本 否
% 当前文件的名字 否
# 交替文件的名字 否
/ 上一次查找的字符串 否
: 上一次\":\"命令 否
_ 黑洞(black hole) 是
= 表达式 否
* 由鼠标选中的文本 是
参考:
copy paste - How to delete (not cut) in Vim? - Stack Overflow
网友评论