歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 大家來用VIM--linux的缺省編輯器(二)

大家來用VIM--linux的缺省編輯器(二)

日期:2017/3/6 15:29:28   编辑:關於Unix
大家來用VIM-- linux 的缺省編輯器(二) 游標的移動 本節所述皆是在 common-mode(c-mode,在 vim 又名 normal-mode) 下的移動,原始的 vi 只能在 c-mode 移 動,在 insert-mode 只做文字的輸入, 而不做游標的移動。當然 vim 及 elvis 的方向鍵是不論在那一 大家來用VIM--linux的缺省編輯器(二)

游標的移動
本節所述皆是在 common-mode(c-mode,在 vim 又名 normal-mode) 下的移動,原始的 vi 只能在 c-mode 移
動,在 insert-mode 只做文字的輸入, 而不做游標的移動。當然 vim 及 elvis 的方向鍵是不論在那一種
mode 皆可移動自如。

基本的游標移動

h 左,或 Backspace 或方向鍵
j 下,或 Enter 或 +(要 Shift 鍵),或方向鍵
k 上,或 方向鍵或 -(不必 Shift 鍵)
l 右,或 Space 或方向鍵
Ctrl-f 即 PageDown 翻頁。
Crtl-b 即 PageUp 翻頁。


使用 hjkl 鍵的移動是為了使手不必離開打字區(鍵盤中央的部
位),
以加快打字的速度,如果各位不習慣,那就使用方向鍵吧!

Backspace 及 Space 的移動方式是到了行首或行尾時會折行,
但方向鍵或 hl 鍵的移動則在行首或行尾時您繼續按也不會折

行。
轉折換行的功能是 vim 的擴充功能,elvis 無此功能。

jk 及使用方向鍵的上下移動游標會盡量保持在同一欄位。
使用 Enter,+,- 的上下移動,游標會移至上(下)一行的
第一個非空白字元處。

好像有點復雜,各位就暫時使用方向鍵來移動就簡單明白了!
等您愛上了 vim 後再來講究吧。


進階的游標移動

0 是數目字 0 而不是英文字母 o。或是 Hmoe 鍵,移至行首,(含空白字元)。
^ 移至第一個非空白字元,注意,要 Shift 鍵。
$ 移至行尾,或 End 鍵。要 Shift 鍵。


以上兩個按鍵是源自規則表示式(regular expression),
在 regexp 中 ^ 是匹配行首,$ 是匹配行尾。


G 移至檔尾(最後一行的第一個非空白字元處)
gg □至檔首(第一行之第一個非空白字元處)


gg 是 vim 的擴充功能,在 elvis 或原始 vi 中可用 1G 來
移至檔首(是數字 1 不是英文字 l)。

G 之原意是 goto,指移至指定數目之行首,如不指定數目,
則預設是最後一行。


w 移至次一個字(word)字首。當然是指英文單字。
W 同上,但會忽略一些標點符號。
e 移至前一個字字尾。
E 同上,但會忽略一些標點符號。
b 移至前一個字字首。
B 同上,但會忽略一些標點符號。
H 移至螢幕頂第一個非空白字元。
M 移至螢幕中間第一個非空白字元。
L 移至螢幕底第一個非空白字元。


這和 PageDown,PageUp 不一樣,內文內容並未動,
只是游標在動而已。


n| 移至第 n 個字元(欄)處。注意,要用 Shift 鍵。n 是從頭起算的。
:n 移至第 n 行行首。或 nG。

