VI/VIM的基礎(chǔ)教程和常用命令超細(xì)致詳解(自己整理的,不算全但很實(shí)用)

換了工作環(huán)境,沒有了臺式機(jī),也買了新的便攜超薄本作為主要的工作電腦,開始逐漸嘗試不用鼠標(biāo),嘗試習(xí)慣用非全尺寸鍵盤,最重要的,開始嘗試入坑VIM。
提醒:文章篇幅可能較長,如果是急需查找某具體命令或使用方法的,直接通過目錄鏈接或者ctrl+f搜索頁面內(nèi)關(guān)鍵字查找,不耽誤網(wǎng)友時(shí)間,如果有閑情逸致學(xué)習(xí)參考,深感榮幸。

本文的主要內(nèi)容來自于自己通過菜鳥教程Linux vi/vim學(xué)習(xí)并且實(shí)踐心得整理而來,既給自己當(dāng)做筆記,也給網(wǎng)友們一些參考。

基礎(chǔ)命令——(適合臨時(shí)用戶)

vim編輯器有三種模式,普通模式(簡單命令模式)、輸入模式、命令模式(底行命令輸入模式)
基礎(chǔ)篇里將只就最簡單的文檔編輯和操作做一些介紹,供偶爾或者迫不得已臨時(shí)使用vim的用戶體驗(yàn)(例如新裝的系統(tǒng),gedit不能用,臨時(shí)需要用系統(tǒng)自帶的vi或者vim來查看或修改文檔內(nèi)容如配置文件等)

普通模式
vim進(jìn)入時(shí)的默認(rèn)模式,這個(gè)模式下,鍵盤的按鍵都是簡單的命令,類似快捷鍵,最基礎(chǔ)的光標(biāo)移動(dòng)命令:h, j, k, l分別是將光標(biāo)進(jìn)行前、下、上、后移動(dòng)。(高一點(diǎn)版本的vim好像可以用上下左右的按鍵來移動(dòng)了,但是有些vi或者低版本的vim是不行的,這個(gè)具體沒有研究)

輸入模式
在普通模式下按i進(jìn)入輸入模式,就可以在光標(biāo)所在前一格開始進(jìn)行字符輸入了,這個(gè)時(shí)候就跟一般的編輯器如記事本一樣,輸入、退格、回車都是OK的,也可以用上下左右移動(dòng)光標(biāo)(貌似有的低版本上下左右鍵不能用的話,回到普通模式用h,j,k,l也行)

除了按鍵i以外,普通模式進(jìn)入輸入模式的命令還有幾個(gè)常用的:
i:進(jìn)入輸入模式并在當(dāng)前光標(biāo)所在前一格開始輸入
a:進(jìn)入輸入模式并在當(dāng)前光標(biāo)所在后一格開始輸入
o:進(jìn)入輸入模式并在當(dāng)前光標(biāo)所在行的下一行新建一行開始輸入

在輸入模式中,按下ESC按鍵即可退出輸入模式,進(jìn)入普通模式

