共计 2456 个字符,预计需要花费 7 分钟才能阅读完成。
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。
简略来讲,c
和 s
相干的命令在删除字符后会进入插入模式,而 d
和 x
在删除之后会留在一般模式。c
和 d
能够删除成段字符,而 s
和 x
只删除一个字符。
c{motion}
和 d{motion}
中的 {motion}
代表 动作命令,对于动作命令的更多内容能够参考这一篇。例如:ciw
– 删除以后单词并进入插入模式,dt"
– 删除到 "
前边,di]
– 删除 []
内包含的内容,等等。
除动作命令外,也可应用可视模式选中文本后用 c
或 d
进行删除。
另外,还有不便的 cc
和 dd
命令能够用来间接删除整行。
复制 Yank
在 Vim 中,yank 代表复制。Yank 原本的意思是拉起、拉出。应用 yank 代表复制次要是因为在 Vim 开发的时候 c 曾经被 change 占用了,所以只能用还空余的 y 了。
y
命令的应用形式和 c
、d
相似,y{motion}
能够对复制相应文本,也能够在可视模式下选中文本后用 y
复制。
和 cc
、dd
相似,yy
能够复制整行。
粘贴 Put
p
能够把刚刚删除 / 剪切 / 复制的文本放(put)在光标前面。如果是整行的文本,则放在光标上面的行。而 P
是放在前 / 下面。
在可视模式下,p
会在粘贴的同时 替换 选中的文本。
此外,还有 gp
和 gP
命令,和 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 会应用无名寄存器 ""
。
后面提到,c
、d
、s
、x
、y
命令都会将相应的文本放到寄存器中,而没有申明 [a-z]
中的某一个时,这段文本就会被放到默认的寄存器 ""
中。而当咱们应用 p
进行粘贴的时候,也会读取 ""
中的内容。
这就是 蹩脚,我把复制的内容弄丢了! 的起因。当咱们执行删除操作的时候,删除的文本替换了 ""
中的内容,也就是咱们刚刚复制的文本 a。
所以,正如咱们刚刚提到的,在 Vim 当中剪切和删除并没有清晰的界线,被删掉的文本也会默认被放到无名寄存器 ""
中,而这有可能会笼罩咱们刚刚复制的内容,在应用的时候肯定要留神这一点。
当然,咱们也能够利用 Vim 的这个特点。例如:
xp
能够删除光标下的字符再把它放到光标前面,也就是 替换了光标上面两个字符的地位。
ddp
能够删除以后行,并把这行粘贴在光标上面,也就是 替换了光标上面的两行。
有名寄存器 "[a-z]
Vim 提供了残缺的 26 个英文字母供咱们命名寄存器,这意味着咱们能够同时剪切 / 复制 26 段文本。
应用大写字母命名寄存器,会将相应的内容增加到绝对应的小写字母命名的寄存器前面。
复制专用寄存器 "0
当应用 y
进行复制时,复制的文本不仅会被存进无名寄存器 ""
,也同时会被存进 "0
,而 c
、d
、s
、x
均不会笼罩这个寄存器。只有当咱们下一次复制的时候,这个寄存器才会被笼罩。
所以,也能够应用这个寄存器来躲避 蹩脚,我把复制的内容弄丢了! 的问题。
零碎剪贴板寄存器 "+
后面提到 Vim 应用的寄存器和操作系统的剪贴板是互相隔离的,然而这个隔离也不相对,应用 "+
寄存器能够和零碎剪贴板进行交互,例如,咱们能够通过 "+p
粘贴零碎剪贴板的内容,也能够用 "+y
把内容存进零碎剪贴板。这意味着咱们能够在 Vim 中间接复制文本,而后到其余程序中粘贴。
其余
此外,Vim 还提供了一些其余的寄存器供咱们应用,这些寄存器也被称为 只读 寄存器:
寄存器 | 内容 |
---|---|
"% | 以后文件名 |
"# | 轮换文件名 |
". | 上次插入的文本 |
": | 上次执行的命令 |
"/ | 上次查找的模式 |