特殊的移動

) 移至下一個句子(sentence)首。
( 移至上一個句子(sentence)首。
} 移至下一個段落(paragraph)首。
{ 移至上一個段落(paragraph)首。


sentence 是以 . ! ? 為區格。paragraph 是以空白行為區格。


% 這是匹配 {},[],() 用的,例如您的游標現在在 { 上只要按 %,就會跑到相匹配的 } 上。寫程
式時滿好用的。

另還有一些 vim 的特殊按鍵,但這得留待最後才來講述,否則各位恐怕會頭昏眼花了。
基本編輯指令
這個單元就開始進入主題了。下編輯指令都是在 commond-mode (c-mode),就是您一進入 vim 時的模式,
只能下指令,不能鍵入文字。如果印象模糊,請瞄一下第一個單元的內容。這個單元說的是基本的指

令, 有些比較特殊的編輯指令,因為太有個性了,所以會獨立成一個單元來說明。

進入 i-mode 的指令

i 在游標所在字元前開始輸入文字(insert)。
a 在游標所在字元後開始輸入文字(append)。
o 在游標所在行下開一新行來輸入文字(open)。
I 在行首開始輸入文字。


此之行首指第一個非空白字元處,要從真正的第一個字元處開始
輸人文字,
可使用 0i 或 gI(vim)。


A 在行尾開始輸入文字。


這個好用,您不必管游標在此行的什麼地方,
只要按 A 就會在行尾等著您輸入文字。


O 在游標所在行上開一新行來輸入文字。
J 將下一行整行接至本行(Joint)。


並無相對的 split 功能,可在 i-mode 下按 Enter 來達成


,當然如果您熟 macro 的話,可自行定義。


使用 J 時,預設會消去本行的 EOL,且上下行接縫間會留下一個
空白字元,
這符合英文習慣,卻對中文會造成困擾,欲不留空白字元,
可使用 gJ(大寫 J)指令,但這是 vim 的擴充功能,elvis 不適
用。

請您隨便找一個檔案來試看看,光看文字說明太抽象了。


刪除指令

x 刪除游標所在處之字元。在 vim 及 elvis 亦可用 Del 鍵。
X 刪除游標前之字元。不可使用 Spaceback 鍵。


vim 可以正確使用以上兩個指令於中文,會刪去一個中文字 elvis
則不行,
一個中文字要刪兩次,即使用 xx。


dd 刪除一整行(delete line)。
dw 刪除一個字(delete word)。不能適用於中文。
dG 刪至檔尾。
d1G 刪至檔首。或 dgg(只能用於 vim)。
D 刪至行尾,或 d$(含游標所在處字元)。
d0 刪至行首,或 d^(不含游標所在處字元)。


請回憶一下 $ 及 ^ 所代表的意義,您就可以理解 d$ 及 d^ 的動
作,
這就是 vi(m) 可愛之處。


取代及還原


r 取代游標所在處之字元。vi(m) 很有個性的,您在 c-mode 按了 r 她就會停在那裡等主人鍵入所要
替代的字元,希望您這個當主人的,不要傻呼呼的也楞在那裡,趕快鍵入您的新字元吧!:-)


vim 中可用於中文字,也就是可以替換一個中文字,elvis 則不
行。
當然您的 vim 是要設在 taiwan 的才行。怎麼樣!有沒有看過如此
有個性的取代方式?ㄚ!r 就是 replace 啦!


R 取代字元至按 Esc 為止。
cc 取代整行內容。或大寫 S 亦可。
cw 替換一個英文字(word),中文不適用。(change)
~ 游標所在處之大小寫互換。當然不能用於中文。別忘了 Shift!
C 取代至行尾,即游標所在處以後的字都會被替換。或 c$。
c0 取代至行首,或 c^。
s 替換一個字元為您所輸入的字串。和 R 不同,R 是覆蓋式的取代,s 則是插入式的取代,您可
親自實驗看看。ㄟ!是小寫的 s。
u 這個太重要了,就是 undo,傳統的 vi 僅支援一次 undo,vim 及 elvis 就不只了,vim 是沒有限制

的。
U 在游標沒離開本行之前,回復所有編輯動作。
Crtl+r 這個也是很重要,就是 redo 鍵。

加上數目字
喔!騷到 vi(m) 的癢處了,這是 vi(m) 一個非常騷包的功能,只此一家別無分號(當然同源的 ed,sed 等
不在此限)。 就是您可以在大部份的指令前加上數目字,代表要處理幾次的意思。以下用實例來說明
比較清楚。

