復(fù)制與粘貼
Vim 的剪切、復(fù)制、粘貼有別于其他編輯器。
命令 Others Vim 復(fù)制 copy yank 剪切 cut delete 粘貼 paste put
Vim 的 put 命令與粘貼命令完全相同。
Vim 的 yank 命令等同于復(fù)制操作。至于為什么用 yank 而不是 copy ,這就是歷史遺留原因了。 當(dāng)時(shí)的 c 命令被用于 修改(change)操作了,所以被迫換成了 yank 這個(gè)名字。
Vim 的 delete 也與標(biāo)準(zhǔn)的剪切操作一致。該命令會(huì)把指定文本復(fù)制到寄存器后再從文檔中刪掉。
用無名寄存器實(shí)現(xiàn)刪除、復(fù)制與粘貼操作
通常情況下,復(fù)制、粘貼和操作指的是操縱系統(tǒng)的剪貼板。在 Vim 中,操作的是寄存器。
調(diào)換字符
手速太快有時(shí)候會(huì)習(xí)慣性的輸錯(cuò)某個(gè)單詞,常見的比如兩個(gè)字母的順序輸錯(cuò)了。
Practica lvim
上面把 “l(fā)” 和空格的順序輸入反了,現(xiàn)在我的光標(biāo)在最后一個(gè)字母 "m" 上, 按下 F<space> 在本行文本中找到光標(biāo)之前的空格,按下 x 把光標(biāo)下的字符剪切下來放到無名寄存器。最后按下 p 命令將無名寄存器的內(nèi)容粘貼到光標(biāo)后面。
最后把兩個(gè)命令組合到一起,即 xp ,可以 “調(diào)換光標(biāo)后的兩個(gè)字符”,現(xiàn)在我的光標(biāo)在最后一個(gè)字母 "m" 上, 按下 F<space> 在前文中找到空格,按下 x 把光標(biāo)下的字符剪切下來放到無名寄存器。最后按下 p 命令將無名寄存器的內(nèi)容粘貼到光標(biāo)后面。
Practical vim
調(diào)換文本行
類似的,也可以方便的調(diào)換兩行文本的順序。這次,用 dd 命令剪切當(dāng)前行,將內(nèi)容放到無名寄存器中,再按下 p 會(huì)把內(nèi)容粘貼到當(dāng)前行的下一行。
把命令連接起來即 ddp ,可以用來“調(diào)換當(dāng)前行和它的下一行”。
// before
我是第二行
我是第一行
我是第三行
// after
我是第一行
我是第二行
我是第三行
創(chuàng)建文本行的副本
類似調(diào)換文本行,創(chuàng)建文本行的副本只需要將剪切行的命令 dd 換成復(fù)制一行文本的命令 yy 即可,連起來是 yyp,可以用來“復(fù)制當(dāng)前行并在下一行粘貼文本”。
// before
我是第一行
我是第二行
// after
我是第一行
我是第一行
我是第二行
深入理解 Vim 寄存器
引用一個(gè)寄存器
Vim 的刪除、復(fù)制和粘貼都會(huì)用到眾多寄存器中的一個(gè) 。 可以通過給命令加 "{register} 前綴的方式指定要用的寄存器。若不指明,Vim 將使用無名寄存器。
- 舉例
如果想把當(dāng)前單詞復(fù)制到寄存器 a 中, 可以執(zhí)行 "ayiw 。
把當(dāng)前整行文本剪切到寄存器 b 中, 可以執(zhí)行 "bdd 。
"ap 可以粘貼來及寄存器 a 的單詞, "bp 可以粘貼來及寄存器 b 的一行文本,兩者互不干擾。
無名寄存器("")
倘若我們沒有指定使用寄存器, Vim 將缺省使用無名寄存器,它可以雙引號(hào)表示。
- 舉例
例如 ""p 這個(gè)命令,他完全等同于 p 命令。
復(fù)制專用寄存器 ("0)
當(dāng)使用 y{motion} 命令時(shí),要復(fù)制的文本不僅會(huì)拷貝到無名寄存器中,同時(shí)也拷貝到了復(fù)制專用寄存器中。后者可以用數(shù)字 “0” 加以引用。
- 舉例
例如有以下代碼
var myCat1 = new cat();
var myCat2 = new dog();
現(xiàn)在想要把 "dog" 換為 "cat"。若是之前不知道寄存器這個(gè)概念的話,場(chǎng)景會(huì)是這樣:
- 光標(biāo)到 “cat” 上面,按下 yiw 復(fù)制這個(gè)單詞
- 把光標(biāo)移動(dòng)到 “dog” 上面,按下 diw 刪除這個(gè)單詞
- 按下 p 粘貼
- 變成傻逼:本來想粘貼 “cat” 的,結(jié)果粘貼的內(nèi)容卻是 “dog” ,第一步復(fù)制的 “cat” 不見了
發(fā)生這個(gè)問題原因是一直使用的是無名寄存器,當(dāng)刪除單詞時(shí),刪除操作會(huì)把單詞放到無名寄存器中,把之前復(fù)制的內(nèi)容給“擠”走了。
現(xiàn)在有了復(fù)制專用寄存器就不虛了。在最后粘貼的時(shí)候按下 "0p 而不是 p 就完美的解決了這個(gè)問題。
var myCat1 = new cat();
var myCat2 = new cat();
有名寄存器("a - "z)
Vim 提供了一組以 26 個(gè)英文字母命名的寄存器,這意味著我們可以復(fù)制、剪切或者粘貼多達(dá) 26 段文本。
上面改名字的問題使用有名寄存器也能很輕松地解決,這里就不再贅述了。
- 用小寫字母引用有名寄存器,會(huì)覆蓋該寄存器的原有內(nèi)容。
- 用大寫字母引用有名寄存器,會(huì)將新內(nèi)容添加到原有內(nèi)容之后。
黑洞寄存器 ("_)
想要?jiǎng)h除一段文本而不想保留副本時(shí),黑洞寄存器就很管用了。
使用 "_diw 刪除一個(gè)單詞時(shí), 不會(huì)將之前無名寄存器的內(nèi)容覆蓋。
系統(tǒng)剪切板("+)與選擇專用寄存器("*)
到目前為止,討論的寄存器都是 Vim 內(nèi)部的,如果想從 Vim 復(fù)制內(nèi)容到外部,則必須使用系統(tǒng)剪切板。
Vim 的加號(hào)寄存器與系統(tǒng)剪切板等效,可用 +號(hào)引用。
比如現(xiàn)在從別的程序中復(fù)制了一段文本,在 Vim 中,就可以通過 "+p 命令將其粘貼到 Vim 內(nèi)部。
如果在 Vim 的復(fù)制、粘貼和剪切命令之前加上 "+ ,相應(yīng)的文本會(huì)捕捉至系統(tǒng)剪切板。
在 Windows 和 Mac OS 中, "+ 寄存器 和 "* 寄存器 可以混用。