乐趣区

关于visual-studio-code:Vim-进阶-剪切删除复制粘贴与寄存器

Vim 和其它编辑器一样,也有剪切、复制、粘贴等操作,然而在 Vim 中这些操作都有不同的名字:删除 delete、复制 yank、粘贴 put。

个别的编辑器在进行复制、剪切等操作时,会应用操作系统的剪贴板 clipboard 来临时存储文本,而 Vim 的「剪贴板」和零碎的剪贴板并不互通,Vim 应用内建的「寄存器 register」来保留文本。

剪切(删除)、复制、粘贴操作

剪切(删除)Delete

在其余编辑器中,剪切个别代表着删除一段文本的同时,将这段文本保留到剪贴板中,以便在其余中央粘贴进去。而在 Vim 当中,剪切和删除并没有显著的界线,因为在 Vim 中,所有被删除的文本都会被放到寄存器中,这样咱们在下次想应用的时候能够间接粘贴。

具体放到哪个寄存器里了,以及寄存器的操作方法,咱们稍后再说。先来看看 Vim 中和剪切 / 删除相干的命令:

命令 用处
c{motion} 删除字符并进入插入模式
cc 删除整行并进入插入模式(=== S
C 从光标处删除到行尾并进入插入模式
d{motion} 删除字符并进入插入模式
dd 删除整行
D 革除以后行的所有字符(不会删除行)
s 删除光标下的字符并进入插入模式
S 删除整行并进入插入模式(=== cc
x 删除光标下的字符
X 删除光标后面的字符

在 Vim 里,c 代表 change,d 代表 delete。

简略来讲,cs 相干的命令在删除字符后会进入插入模式,而 dx 在删除之后会留在一般模式。cd 能够删除成段字符,而 sx 只删除一个字符。

c{motion}d{motion} 中的 {motion} 代表 动作命令,对于动作命令的更多内容能够参考这一篇。例如:ciw – 删除以后单词并进入插入模式,dt" – 删除到 " 前边,di] – 删除 [] 内包含的内容,等等。

除动作命令外,也可应用可视模式选中文本后用 cd 进行删除。

另外,还有不便的 ccdd 命令能够用来间接删除整行。

复制 Yank

在 Vim 中,yank 代表复制。Yank 原本的意思是拉起、拉出。应用 yank 代表复制次要是因为在 Vim 开发的时候 c 曾经被 change 占用了,所以只能用还空余的 y 了。

y 命令的应用形式和 cd 相似,y{motion} 能够对复制相应文本,也能够在可视模式下选中文本后用 y 复制。

ccdd 相似,yy 能够复制整行。

粘贴 Put

p 能够把刚刚删除 / 剪切 / 复制的文本放(put)在光标前面。如果是整行的文本,则放在光标上面的行。而 P 是放在前 / 下面。

在可视模式下,p 会在粘贴的同时 替换 选中的文本。

此外,还有 gpgP 命令,和 p P 不同的是,前两个命令会在粘贴之后,把光标的地位移到文本的结尾而不是结尾。

寄存器 Register

看到这里,咱们曾经学到删除 / 剪切 / 复制的一些一本操作,能应酬很多日常场景了。

然而构想这样的场景:

我想复制一处的文本 a,并替换另一处的文本 b。我用 y 复制了文本 a,而后把光标挪动到文本 b 上,选中或者应用动作命令搭配 d 删除了文本 b,而后按 p

奇怪的事件产生了,咱们失去的并不是文本 a,而是把文本 b 粘贴(put)了进去。蹩脚,我把复制的内容弄丢了!

当然你可能会说,复制文本 a 之后,选中文本 b 而不删除,间接用 p 即可实现替换。的确如此,这也是我更偏向的操作,它不会既复制又删除,只用两步操作就实现了替换。

而要弄懂为什么会 put 出文本 b,就要理解寄存器的概念。

什么是寄存器

一般来讲,操作系统的剪贴板只有一个,起初的会笼罩先来的。新的内容被存到剪贴板的同时,老的内容也会被删除。

Vim 的寄存器不太一样,寄存器有很多个,能够通过 "{reg} 的形式指明要应用的寄存器。其中," 用来通知 Vim,要进行和寄存器无关的操作,而 {reg} 代表寄存器的名字。

寄存器的名字能够是 [a-z0+"*#%.:/] 等,其中 [a-z] 共 26 个可供咱们随便应用,另外的那些是 Vim 内置的专用寄存器。

应用寄存器

应用 "{reg} 加命令能够指明咱们想要应用的寄存器,例如 "ep – 粘贴寄存器 e 中的内容,"fdd – 删除以后行并放到 f 寄存器中,等等。

无名寄存器(默认)""

当没有指定要应用的寄存器时,Vim 会应用无名寄存器 ""

后面提到,cdsxy 命令都会将相应的文本放到寄存器中,而没有申明 [a-z] 中的某一个时,这段文本就会被放到默认的寄存器 "" 中。而当咱们应用 p 进行粘贴的时候,也会读取 "" 中的内容。

这就是 蹩脚,我把复制的内容弄丢了! 的起因。当咱们执行删除操作的时候,删除的文本替换了 "" 中的内容,也就是咱们刚刚复制的文本 a。

所以,正如咱们刚刚提到的,在 Vim 当中剪切和删除并没有清晰的界线,被删掉的文本也会默认被放到无名寄存器 "" 中,而这有可能会笼罩咱们刚刚复制的内容,在应用的时候肯定要留神这一点。

当然,咱们也能够利用 Vim 的这个特点。例如:

xp 能够删除光标下的字符再把它放到光标前面,也就是 替换了光标上面两个字符的地位

ddp 能够删除以后行,并把这行粘贴在光标上面,也就是 替换了光标上面的两行

有名寄存器 "[a-z]

Vim 提供了残缺的 26 个英文字母供咱们命名寄存器,这意味着咱们能够同时剪切 / 复制 26 段文本。

应用大写字母命名寄存器,会将相应的内容增加到绝对应的小写字母命名的寄存器前面。

复制专用寄存器 "0

当应用 y 进行复制时,复制的文本不仅会被存进无名寄存器 "",也同时会被存进 "0,而 cdsx 均不会笼罩这个寄存器。只有当咱们下一次复制的时候,这个寄存器才会被笼罩。

所以,也能够应用这个寄存器来躲避 蹩脚,我把复制的内容弄丢了! 的问题。

零碎剪贴板寄存器 "+

后面提到 Vim 应用的寄存器和操作系统的剪贴板是互相隔离的,然而这个隔离也不相对,应用 "+ 寄存器能够和零碎剪贴板进行交互,例如,咱们能够通过 "+p 粘贴零碎剪贴板的内容,也能够用 "+y 把内容存进零碎剪贴板。这意味着咱们能够在 Vim 中间接复制文本,而后到其余程序中粘贴。

其余

此外,Vim 还提供了一些其余的寄存器供咱们应用,这些寄存器也被称为 只读 寄存器:

寄存器 内容
"% 以后文件名
"# 轮换文件名
". 上次插入的文本
": 上次执行的命令
"/ 上次查找的模式
退出移动版