5dd 刪除游標所在處(含)起算以下五行內容。妙吧!
3r 按了 3r 後,您鍵入一個英文字,則三個字元皆會被您所鍵入的英文取代。很抱歉,這不能用
於中文。
5J 將五行合並成一行。
3x 刪除三個字元。抱歉,不能用於中文。
5i A 然後按 Ecs,插入五個 A。中文也可以!
2i system Esc 插入 systemsystem。中文也可以!
5G 游標移至第五行,是從檔首開始起算。
5l 移至右第五個字元處,當然 j 是可以用方向鍵取代的。所有移動指令(參考第二單元)都可以
加上數目字來控制,中文也通喔!elvis 當然是不能用於中文。

其它的指令和數目字結合,就留待各位去發掘吧!最重要的是請您親自操作看看, 使用 vi(m) 常常要動
動腦筋,會有更妙的操作方式。

簡單重排功能


〉〉 整行向右移一個 shiftwidth(預設是 8 個字元,可重設)。
〈〈 整行向左移一個 shiftwidth(預設是 8 個字元,可重設)。


:set shiftwidth? 可得知目前的設定值。:set shiftwidth=4
可馬上重設為 4 個字元。shiftwidth 可簡寫成 sw。ㄟ,別忘了
Shift 鍵!


:ce(nter) 本行文字置中。注意是冒號命令!
:ri(ght) 本行文字靠右。
:le(ft) 本行文字靠左。


所謂置中、靠左右,是參考 textwidth(tw) 的設定。
如果 tw 沒有設定,預設是 80,就是以 80 個字元為總寬度為標准
來置放。
當然您也可以如 sw 一樣馬上重設。


gqip 整段重排。中文會出槌!:-(
gqq 本行重排。


重排的依據也是 textwidth。這裡的重排是指您鍵入文字時沒有按
Enter 鍵,
就一直在 keyin,這樣會形成一個很長的一行(雖然螢幕上會替
您做假性折行),
重排後,則會在每一行最後加入 EOL。gq 重排功能是 vim 才有的
功能。

復制(yank)
yank 是什麼意思?有疑問的請查一下字典吧!就好像是中醫治療中的「拔罐」的意思啦 (是不是叫「拔
罐」?知道的朋友指正一下吧)!反正在 vi(m) 中,她就是復制 copy 的意思。 這在 vi(m) 的思考邏輯裡,
就是「拔」yank 起來,「放」put 上去。其實復制的指令就是 y 一個而已, 為什麼要獨立成一個單元來
說明呢?因為 vi(m) 復制、貼上的功能實在太獨特了, 再配合前面介紹的數目字,及 vi(m) 內部的緩沖
區來使用的話,您會發現, 原來 vi(m) 肚子裡還暗藏著秘密武器。

指令說明

yy 復制游標所在行整行。或大寫一個 Y。
2yy 或 y2y 復制兩行。ㄟ,請舉一反三好不好!:-)
y^ 復制至行首,或 y0。不含游標所在處字元。
y$ 復制至行尾。含游標所在處字元。
yw 復制一個 word。
y2w 復制兩個字。
yG 復制至檔尾。
y1G 復制至檔首。
p 小寫 p 代表貼至游標後(下)。
P 大寫 P 代表貼至游標前(上)。


整行的復制,按 p 或 P 時是插入式的貼在下(上)一行。
非整行的復制則是貼在游標所在處之後(前)。


"ayy 將本行文字復制到 a 緩沖區


a 可為 26 個英文字母中的一個,如果是小寫的話,原先的
內容會被清掉,如果是大寫的話是 append 的作用,會把內
容附加到原先內容之後。

" 是 Enter 鍵隔壁的那一個同上符號(ditto marks)。


"ap 將 a 緩沖區的內容貼上。


緩沖區的術語在 vim 稱為 registers,vim 擴充了相當多的
功能,有興趣深入的朋友請 :h registers。您用 d、c、s、
x、y 等指令改變或刪除的內容都是放在 registers 中的。
例如:您用 dd 刪除的一行,也是可以使用 p 來貼上的。只
要是在緩沖區的內容都可以使用 p 來貼上,不是一定要 y 起
來的內容才能用 p。因此您認為 p 是 paste 也可以,認為是
put 可能較正確。


5"ayy 復制五行內容至 a 緩沖區。
5"Ayy 再復制五行附在 a 內容之後,現在 a 中有十行內容了!