注意:以上(包括本文后面)關(guān)于字母按鍵都是區(qū)分大小寫的,小寫狀態(tài)和大寫狀態(tài)下同一個(gè)按鍵可能功能是不一樣的。另外,普通模式下輸入命令是看不到自己所輸入的命令的(即使是后面可能說到的組合命令。

命令模式(底行命令)
在普通模式下,按下:按鍵(冒號),即可進(jìn)入命令模式,這個(gè)時(shí)候,在屏幕的最下面(類似狀態(tài)欄的地方)會顯示一個(gè)冒號,然后==輸入的內(nèi)容會顯示在冒號后面,輸入回車以后執(zhí)行命令==。

命令模式下常用的基礎(chǔ)命令有:
:q——退出程序,這時(shí)候,如果文檔有改動(dòng),是會提示錯(cuò)誤的
:wq——保存當(dāng)前文檔所做的修改并退出
:w——保存當(dāng)前文檔,但不退出(如果文檔不存在或者需要另存為新的文檔,需要在命令后面加上文件名,如:w aFile,以創(chuàng)建新的文件)
:q!——退出程序但不保存修改

*如果只是比較粗淺的或者臨時(shí)使用一下vi/vim,那么到這里,基礎(chǔ)篇的內(nèi)容已經(jīng)足夠使用了,查看、編輯一個(gè)簡單的文檔是沒什么問題了,寫代碼也可以,但是顯然離高效還差很遠(yuǎn)。

進(jìn)階篇常用操作

首先說明一下,要想高效使用vim或者說通過vim來提高自己編碼或者文檔編寫的效率,跟熟悉一門新的編程語言類似,是需要一定程度的堅(jiān)持訓(xùn)練的,不是學(xué)習(xí)和記憶一些指令或者快捷鍵就可以的,而且眾所周知,vi/vim的學(xué)習(xí)曲線是比較陡峭的。寫這篇文章的主要目的,第一是通過寫文章來加深自己對vim命令和一些使用方法的記憶,第二是方便自己使用過程中查找一些常見用法(至少我覺得當(dāng)我需要的時(shí)候,通過自己的博客文章來找,比我上度娘和谷歌搜索要高效),第三才是提供各位網(wǎng)友參考(畢竟網(wǎng)上詳細(xì)教程一大把,而資深級大佬程序員也不需要看我這個(gè))

個(gè)人覺得這個(gè)挺重要,因?yàn)楹芏嗝疃夹枰玫叫刑枺偛荒苋?shù)吧。
:set nu:顯示行號(注意前面輸入冒號進(jìn)入底行命令模式)
:set nonu:不顯示行號

快速定位光標(biāo)

除了h,j,k,l四個(gè)基礎(chǔ)的命令以外,還有很多可以快速定位光標(biāo)位置的方法:

數(shù)字控制移動(dòng)多次光標(biāo)(光標(biāo)移動(dòng)多行、多字符)
通過[數(shù)字]+[移動(dòng)光標(biāo)命令]的方式進(jìn)行移動(dòng),例子如下:

5j #向下移動(dòng)5行
10h #向左移動(dòng)10個(gè)字符,到行首會停止
7k #向上移動(dòng)7行
6l #向右移動(dòng)6個(gè)字符,到行末會停止不會換行

ps:注意在普通模式下,輸入的命令并不會顯示,所以如果使用組合按鍵的中途如果中斷了又不記得了,最好是按esc按鍵重置一下,再重新操作,避免誤操作執(zhí)行了別的命令

大范圍移動(dòng)光標(biāo)
快捷鍵Ctrl f 『向下』移動(dòng)一頁,相當(dāng)于 [Page Down]按鍵 (常用)
快捷鍵Ctrl b 『向上』移動(dòng)一頁,相當(dāng)于 [Page Up] 按鍵 (常用)
快捷鍵Ctrl d 『向下』移動(dòng)半頁
快捷鍵Ctrl u 『向上』移動(dòng)半頁

