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

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

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

基礎命令——(適合臨時用戶)

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

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

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

除了按鍵i以外,普通模式進入輸入模式的命令還有幾個常用的:
i:進入輸入模式并在當前光標所在前一格開始輸入
a:進入輸入模式并在當前光標所在后一格開始輸入
o:進入輸入模式并在當前光標所在行的下一行新建一行開始輸入

在輸入模式中,按下ESC按鍵即可退出輸入模式,進入普通模式

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

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

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

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

進階篇常用操作

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

個人覺得這個挺重要,因為很多命令都需要用到行號,總不能去數(shù)吧。
:set nu:顯示行號(注意前面輸入冒號進入底行命令模式)
:set nonu:不顯示行號

快速定位光標

除了h,j,k,l四個基礎的命令以外,還有很多可以快速定位光標位置的方法:

數(shù)字控制移動多次光標(光標移動多行、多字符)
通過[數(shù)字]+[移動光標命令]的方式進行移動,例子如下:

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

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

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

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

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

進入輸入模式

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

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

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

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

搜索

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

搜索與替換

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

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

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

刪除

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

復制與粘貼

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

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

其他常用操作

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

文檔讀寫

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

深入原理

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


在這里插入圖片描述

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


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

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


在這里插入圖片描述
進階版
在這里插入圖片描述
增強版
在這里插入圖片描述
純文字版
在這里插入圖片描述

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

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

相關閱讀更多精彩內容

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

友情鏈接更多精彩內容