ㄟ!不要我一直用 a 您就認為只有 a 可以用喔。26 個英文

字母都可以的,交叉運用下,您會發覺 vi(m) 肚量不小。

問題來了!忘記誰是誰的時候怎麼辦? :reg(冒號命令)就
會列出所有 registers 的代號及內容。您現在就試著按看看
咦!怎麼還有數目字、特殊符號的緩沖區,原來您剛剛刪除
(復制)的內容就預設放在 " 這個緩沖區,然後依序是
0,1,2,...9。也就是說您按 p 不加什麼的話,是取出 " 緩
沖區的內容的。% 指的是目前編輯的檔案,# 指的是前一次
編輯的檔案。還有其它的呀!因為沒什麼重要,就請
:h registers 吧!registers 有個 "s" 結尾,不要搞錯了,
而且 Tab 的補全鍵 vim 也支援的,也就是說您鍵入 :h regi
再按 Tab 鍵,vim 就會幫您補全,按了 Tab 後發現不是您要
的,那就繼續按,總會出現您要的。:-)

Tab 補全的功能,elvis 也有,但叫出 registers 列表的命令
則沒有,您得自行記憶在您的腦袋瓜子裡。而且 elvis 的補全
能力並沒 vim 強。


天大的指令
. 這是什麼?ㄚ,是英文句點啦!沒錯,就是英文句點。什麼意思?重復前次的編輯動作。 這個指令太
高明了,只要是編輯動作(移動游標不算,冒號命令也不算) 都可以按英文句點來重復,要重復幾次
都可以。

例如:您按了 yy,然後按 p 就會復制、貼上一整行,如果要重復這個動作的話, 就可以按 . ,也可以
把游標移到其它地方後再按。其它 dd,dw,r,cw 等編輯指令都可以這樣來重復。 如果您要重復做某
些編輯動作時,千萬千萬一定要想到有這麼一個英文句點重復指令。ㄚ,拜托啦!您一定要常用這個
指令。

疑難雜症

1.那 mouse 中鍵的剪貼功能還有嗎?當然還有,不管在 console 或 X terminal 中都照用不誤。 當然在
windows 下的話就不能用了,可以用 Shift-Insert 來代替。Ctrl-v 在 vim 中另有作用, 在 windows 下
就不必去麻煩它了。
2.ㄟ,我從.netscape 用 mouse copy 東東過來的時候,常常都搞得天下大亂耶! 要設成 :set paste,預
設是 map 至 F9 鍵的,您要 copy 之前先按一下 F9,copy 完後再按一次 F9 來回復。 這是 vim 的擴
充功能,elvis 沒有。那在 elvis 怎麼辦?只好 :set noai 了。在 GUI 的版本應不會有這種情形。


set 的功能先不必去理它,往後會有一個單元專門討論。


朋友!您睡著了嗎?不要被嚇到了,您只要開個檔案,親自操作一下就能心領神會。 那用 mouse 不是
更方便嗎?不見得,yyp 來復制貼上一整行比較快,還是用 mouse 來拉比較快? 您可以試看看。

尋找/替換
搜尋、替換的功能幾乎是每個編輯器必備的功能,那在 vi(m) 中有沒有特殊的地方呢? 當然有,您忘
了,vi(m) 是個性十足的編輯器。最特殊的地方是和規則表示式 (regular expression,簡稱 regexp) 結合在一
起。簡單的說她是一種 pattern 的表示法, 在執行動作,如尋找或替換,就會依據這個 pattern 去找,所
有符合 pattern 的地方就會執行您所下的動作。 在這個單元裡不討論 regexp,會另立一個單元來探討,
以免搞得頭昏腦脹。目前就暫不使用 regexp, 您要找什麼就直接鍵入什麼就對了。

尋找


/ 在 c-mode 的情形下,按 / 就會在左下角出現一個 /,然後鍵入您要尋找的字串,按個 Enter 就會
開始找。
? 和 / 相同,只是 / 是向前(下)找,? 則是向後(上)找。
n 繼續尋找。
N 繼續尋找(反向)。

更方便的尋找操作(vim 才有)

