關於在Vim裡的複製與貼上,help copy-move 可以得到詳細的說明。
較為特別之處是Vim提供了暫存器(register)的觀念,可以將他想成buffer的概念,
剪下來的東西分別以自動或手動的方式放置到不同的register,稍後就可以統一處理。
想像一個場景,用Windows的筆記本編輯一個檔案,你發現想要複製的內容分佈在檔案的不同部位,甚至是不同的檔案中,
通常的操作就是捲到目標處,複製,回來貼上,捲到下個目標處,回來再貼上,打開另一個檔案,重複本行的行為。
使用Vim的情景會是找到目標,複製到某暫存器,繼續找下一個目標,複製到另一個暫存器,打開別的檔案找到目標,複製到另一個暫存器,一直到暫存器用完或是全部複製作業結束,然後回來原先的編輯處按需要一個一個貼出來,以下是常用的register及功能介紹。
Vim總共有九種類型的暫存器, 共74個,
使用時按"接著要使用的暫存器,需要配合d、c、s、x、p等指令,
例如"a2x表示剪下游標後的兩個字元存入"a暫存器, "ap表示將a暫存器內容貼在游標處,
:
1. unmamed register ""
2. number register "0 ~ "9
3. small delete register "-
4. 26 named register "a ~ "z 或 "A ~ "Z
5. 4 read-only register ": ". "% "#
6. expression register "=
7. selection and drop register "* "+ "~
8. black hold register "_
9. last search pattern register "/
1. unnamed register:
Vim執行d, c, s, x, 等刪除行為, 或是複製行為y時就會將被剪下來或是複製下來的內容放進這個暫存器,
不管有沒有指定要使用那一個暫存器, 也可以說這個暫存器就是指向最後一個使用的暫存器,
在Vim內使用複製、剪下與貼上時,如果沒有指定使用哪個暫存器,東西就是存在unnamed
register,順帶一題指定存入""的話,實際會寫入"0。
2. number register:
number register也是屬於自動使用,沒指定暫存器的話,最近一次的複製(yank)內容會存到"0,
而最後一次的刪除(x|d)或變更(c)會將被去掉的內容放在"1
,每次"1被換成新的內容時,前一次存著的內容就會推到"2,以此類推,最後的"9放的內容會自動丟掉。
3. small register:
類似"1, 差別在少於一行的內容會放在"-, 大於一行的內容放在"1
4. named register:
給你手動使用的register, 指定存到小寫暫存器("a ~ "z)時以新的內容置換掉原來暫存器的存放內容,指定存到大寫暫存器("A ~ "Z)時新的內容會被附加在原來內容的後面。
5. 4 read-only register:
這四個暫存器值是Vim自己填的,你只能用p或P貼出去。
". - 最後以i或o命令插入的文字, 打了1234abcd, ".裡面放的就是1234abcd
"% - 當前編輯的檔名
"# - 替代用檔名(alternate name)
": - 最後執行的命令, 例如執行shell命令:! ls, ":裡放的就是! ls
6. expression register:
read only register, 這個暫存器的用法有點不容易搞清楚,說明文字裡說的是讓我們評估Vim的表示式(expression),如果表示式的結果能被轉換成字串,字串就可以被插入當前游標所在地,很拗口的說法。
實際上的使用可以當作一個簡易的計算機,在輸入模式時按下Ctrl+r及=,游標會顯示在命令行讓你鍵入命令,我們輸入一個算式例如4*2,按下enter後,結果8就會被插入文件中游標最後位置。
所謂的表示式並不限於數學的運算式,只要是按下:後能在命令列輸入的命令就可以用,暫存器會存下執行的最後結果供你隨後使用。
7. selection and drop register:
用在圖形界面中與其他應用程式共用剪貼板,一般來說會被WM或是Windows的內建功能接管剪貼簿,這個功能實驗不出來。
8. black hols register:
像是/dev/null,寫進去之後就不見了,也貼不出東西,當不想打亂register的時候用
9. Last search register:
這個register存放最後執行的search pattern,主要影響到n及hlsearch,意思是說當你想更換n及hlsearch的對象,但是又不想真的執行search時,使用:let設定這個register的值, ex:
let@/='search_target'
#順道一提,:reg {arg}與:dis {arg}列出指定的register及值,:reg沒指定對象的話就列出全部register。