特殊位置快速定位光標(biāo)
+鍵:光標(biāo)移動(dòng)到下一行首個(gè)非空格字符處(個(gè)人覺得這個(gè)描述比菜鳥教程以及官網(wǎng)的描述更好懂一點(diǎn),這個(gè)在編程修改代碼下一行有縮進(jìn)的時(shí)候很實(shí)用)
==(注意+=是一個(gè)鍵,這里說+鍵是指住shift同時(shí)按+/=鍵,即和輸入+一樣,后面的說明中同理,大小寫和符號所對應(yīng)的命令都是該按shift就要按shift)==
-鍵:對應(yīng)+鍵,光標(biāo)移動(dòng)到上一行首個(gè)非空格字符處(注意,減號是不需要按shift的,按住啊shift是破折號)
0鍵(數(shù)字零):光標(biāo)移動(dòng)到當(dāng)前行首個(gè)字符(包含空格,即如果前面有很多空格,會移動(dòng)到第一個(gè)空格),注意,vim里縮進(jìn)符號(即輸入的時(shí)候鍵入tab進(jìn)行縮進(jìn))與空格是不同的,這個(gè)命令不包括縮進(jìn)符號,舉個(gè)例子,有一行開始是一個(gè)縮進(jìn)符然后接著三個(gè)空格,再后面才是字母或者數(shù)字,那么當(dāng)光標(biāo)在這一行的時(shí)候,按0鍵,光標(biāo)會移動(dòng)到縮進(jìn)符的后面第一個(gè)空格處。
^:光標(biāo)移動(dòng)到當(dāng)前行的軟行首(即首個(gè)非空格字符處)
$鍵(即shift+4,后面就不這樣說明了,大家應(yīng)該都明白了):移動(dòng)光標(biāo)到當(dāng)前行的最后一個(gè)字符處,與0對應(yīng)。
H:光標(biāo)移動(dòng)到當(dāng)前屏幕(注意不是當(dāng)前文檔,只是一個(gè)屏幕的范圍)的第一行第一個(gè)字符處。
M:光標(biāo)移動(dòng)到當(dāng)前屏幕中間那一行的第一個(gè)非空格字符處。
L:光標(biāo)移動(dòng)到當(dāng)前屏幕最下面一行的第一個(gè)非空格字符處。
G:光標(biāo)移動(dòng)到整個(gè)文檔的最后一行第一個(gè)非空格字符處。
數(shù)字G:移動(dòng)到文檔中對應(yīng)數(shù)字行數(shù)的第一個(gè)非空格字符處。注意這里的G仍然是大寫。
gg:光標(biāo)移動(dòng)到文檔的第一行第一個(gè)非空格字符處,相當(dāng)于1G
數(shù)字回車:光標(biāo)移動(dòng)到當(dāng)前位置向下n(所輸入的數(shù)字)行的第一個(gè)非空格字符,注意這個(gè)指令和上面提到的數(shù)字控制光標(biāo)移動(dòng)方法中的數(shù)字j的區(qū)別,數(shù)字j只是將光標(biāo)下移,相當(dāng)于多次按j,而數(shù)字回車是向下移動(dòng)若干行并移動(dòng)到那一行第一個(gè)非空格字符。

根據(jù)語義語法來移動(dòng)定位光標(biāo)
在vi/vim中,編輯器是知道一些簡單語義概念的,如==單詞==(字符串前后都有空格),==句子==(句號、感嘆號、問號這樣一些表示完整一句話結(jié)束的,或者是一行空行,都會被視作句子之間的分隔符)。知道了這個(gè)概念,就可以用下面的一些命令來控制光標(biāo)位置了。
w:光標(biāo)移到下一個(gè)單詞的首字符。
b:光標(biāo)移動(dòng)到上一個(gè)單詞的首字符。
e:光標(biāo)移動(dòng)到單詞的詞尾,如果已經(jīng)在單詞的詞尾,則移動(dòng)到下一個(gè)單詞的詞尾。
(:光標(biāo)移動(dòng)到當(dāng)前句的句首,如果已經(jīng)在句首,就移動(dòng)到上一句的句首。
):光標(biāo)移動(dòng)到下一句的句尾。
%:括號匹配,如果當(dāng)前光標(biāo)在括號處,按下%鍵則光標(biāo)會移動(dòng)到與之配對的另一個(gè)括號處,如果當(dāng)前光標(biāo)不在括號處,則不生效。

進(jìn)入輸入模式

前面基礎(chǔ)篇說的i,a,o是最基本的和最常用的三種,這里列舉出所有會進(jìn)入輸入模式的指令。
說明:輸入模式有插入模式和替換模式兩種,在這兩種模式下,VIM屏幕的左下方(即狀態(tài)欄)會分別顯示【INSERT】和【REPLACE】字樣,此時(shí),鍵盤按鍵會在文檔中輸入字符,按esc鍵則退出輸入模式回到普通模式。