* 尋找游標所在處之 word(要完全符合)。
# 同上,但 * 是向前(下)找,# 則是向後(上)找。
g* 同 * ,但部份符合即可。
g# 同 # ,但部份符合即可。


n,N 之繼續尋找鍵仍適用。


替換(substitute)
:[range]s/pattern/string/[c,e,g,i]

range 指的是范圍,1,7 指從第一行至第七行,1,$ 指從第一行至最後一行,也就是整篇文章,也可以 %
代表。


還記得嗎? % 是目前編輯的文章,# 是前一次編輯的文章。


pattern 就是要被替換掉的字串,可以用 regexp 來表示。

string 將 pattern 由 string 所取代。

c confirm,每次替換前會詢問。

e 不顯示 error。

g globe,不詢問,整行替換。

i ignore 不分大小寫。


g 大概都是要加的,否則只會替換每一行的第一個符合字串。
可以合起來用,如 cgi,表示不分大小寫,整行替換,替換前
要詢問是否替換。


[實例] :%s/Edwin/Edward/g
這樣整編文章的 Edwin 就會替換成 Edward。

更進階的尋找、替換的例子在說明 regexp 的時候還會再詳述。 目前只知道最基本的用法就可以了!其
實光這樣就非常好用了。:-)

書簽功能

這又是 vi(m) 的一個秘密武器,簡單的說,您可以在文章中的某處做個記號(marks), 然後跑到其它地方

去編輯,在呼叫這個 mark 時又會回到原處。妙吧!

mx x 代表 26 個小寫英文字母,這樣游標所在處就會被 mark。
`x 回到書簽原設定位置。


` 是 backward quote,就是 Tab 鍵上面那一個。


’x 回到書簽設定行行首。


’ 是 forward quote,是 Enter 鍵隔壁那一個。


vim 對於書簽的擴充功能


小寫字母 只作用於單一檔案內。
大寫字母 可作用於編輯中之各檔案間。
數目字 可作用於前次編輯的十個檔案。


數目字的用法比較特殊,’0 是回到前一次編輯檔案中離開
前的最後位置,’1 則是回到前二次編輯檔案的最後位置,
依此類推。您不必使用 m 來標示,vim 會自動記憶。
很玄吧!其實這是 viminfo 的功能,您要認真追究的話,
請 :h viminfo-file-marks。viminfo 關掉,就沒這個功能了!

所謂前次指的是前次啟動的 vim。


:marks 得知目前所有書簽的列表。
叫檔、存檔、緊急回復
ㄟ,是不是在灌水呀!怎麼開個檔也成一個單元?那您就錯了, 在 vi(m) 裡叫檔的花樣可多了,而且又
可以多檔編輯, 各編輯中的檔案還可以互通訊息,這裡面學問可大著呢!vim 就更騷包了, 也學人家
檔案可以加密,雖說是噱頭,但也還滿好用的。

開檔的一些花招

vim + 檔名
這樣開檔後,游標會落在檔案最後一行的行尾,在檔案屁屁後干什麼呢?方便您可以繼續編輯

嘛!
vim +n 檔名
游標會落在第 n 行的行首。
vim +/string 檔名
還記得嗎? / 就是尋找指令,這樣進入檔案後游標就會落在第一個找到的 string 上, 還可以按 n
繼續找 string 喔!哦,string 還可以使用 regexp 來表示喔。

多檔編輯

多檔編輯會有兩種情形,一種是在進入 vim 前所用的參數就是多個檔(這種情形稱為 argument list)。
另一種情形是進入 vim 後另外再開其它的檔(稱為 buffer list)。不過都可以統稱為 buffer。

:n 編輯下一個檔案。
:2n 編輯下二個檔案。
:N 編輯前一個檔案。


注意,這種用法只能用於 argument list 的情形。


:e 檔名 這是在進入 vim 後,在不離開 vim 的情形下再開其它檔案。 只要您要編輯的檔案是在目前
目錄,Tab 補全鍵還是可以使用。
:e# 或 Ctrl-^ 編輯前一個檔案,用於兩檔互相編輯時相當好用。


這種用法不管是 argument list 或 buffer list 檔案間皆可使用。

