Linux基礎(chǔ)命令介紹四:文本編輯vim
本文介紹vim(版本7.4)的一般用法。
vim是功能強(qiáng)大的文本編輯器,是vi的增強(qiáng)版。
- vim [options] [file ..]
使用vim編輯一個(gè)文件的最常用命令就是:
- vim file
其中file可以是一個(gè)新文件,也可以是原有文件。這樣的命令執(zhí)行后將打開(kāi)編輯器,顯示文件file的內(nèi)容。如圖所示:
如果是一個(gè)新文件,底部左邊會(huì)顯示"file" [新文件]的字樣,右邊顯示0,0-1表示當(dāng)前光標(biāo)所在行數(shù)和字符數(shù)。如果打開(kāi)的是一個(gè)老文件,底部左邊顯示"file" 3L, 66C字樣,表示文件名,當(dāng)前光標(biāo)所處行號(hào),文件總字節(jié)數(shù)。文件中沒(méi)有字符的地方會(huì)以字符~開(kāi)頭。
現(xiàn)在還不能進(jìn)行編輯,vim編輯文件有幾種模式,當(dāng)前所處模式是普通模式,可以移動(dòng)光標(biāo)、執(zhí)行復(fù)制粘貼等命令;另外還有兩種常用模式:插入模式和底行模式。
開(kāi)始進(jìn)入的一般都是普通模式,按如下鍵將進(jìn)入插入模式:
- a 在光標(biāo)所在位置下一個(gè)字符開(kāi)始輸入
- A 在光標(biāo)所在行尾開(kāi)始輸入
- i 在光標(biāo)所在位置開(kāi)始輸入
- I 在光標(biāo)所在行首開(kāi)始輸入
- o 在光標(biāo)所在行下新增一行,并在新增行行首開(kāi)始輸入
- O 在光標(biāo)所在行上新增一行,并在新增行行首開(kāi)始輸入
進(jìn)入插入模式后,底部會(huì)出現(xiàn)-- 插入 --字樣;這時(shí)就可以在光標(biāo)位置進(jìn)行輸入了。從插入模式退回到普通模式按ESC鍵。
在普通模式按如下鍵將進(jìn)入底行模式:
- : 執(zhí)行命令
- / 正向搜索
- ? 反向搜索
從底行模式退回到普通模式需按兩次ESC鍵
底行模式執(zhí)行:q(quit)表示退出編輯器,如果對(duì)文件內(nèi)容進(jìn)行過(guò)更改,需要執(zhí)行:wq(write quit)來(lái)保存退出;如果不保存退出則需要執(zhí)行:q!強(qiáng)制退出;強(qiáng)制保存退出為:wq!。
下面列出一些在普通模式下可以執(zhí)行的命令及它們的作用:
- 文本修改:
- . 重復(fù)上一個(gè)命令
- x 刪除光標(biāo)位置的字符
- d 從光標(biāo)處開(kāi)始剪切
- dd 剪切光標(biāo)所在位置的整行(保存在臨時(shí)緩沖區(qū))
- ndd n為數(shù)字,表示從當(dāng)前行開(kāi)始,從上到下剪切n行
- p 將緩沖區(qū)中的內(nèi)容放到當(dāng)前行之下
- np n是數(shù)字,相當(dāng)于執(zhí)行n次p命令
- P 將緩沖區(qū)中的內(nèi)容放到當(dāng)前行之上
- y 從光標(biāo)處開(kāi)始復(fù)制
- yy 復(fù)制當(dāng)前行(保存在臨時(shí)緩沖區(qū))
- nyy n為數(shù)字,表示從當(dāng)前行開(kāi)始,從上到下復(fù)制n行
- r 替換光標(biāo)所在位置的一個(gè)字符
- R 從光標(biāo)位置開(kāi)始替換,并進(jìn)入文本輸入模式(ESC退出)
- u 撤銷(xiāo)上一次操作
- ZZ 保存退出
- 移動(dòng)光標(biāo):
- h或左箭頭鍵 光標(biāo)向左移動(dòng)一格
- l或右箭頭鍵 光標(biāo)向右移動(dòng)一格
- j或下箭頭鍵 光標(biāo)向下移動(dòng)一格
- k或上箭頭鍵 光標(biāo)向上移動(dòng)一格
- 0 光標(biāo)移動(dòng)到當(dāng)前行開(kāi)頭
- ^ 光標(biāo)移動(dòng)到當(dāng)前行非空白字符(如空格、tab鍵等)的開(kāi)頭
- $ 光標(biāo)移動(dòng)到當(dāng)前行結(jié)尾
- g_ 光標(biāo)移動(dòng)到當(dāng)前行非空白字符的結(jié)尾
- w 光標(biāo)移動(dòng)到下一個(gè)單詞的開(kāi)頭
- e 光標(biāo)移動(dòng)到下一個(gè)單詞的結(jié)尾
- * 匹配光標(biāo)所在單詞,移動(dòng)到下一個(gè)相同的單詞
- # 匹配光標(biāo)所在單詞,移動(dòng)到上一個(gè)相同的單詞
- f{ 光標(biāo)移動(dòng)到當(dāng)前行的下一個(gè)字符{處,{可以換成其他字符
- F} 光標(biāo)移動(dòng)到當(dāng)前行的上一個(gè)字符}處
- t, 光標(biāo)移動(dòng)到當(dāng)前行的下一個(gè)逗號(hào)之前一個(gè)字符處
- T, 光標(biāo)移動(dòng)到當(dāng)前行的上一個(gè)逗號(hào)之后一個(gè)字符處
- % 移動(dòng)到成對(duì)括號(hào)的另一半括號(hào)處,包括() {} [].需要先將光標(biāo)移動(dòng)到括號(hào)上。
- gg 光標(biāo)移動(dòng)到文件***行行首
- G 光標(biāo)移動(dòng)到文件***一行行首
- 回車(chē)鍵 光標(biāo)移動(dòng)到下一行行首
這里只列出一部分,初學(xué)者也許會(huì)覺(jué)得太多,記不住。其實(shí)只要記住其中幾個(gè),就完全可以使用了;其他的作用大多是使你的操作更簡(jiǎn)便快捷。
vim中的各種命令,大多可以組合使用:
比如要?jiǎng)h除光標(biāo)當(dāng)前所在位置一直到行尾,可以執(zhí)行d$;
比如要在當(dāng)前位置插入50個(gè)‘word’,只需執(zhí)行50iword ESC按完ESC鍵之后這50個(gè)單詞就被插入了;
比如要粘貼被復(fù)制的內(nèi)容,但希望粘貼5次,則執(zhí)行5p;
比如要再次執(zhí)行上一次命令5次,則執(zhí)行5.;
熟練使用這些命令將極大提高編寫(xiě)文件的速度。
在插入模式下(普通模式按a、i、o等),輸入一個(gè)單詞的開(kāi)頭,然后按CTRL-P或CTRL-N就會(huì)自動(dòng)補(bǔ)齊。
底行模式共三個(gè)開(kāi)始字符(:、/、?),其中/和?用來(lái)匹配模式搜索:
如搜索文件內(nèi)字符串centos:
- /centos
輸入這個(gè)字符串之后按回車(chē),vim就會(huì)將所有匹配的字符串高亮顯示,按下n鍵,光標(biāo)就會(huì)跳到下一個(gè)匹配字符串處,按N鍵,光標(biāo)就會(huì)跳到上一個(gè)匹配處。(想想man查詢(xún))
使用?和/的作用相同,不過(guò)是方向相反。
:可以執(zhí)行許多命令,如前面介紹過(guò)的保存退出命令:wq。下面介紹部分底行模式命令:
- :set nu 顯示行號(hào)
- :set nonu 隱藏行號(hào)
- :r file 讀取文件file內(nèi)容并寫(xiě)入當(dāng)前編輯的文件中,內(nèi)容從光標(biāo)當(dāng)前位置下一行開(kāi)始插入。
- :w file 將當(dāng)前編輯的內(nèi)容寫(xiě)入一個(gè)新文件file中。
- :s /pattern/string/ 將匹配pattern的字符串替換成string
- :x 作用和:wq相同,保存并退出。
- :! command 暫時(shí)離開(kāi)vim并執(zhí)行shell命令command。
- :help 查看幫助
- :.= 顯示當(dāng)前行號(hào)
- := 顯示總行數(shù)
- :n 移動(dòng)光標(biāo)到第n行行首
這些命令也可以組合如執(zhí)行shell命令并將結(jié)果寫(xiě)入當(dāng)前行的下一行:
- :r!ls -l
還能組合其他模式下的命令如替換當(dāng)前行所有匹配模式的字符串:
- :s/pattern/string/g # g表示全局
如替換本文件中所有匹配模式的字符串:
- :%s/pattern/string/g # %表示所有行
如替換指定行的匹配字符串:
- :n,ms/pattern/string/g
這里n和m都是數(shù)字,代表行號(hào)??梢杂命c(diǎn)號(hào).代表當(dāng)前行
如刪除當(dāng)前行到第五行的內(nèi)容:
- :.,5d
當(dāng)當(dāng)前行處于第五行以下時(shí),會(huì)有反向刪除的提示。
使用/pattern和:s/pattern/string時(shí),pattern是一個(gè)正則表達(dá)式,用來(lái)匹配一個(gè)字符串的模式。
正則表達(dá)式和之前介紹的通配符(基礎(chǔ)命令介紹二)有一些相似的地方,但要注意區(qū)分兩者的不同。
通配符主要是用于對(duì)文件名的匹配,正則表達(dá)式不僅可以用于匹配文件名,事實(shí)上,它可以進(jìn)行任何字符串的匹配。它要比通配符更通用,大多數(shù)編程語(yǔ)言和一些工具中(如vim、grep、awk、sed)都有對(duì)正則表達(dá)式的直接支持。
下面介紹一部分將要用到的正則表達(dá)式的概念和用法:
- 匹配位置:
- ^ 表示行開(kāi)頭
- $ 表示行結(jié)尾
- < 表示單詞開(kāi)頭
- > 表示單詞結(jié)尾
- 匹配字符:
- . 表示匹配任意單個(gè)字符(相當(dāng)于通配符中的?)
- [...] 表示匹配括號(hào)內(nèi)任意單個(gè)字符
- [^...] 表示匹配任意一個(gè)非列出字符 #參照通配符描述
- \a 匹配英文字符,等同于[a-zA-Z]或[[:alpha:]]。
- \A 匹配非英文字符,等同于[^a-zA-Z]。
- \d 匹配數(shù)字,等同于[0-9]或[[:digit:]]。
- \D 匹配非數(shù)字,等同于[^0-9]。
- \x 匹配十六進(jìn)制數(shù)字,等同于[0-9A-Fa-f]或[[:xdigit:]]。
- \X 匹配非十六進(jìn)制數(shù)字,等同于[^0-9A-Fa-f]。
- \w 匹配單詞,等同于[0-9A-Za-z_]。
- \W 匹配非單詞,等同于[^0-9A-Za-z_]。
- \t 匹配TAB字符。
- \s 匹配空白字符,等同于[ \t]或[[:blank:]]。
- \S 匹配非空白字符,等同于[^ \t]。
- \u 匹配大寫(xiě)字母,等同于[A-Z]或[[:upper:]]。
- \U 匹配非大寫(xiě)字母。
- \n 匹配換行
- \r 匹配回車(chē)
- (...) 匹配并捕獲,用\1 \2 \3 ...來(lái)引用被捕獲的字符串。
- | 表示邏輯或
- 匹配數(shù)量:
- * 表示匹配前一個(gè)字符零到任意多次,相當(dāng)于{0,}。
- + 表示匹配前一個(gè)字符一到任意多次,相當(dāng)于{1,}。
- ? 表示匹配前一個(gè)字符零到一次,相當(dāng)于{0,1}。#注意和通配符?的區(qū)別
- {n,m} 表示匹配前一個(gè)字符n到m次。
在使用正則表達(dá)式時(shí),有時(shí)需要在特殊字符之前加上轉(zhuǎn)義字符"\"來(lái)使特殊字符表示它的字面意思而不是它的特殊意義,在特定的工具中使用正則時(shí),也需要這樣做來(lái)避免特殊字符被工具本身解釋。
vim在使用如下正則表達(dá)式時(shí)需要將特殊字符轉(zhuǎn)義:\<...\>、\{n,m}、\(...\)、\?、\+、\|下面結(jié)合正則舉例說(shuō)明vim中模式匹配及部分命令用法
匹配字符串world并使光標(biāo)停留在匹配行后第三行行首:
- /world/+3
將第三行到第八行行首添加注釋符號(hào)//:
- :3,8s/^/\/\//
注意這里的行首符^和轉(zhuǎn)義符'\'的用法
如:
- :%g/^\sxyz/normal dd
此命令作用是全局匹配以空白后接xyz開(kāi)頭的行,并執(zhí)行普通模式下的命令dd
如匹配6個(gè)以上的小寫(xiě)字母:
- /\a\{6,}
如交換冒號(hào):兩側(cè)的字符串:
- :s/\(.*\):\(.*\)/\2:\1/ #注意這里是如何引用之前匹配的分組的
如將所有tag、tog和tug分別改為hat、hot和hut
- :%s/t\([aou]\)g/h\1t/g
如匹配hello或world兩個(gè)單詞:
- /\<hello\>\|\<world\>
這里只列出部分vim用到的正則表達(dá)式,關(guān)于正則的更多內(nèi)容,以后的文章中還會(huì)有描述和舉例。
vim編輯器是很強(qiáng)大的,這里只描述了部分初級(jí)使用方法。vim還能使用視圖模式,編輯多文本,設(shè)置鍵盤(pán)映射,多剪貼板,錄制宏,使用插件等等。完全可以用vim作為IDE來(lái)使用。但相對(duì)來(lái)說(shuō),vim的學(xué)習(xí)曲線(xiàn)比較陡峭,不同的應(yīng)用場(chǎng)景,需要記憶的命令和方法數(shù)量也是完全不同的。建議在學(xué)習(xí)中,每次只熟悉幾個(gè)命令,一段時(shí)間后,就能流暢快捷的編輯文本了。