i:從光標(biāo)所在字符前開始進(jìn)入插入模式
I:從光標(biāo)所在行的第一個(gè)非空格字符之前開始進(jìn)入插入模式
a:從當(dāng)前光標(biāo)所在字符的后面開始進(jìn)入插入模式(終端中普通模式和輸入模式的光標(biāo)樣式是一樣的,所以執(zhí)行a以后會看到光標(biāo)后移一個(gè)字符的現(xiàn)象)
A:從光標(biāo)所在行的最后一個(gè)字符之后開始進(jìn)入插入模式
o(小寫字母):在光標(biāo)所在行下插入一行,并從新插入行的行首開始進(jìn)入插入模式
O(大寫字母):在光標(biāo)所在行之上插入新行,并從新插入行的行首開始進(jìn)入插入模式
s(小寫字母):刪除當(dāng)前光標(biāo)位置的字符,并在當(dāng)前位置開始進(jìn)入插入模式
S(大寫字母):刪除光標(biāo)所在當(dāng)前行所有字符,并在該行行首開始進(jìn)入插入模式
R:從光標(biāo)所在位置字符開始進(jìn)入==替換模式==
c(小寫字母):刪除字符并進(jìn)入插入模式,這個(gè)命令需要光標(biāo)移動(dòng)指令一起使用,例如:

cj #刪除光標(biāo)當(dāng)前行和下一行(刪掉兩行)并在當(dāng)前位置建立新行,從行首開始進(jìn)入插入模式
ch #刪除光標(biāo)當(dāng)前位置前一個(gè)字符并從被刪位置開始進(jìn)入插入模式
cl #刪除光標(biāo)當(dāng)前位置所在字符并從被刪位置開始進(jìn)入插入模式
cG #刪除光標(biāo)從當(dāng)前行(整行)到文檔末尾所有行的字符并進(jìn)入插入模式
c3j #刪除光標(biāo)所在行以及向下3行的所有內(nèi)容,并進(jìn)入插入模式
3cj #同c3j,但不建議這樣用
c28G #刪除光標(biāo)當(dāng)前行到文檔第28行(包含當(dāng)前行和第28行)的所有內(nèi)容,并進(jìn)入插入模式

C(大寫字母):刪除光標(biāo)當(dāng)前所在位置字符到行末的所有字符并在當(dāng)前位置進(jìn)入插入模式(注意,光標(biāo)所在位置字符也會被刪除),相當(dāng)于用上述小寫c的指令和$的組合c$的效果。

搜索