還記得嗎? # 代表的是前一次編輯的檔案。


:files 或 :buffers 或 :ls 會列出目前 buffer 中的所有檔案。


在 elvis 中可使用 :b 來叫出 buffers。

在 buffers 中,減號 - 表示這個 buffer 並未載入,不過,
不必擔心,載入相當快速的。加號 + 表示這個 buffer
已經修改過了。


:bn buffer next。
:bl buffer last。


以上兩個指令 elvis 不適用。


:b檔名或編號 移至該檔。


在 :ls 中就會出示各檔案的編號,這個編號在未離開 vim 前是不
會變的。
這個指令 elvis 也是可以使用。

當然 :e#編號 也是可以的,這樣的用法則是所有 vi clone 都通用
了。

如果您是使用 vim 的 GUI,那就在功能表上就會有 Buffers 這個選

項,
可以很容易的知道及移動各 buffer 間。


:bd(elete)
buffer 在未離開 vim 前是不會移除的, 可使用這個指令移除。其實移除她干什麼呢?vim 是您在
叫用時才會載入的,因此這些 buffers 並不是像 cache 一般要占記憶體的。
:e! 檔名
這樣也是會開檔,但會放棄目前編輯檔案的改變,否則如果檔案已有變動, vim 預設是不讓您隨
便離開的。:e! 後不接什麼的話,代表捨棄一切修改,重新載入編輯中檔案。
:f 或 Ctrl-g
顯示目前編輯的檔名、是否經過修改及目前游標所在之位置。
:f 檔名
改變編輯中的檔名。(file)
:r 檔名
在游標所在處插入一個檔案內容。(read)
:35 r 檔名
將檔案插入至 35 行之後。
gf
這是 vim 的特殊叫檔法,會叫出游標所在處的 word 為名的檔案,當然,這個檔案要在目前目錄
內,否則會開新檔案。

哦!好像有點給他復雜,主要原因是偶文筆不好啦!不過您何不選個順手的來用就可以了, 選定了,
以後就是使用他,這樣就不會那麼復雜了。:-)

離開

:q 如本文有修改而沒存檔,會警告,且無法離開。(quit)
:q! 捨棄所有修改,強迫離開。
:wq 存檔後離開。縱使檔案未曾修改也是會再存一次檔。
:x 也是存檔後離開,但如果檔案沒有修改,則不會做存檔的動作。
ZZ 和 :x 完全一樣,隨您高興用哪一個。
:w 檔名 另存他檔。不加檔名就是寫入原檔。(write)


:q 及 :q! 是對目前編輯中的檔案作用,如果多檔編輯的情形
並不會離開 vim,這時可下 :qa 或 :qa! 來整個離開 vim。
a 就是 all 的意思。


vim 的加密功能

vim -x [檔名]
這樣進入 vim 後會要求輸入密碼。以後加密過的檔案由 vim 開啟時會自動要求輸入密碼。否則無法開
啟。其它的編輯器當然是無法開啟的。

進入 vim 編輯檔案中,臨時想加密,可用 :X 指令。


小心!vim 一開檔就會有個 .檔名.swp 這個檔,是為了緊急回復用
的,
一般是在您所開檔案的所在目錄,這是個隱藏檔,ls 要有 -a 參數
才看得到,
您加密的功能並沒有作用在這個 swp 檔,因此 root 還是知道您在
寫些什麼關於他的壞話的。:-) 當然啦!山不轉,路轉,路不轉,
人轉,
您也是可以把 swap 的功能關掉的 :set noswf 就行了!但如果您編
輯的是
大檔案,則不建議您把 swap 關掉,這樣會很吃記憶體的。

elvis 的話,其暫存檔是統一集中存放在 /var/tmp/*.ses,
權限是檔案所有者始能讀寫。vim 的早期版本,其 *.swp
檔是依原檔案的權限來設定的,最近的版本則從善如流,
已經改成檔案所有人始能讀寫,就是 -rw------- 啦!


緊急回復
vim -r 檔名,或進入 vim 後,下 :recover 檔名,來回復。

Copyright © Linux教程網 All Rights Reserved