/:向光標(biāo)之后搜索一個(gè)字符串,輸入/之后,VIM的左下方(即狀態(tài)欄會有顯示,顯示"/“字符,之后可以在后面輸入想搜索的字符串,然后回車執(zhí)行搜索命令。
?:向光標(biāo)之前搜索一個(gè)字符串,與上述/對應(yīng),用法一樣。
注:搜索到字符串后光標(biāo)會定位到根據(jù)搜索方向搜索到的第一個(gè)字符串的首個(gè)字符
n:根據(jù)此命令之前執(zhí)行過的搜索指令/?,重復(fù)前一個(gè)搜索動(dòng)作(搜索方向相同,搜索內(nèi)容相同),例如之前執(zhí)行了/abc進(jìn)行向后搜索字符串"abc"后,再按n,就相當(dāng)于再執(zhí)行一遍/abc,注意,這里即使搜索后執(zhí)行i之類的插入命令進(jìn)行編輯操作之后再返回普通模式,按n仍然可以有效繼續(xù)重復(fù)之前/abc的指令,除非又進(jìn)行了別的搜索指令。
N:反方向重復(fù)前一個(gè)搜索動(dòng)作,與n對應(yīng)的,也是根據(jù)在這個(gè)命令之前執(zhí)行的搜索指令來確定搜索方向和搜索內(nèi)容(搜索方向相反,搜索內(nèi)容相同)。

搜索與替換

r:替換光標(biāo)當(dāng)前位置所處的字符,例如ra即將光標(biāo)當(dāng)前位置的字符替換為字符”a“。這個(gè)命令也可以和數(shù)字組合,例如3rc是將當(dāng)前位置向后3個(gè)字符(包括當(dāng)前位置字符)替換為字符“c”。

搜索并將搜索內(nèi)容替換
這個(gè)恐怕是最常用的命令之一了,需要輸入:(冒號)進(jìn)入底行命令模式完成。語法如下:
:n1,n2s/word1/word2n1n2是數(shù)值,表示從n1行到n2行,s是替換命令,word1表示查找的內(nèi)容,word2表示準(zhǔn)備替換word1的內(nèi)容,該命令執(zhí)行結(jié)果是將n1行到n2行(包含n1,n2行)所有行中每一行的第一次出現(xiàn)的word1替換為word2,==注意每一行只替換一個(gè),有多個(gè)word1出現(xiàn)的時(shí)候只替換第一個(gè),如果該行沒有,則該行不執(zhí)行==。
:n1,n2s/word1/word2/g:與上述命令的差異是后面多了一個(gè)/g,意思是全局執(zhí)行,結(jié)果是將n1行到n2行所有的word1替換為word2。

特別的,經(jīng)常需要在整個(gè)文檔中查找并替換,用上面的行號未免有些麻煩,可以用下列命令執(zhí)行在整個(gè)文檔中執(zhí)行搜索和替換:
:1,$s/word1/word2/g
或者
:%s/word1/word2/g
當(dāng)然,還可以在以上命令的最后加上c(即confirm),使vim在執(zhí)行替換操作前提示用戶確認(rèn),如:
:%s/word1/word2/gc

刪除

機(jī)械的刪除當(dāng)然可以通過上面進(jìn)入輸入模式(或稱編輯模式)來進(jìn)行刪除,但是由于鼠標(biāo)的棄用以及vim中沒有選中操作,在編輯模式中要進(jìn)行大范圍刪除和修改是十分繁瑣的,也“顯得不高級“。
以下介紹的刪除方式是在普通模式下進(jìn)行,操作后并不會進(jìn)入輸入模式。
x(小寫):刪除光標(biāo)所在位置處的字符,光標(biāo)位置不動(dòng),類似寫字板里用del
X(大寫):刪除光標(biāo)所在位置處前一個(gè)字符,光標(biāo)前移,類似寫字板中用退格鍵
注:上面這兩個(gè)命令也可以和數(shù)值組合使用,即在命令之前先輸入數(shù)字,與上面有些命令類似,可以刪除光標(biāo)前或者后若干個(gè)字符。
dd:刪除光標(biāo)所在行,這個(gè)命令之前也可以加數(shù)值,刪除光標(biāo)所在向下若干行(包含當(dāng)前所在行)
d1G:刪除光標(biāo)所在行到文檔第一行的所有內(nèi)容(包括當(dāng)前行)
dG:刪除光標(biāo)所在行到文檔最后一行的所有內(nèi)容(包括當(dāng)前行)
d$:刪除光標(biāo)所在處到行末的所有字符(包括當(dāng)前處)
d0:刪除光標(biāo)所在處到行首的所有字符(不包括光標(biāo)當(dāng)前字符)

復(fù)制與粘貼

復(fù)制與粘貼也是一個(gè)需要常用的功能。
Y或者yy:復(fù)制光標(biāo)所在當(dāng)前行整行內(nèi)容
[n]yy[n]表示數(shù)值,表示復(fù)制光標(biāo)當(dāng)前行向下n行的內(nèi)容(包括當(dāng)前行)
y1G:復(fù)制光標(biāo)所在行到文檔第一行的內(nèi)容(包括當(dāng)前行)
yG:復(fù)制光標(biāo)所在行到文檔最后一行的所有內(nèi)容(包括當(dāng)前行)
y0:復(fù)制光標(biāo)所在處字符到行首的所有字符(包括前面的空格,不包括光標(biāo)當(dāng)前所在處字符)
y$:復(fù)制光標(biāo)所在處字符到行末的所有字符(包括光標(biāo)當(dāng)前處所在字符)
ps:可以看到上面幾個(gè)命令對光標(biāo)控制與前一節(jié)刪除命令用法一致

p(小寫):在光標(biāo)所在處字符之后粘貼插入復(fù)制的內(nèi)容,如果復(fù)制的時(shí)候是復(fù)制一整行或者多行數(shù)據(jù),則是在光標(biāo)所在行的下一行粘貼。粘貼完成后光標(biāo)移動(dòng)到原位置下一行的行首,也就是粘貼內(nèi)容的首行行首。
P(大寫):在黃標(biāo)所在處字符之前粘貼插入復(fù)制的內(nèi)容,如果復(fù)制的時(shí)候是復(fù)制一整行或者多行數(shù)據(jù),則是在光標(biāo)所在行的上一行粘貼插入,完成后光標(biāo)移動(dòng)到粘貼內(nèi)容的首行行首。

其他常用操作

J(大寫):將光標(biāo)所在行下一行合并到該行,中間有空格間隔,光標(biāo)移動(dòng)到該空格處,要想達(dá)到在寫字板中”[end]+[del]“的效果(即光標(biāo)移動(dòng)到行末,然后del使下一行提到該行),可以用Jx組合命令。
u(小寫):撤銷上一次所做的操作。多次使用 u 命令會一步一步依次撤銷之前做過的操作(在一次切換到文本輸入模式中輸入的所有文本算一次操作)。
U(大寫):一次性撤銷自上次移動(dòng)到當(dāng)前行以來做過的所有操作,再使用一次 U 命令則撤銷之前的 U 命令所做的操作,恢復(fù)被撤銷的內(nèi)容。所以U命令是不能一直撤銷的,相當(dāng)于只能撤銷一步,再使用就是恢復(fù)了。
[ctrl]r:按住ctrl鍵和r,類似快捷鍵的用法,是恢復(fù)操作,與命令u(小寫)對應(yīng),可以在多次使用u命令撤銷多步后,用該命令多次恢復(fù)至最新。
.(小數(shù)點(diǎn)):重復(fù)執(zhí)行上一次的命令,注意和恢復(fù)不一樣。例如重復(fù)粘貼,重復(fù)刪除。

文檔讀寫

文檔的操作都是在底行命令模式中進(jìn)行的,主要會用到的命令如下:
:q:退出vim,如果有修改為存儲,會報(bào)錯(cuò)
:q!:強(qiáng)制退出,不保存修改
:wq:保存文檔并退出
:w [filename]:將當(dāng)前文檔另存為文件filename,并不會退出vim
:e [filename]:在vim中打開filename文件。
:e!:放棄本次的所有修改,從上次保存該文件開始重新編輯。

深入原理

以上的常用命令和操作都是基于vim的基本原理形成的,vim的命令很強(qiáng)大,尤其底行命令模式甚至可以類似于一個(gè)小型的腳本語言。
vim官網(wǎng)有一個(gè)經(jīng)典的全鍵位圖,如下


在這里插入圖片描述

如果英文不好,可以看下面這個(gè)翻譯過的中文版


在這里插入圖片描述
如果覺得這個(gè)圖太復(fù)雜,可以看下面一些分解版的(只有英文的了)
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

還有一些網(wǎng)友整理的一些其他便捷教程卡片
入門版:


在這里插入圖片描述
進(jìn)階版
在這里插入圖片描述
增強(qiáng)版
在這里插入圖片描述
純文字版
在這里插入圖片描述

歡迎訪問博主的個(gè)人主頁——靜葉思的隨筆

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 自我總結(jié)篇: 對文件的操作技巧: vim文件一個(gè)有三種狀態(tài):命令(瀏覽/輸入命令轉(zhuǎn)變末行模式),文本(添加/編輯/...
    小知大知閱讀 879評論 0 0
  • 在命令狀態(tài)下對當(dāng)前行用== (連按=兩次), 或?qū)Χ嘈杏胣==(n是自然數(shù))表示自動(dòng)縮進(jìn)從當(dāng)前行起的下面n行。你可...
    三十兒閱讀 466評論 0 1
  • 曾經(jīng)使用了幾年多的Vim,手冊也翻過一遍。雖然現(xiàn)在不怎么用vim了,曾經(jīng)的筆記還是貼出來,與喜歡vim的朋友分享。...
    Sylar丶閱讀 973評論 0 0
  • vim 選擇文本,刪除,復(fù)制,粘貼 文本的選擇,對于編輯器來說,是很基本的東西,也經(jīng)常被用到,總結(jié)如下: v 從光...
    MiracleJQ閱讀 706評論 0 0
  • vi(vim)可以說是linux中用得最多的工具了,不管你配置服務(wù)也好,寫腳本也好,總會用到它。但是,vim作為一...
    梁世勇閱讀 1,696評論 2 12

友情鏈接更多精彩內(nèi)容