文章目錄
- vim工具
- 什么是vim
- vim的多模式和使用
- vim的基礎模式
- vim的三種基礎模式
- 三種模式的初步了解
- 常用模式的詳細講解
- 插入模式
- 命令模式
- 模式轉化
- 光標的移動
- 文本的編輯
- 底行模式
- 替換模式
- 視圖模式
- 總結
- 使用vim的小技巧
- vim的配置(了解)
vim工具
本文章仍然是繼續講解Linux系統下的一些基礎開發工具。本篇文章將對vim這個強大的文本編輯器進行詳細講解,包含內容有vim的引入介紹、vim的使用、還有vim的配置。
vim的使用方式有很多,但是在這里就先只進行簡單講解,能夠熟練掌握使用幾個常見的命令就可以了,后序要使用其它的方式的時候是可以再查閱資料使用的。
什么是vim
vim的本質其實就是一個多模式的文本的編輯器,只不過相對其他文本編輯器來說,vim的功能更加強大,使用起來難度也比較大。但是若能較為熟練地使用vim,那么使用其他的編輯器就很簡單了。所以是有必要進行學習的。
如果有使用過且比較熟悉vim的,應該會見過另外一個編輯器叫做vi,這個我們可以把它理解為vim的前身,vim就是一個升級版的vi。
vim最大的特點就是可以使用命令對文本編輯器進行操作,這點和我們在Windows系統下常用的一些記事本還是有一些區別的:
在vim這個編輯器內,每個鍵是有對應的意義的。當然用法使用起來就有很多種,但是還是那句話,當前只需要掌握一些基礎的、常用的用法即可。
vim的多模式和使用
接下來我們將對vim的使用進行簡單地講解。
在這里我們要回顧前面說的一點:什么是多模式?我們可以這么理解:
在我們常用的Windows GUI下的一些記事本或者文本編輯器,我們在編輯文本、復制、粘貼、剪切、回退等過程大部分時間都是用鼠標和鍵盤進行操作的,偶爾會搭配一些快捷鍵進行操作。在我們以往的認知上,這貌似就是一體的,所有的操作基本上都可以通過鼠標和鍵盤完成。其實這是因為GUI這層外殼程序進行了包裝而已。
其實我們所做的這些操作,在底層不一定是這樣子的。可能我們選中某個區域的時候,會有一個專門的模式會去完成這個操作(視圖模式)。有可能我們在用鼠標點擊個別操作(復制、粘貼…)的時候,有可能是底層命令模式在執行某些命令。我們在編輯文本的時候,又可能是某個模式打開才能讓我們能夠對文本進行編輯操作。
vim這個多模式的編輯器就是大概這樣,這些模式是分開來的,需要我們了解和學會使用,而我們平常使用的是因為Shell進行包裝了,所以弱化了這個概念。
當然后序對于vim的使用,還有一些要注意:
在本部分學習vim開始,將采用普通賬號進行后續的操作。對于需要提權的部分,可以等到學習完vim之后修改之前的那個“白名單”,這樣子后序就可以使用sudo進行短暫提權了。
因為直接使用root用戶是一個不好的習慣,這個用戶的權限太高了。很可能會導致我們忽視一些細節。同時,在以后的開發環境中,我們很可能也是用不到root賬戶的。
vim的基礎模式
vim的模式非常多,可能有大概十幾種。全部記住也是不現實的,我們就講解vim種的基礎模式,也是必須學會的模式。我們將會先從vim的三種最基礎的模式開始講解。
vim的三種基礎模式
vim的基礎模式有三種:分別為默認模式(命令模式)、插入模式、底行模式。
三種模式的初步了解
默認模式,也就是打開vim的時候默認所處的模式下。默認模式其實也稱為命令模式,這個模式是可以讓用戶通過輸入若干命令來進行一些文本編輯的操作的。當我們在這個模式下,我們會發現我們的鼠標其實是用不了的,無法像我們常用的記事本那樣使用鼠標進行一些操作。
這個模式的本意是為了能夠完成文本的快速編輯的。當然有些讀者可能會覺得用鼠標會更方便。但是先別急。等到學習完這個模式后就知道這個模式的好處了。
默認模式/命令模式也成為普通模式(Normal),我們直接使用vim打開一個以前寫過的c代碼:
此時我們就會進入vim的界面:
這個時候,如果我們直接按下鍵盤想要輸入一些內容,發現是沒有任何東西能夠輸入成功的。因為當前處于命令模式,所有輸入的鍵都會被當作成指令。
要想編輯內容,是需要轉化模式的。即當前我們需要轉化成編輯模式(插入模式),才能夠對文本編輯器里面的內容進行修改。最簡單的方法就是在普通模式下,按下i這一個按鍵,此時后vim會自動轉化為insert模式,也稱插入模式。
此時編輯器的底部是會出現“INSERT”字樣的,這個時候就代表當前處于的是插入模式。當然像回退到普通模式很簡單,直接按下鍵盤左上角的Esc鍵即可。
現在還有一個很棘手的問題,就是我們當前不會退出vim這個編輯器。這是因為,vim這個編輯器在開發的時候,就把當前編輯文件對應的保存、退出等操作集成到了一個模式下——底行模式。當然在普通模式下也確實可以使用一些快捷鍵進行退出。但是我們還是要搞清楚vim的基本使用模式和原理,所以是需要學底行模式的。
在普通模式下,按shift + ;,其實就是按:,此時就可以從普通模式切換到底行模式:
此時,最下方會出現一個:,這就是底行模式。我們可以在底行內輸入一些指令:
w(保存當前文件)
q(退出當前文件)
wq (輸入「wq」,存盤并退出vim)
q! (輸入q!,不存盤強制退出vim)
此時我們輸入對應指令就可以完成對應操作了。
但是這里要注意的是,如果對文件內容進行了了編輯,在底行模式下按q是沒有辦法直接退出文件的。如果想要不保存直接退出,需要使用指令wq。
當然,如果想要從底行模式回到普通模式,也是直接按左上角的Esc鍵即可。
對于上述的三種模式,我們可以用下面的這一張圖來總結:
當然,我們這里只是簡單地鋪墊一下,這三種模式具體是如何使用的,這需要后續講解。
可能有人會問,能否直接讓插入模式和底行模式之間轉換呢?這是不可以的。我們可以把普通模式看成一個中轉站,其它的模式想要轉換為另一種模式,需要轉化為普通模式。
注:其他所有的模式轉化為普通模式都是一樣的,使用萬能的Esc即可。
常用模式的詳細講解
接下來我們將進行vim下的三種基本模式進行講解,同時會引入兩個新的模式——視圖模式和替換模式。學習完這些模式和常用指令后,再勤加練習,對于vim的大部分場景的使用就沒問題了。
插入模式
插入模式其實沒有什么太多好說的,插入模式其實就是用來編輯文本內容的。只不過相較于我們在Windows GUI下使用的文本編輯器而言,我們在vim的插入模式下是沒辦法使用鼠標進行定位和一系列操作的。這些操作被放在了其他模式下。
在插入模式下,我們只能通過鍵盤進行輸入/修改內容,或者刪除文本。總結成一句話就是——在vim的插入模式下,我們只能修改文本。如果需要使用到復制、粘貼、剪切、選擇文本內容塊等操作,這需要我們切換到其他模式下進行操作。這點我們注意即可。
所以在這里就不過多地講述插入模式了,因為插入模式也確實沒什么太多好講的。
命令模式
命令模式/普通模式,這是一個非常重要的模式。它可以幫助我們快速地編輯文本。在這個模式下,我們輸入地內容都會被當作成指令(不回顯在顯示器上)。
快速編輯,其實就是對應著一些快捷操作。比如我們常用的ctrl c/v,又或是一些其它的快捷操作。這些操作都放在了命令模式下。接下來我們一起來看看對應的操作有哪些。
模式轉化
在命令模式下,按下“i”可以切換成插入模式,按下“shift + ;”即可進入底行模式。
其他模式轉換為普通模式十分簡單,萬能“Esc”即可。
但是進入插入模式還是有很多分類的:
按「i」切換進入插入模式「insert mode」,按“i”進入插入模式后是從光標當前位置開始輸入
文件;
按「a」進入插入模式后,是從目前光標所在位置的下一個位置開始輸入文字;
按「o」進入插入模式后,是插入新的一行,從行首開始輸入文字。
光標的移動
光標,在圖形化界面下其實在文本編輯地時候,會有一道豎線不斷地在閃爍,那個就是光標,標志著我們當前正在編輯的位置。在Linux系統下其實也是有地,就是那個綠色的光標:
平常在移動光標的時候,我們不僅可以直接使用鼠標點擊想要編輯的位置。也可以通過鍵盤上的上下左右鍵進行移動光標。甚至可以使用一些快捷鍵來快速定位光標的位置。這些操作本質也都是為了能夠快速地編輯文本。那么這些操作在vim下是如何做到的呢?
(1)光標快速定位文本行
每次進入vim的時候,光標總是默認的處在文本開頭的第一個位置,如果我們想要快速的讓光標定位到文本某個位置應該怎么操作呢?
我們可以使用命令shift + g(其實就是G),此時光標會快速的定位到文本的末尾行:
想要回到所有文本的開頭行也很簡單,直接使用命令gg即可。
但是這個只能在文本開頭和末尾操作嗎?其實并不是的,還可以將光標定位到指定行開頭,使用命令:n + shift + g == n + G(n為數字)
當然這里想要顯示指定文本在第幾行是需要設置的,在底行模式下輸入set nu即可。有了上述這些指令,就可以很輕松的在文本行直接進行來回切換了。
(2)在一行中確定光標位置
但是前面的操作也就是僅限于定位文本行開頭而已。如果現在只想在一行內進行快速定位,又該如何呢?
使用shift + 3 == $,可以快速定位到某一行的最后面:
使用shift + 3 == ^,可以快速定位到某一行的最前面:
但是要注意的是,這里所說的最前面和最后面,是該行有文本內容的開頭和末尾。如上圖所示,定位到文本行的開頭,前面的空格其實都被過濾掉了。、
前面的兩種操作時在文本行的開頭和末尾進行操作。有沒有辦法定位到文本行中間呢?這時候我們可以提供兩種方法:
1.在某一行中,以”單詞“為單位,使用命令w向后移動,使用命令b向前移:
比如我們在這里按下命令w,此時光標會向后眺一個單詞。
但是在跳一次卻只是向后跳過了一個分號。這是為什么呢?
其實這里所說的”單詞“,并不是我們認為的英語單詞。vim這個文本編輯器對”單詞“是特殊處理的,這里的“單詞”本質應該是“vim工具下單一的被跳過的詞”。這點我們要注意下。向前跳也是一樣的,就不在此處進行演示了。
我們也可以使用n + w / b進行向前和向后跳n個單詞:
如上圖所示:從printf的p開始向后跳5個單詞。
(3)光標的上下左右任意移動
但是前面那樣做還是會麻煩一點,如果有時候僅僅只是想切換到下一行還要各種各樣的指令還是太麻煩了。所以vim其實也是提供了使用上下左右鍵進行光標移動的命令的。
但是我們要注意的是,在比較老的版本下的vim編輯器內,上下左右鍵并不是我們常用的那個pageup和pagedown鍵等。而是如下這四個:
鍵位 | 方向 |
---|---|
H | ← |
J | ↓ |
K | ↑ |
L | → |
當然,在比較新的版本下,我們常用的帶箭頭的上下左右鍵是可以使用的。但是在某些場景下無法使用(后序會講)。
為什么是這么設定的呢?其實這個和以往的鍵盤設定有關,我們可以上網搜一下比較老的鍵盤,我們會發現一個問題,就是這些鍵盤是沒有帶箭頭的上下左右鍵的:
我們仔細觀察一下會發現,在老式鍵盤內,HJKL對應的就是上面對應方向按鍵。所以這也就是為什么vim會這樣設計。這是因為vim其實也是很久之前就開發出來使用的了。只不過后序為了適應新的鍵盤,就把帶箭頭的上下左右鍵給識別到了。
但是這里的pageup等按鍵在某些場景下是沒辦法很好的使用的,這點我們后序會提及。
這里再提及一點:
按「ctrl」+「b」:屏幕往“后”移動一頁
按「ctrl」+「f 」:屏幕往“前”移動一頁
按「ctrl」+「u」:屏幕往“后”移動半頁
按「ctrl」+「d」:屏幕往“前”移動半頁
上面這幾個是用來翻頁用的,了解一下即可。
文本的編輯
文本的編輯操作有很多,比如有:
復制、粘貼、剪切、刪除、替換…
接下來的內容將重點介紹一下在命令模式下,文本的各類的快速編輯是如何進行的。
1.文本的復制粘貼
平常在我們的Windows下GUI的各個地方中,我們最常用的復制粘貼方式有兩種:
一種是直接使用鼠標選中區域按右鍵選擇選項,另一種是使用快捷鍵ctrl c/v。
但是在命令模式下,這些都不起作用,我們只能通過使用命令進行操作。所以我們需要直到在命令模式下,復制和粘貼的命令是什么:
使用命令yy,可以把光標所處的當前行進行復制
使用命令p/P,會將緩沖區內的字符貼到光標所在行的下/上一行
復制前:
使用指令p復制后:
當然,這些指令也都是可以在前面加上數字n,從而進行多行的復制和粘貼的:
n + yy:一次性將光標所在行開始的n行復制到緩沖區。
n + p:一次性將緩沖區的內容在當前光標的下一行開始粘貼5次。
前面的操作都是針對于整行操作的,那有沒有針對于部分內容的操作呢?
有的,使用指令yw即可,該指令會把光標開始到字尾的所有字符復制到緩沖區。
但是如果想控制復制的個數,就可以使用n + yw,復制n個字符到緩沖區。
這里就不再進行演示了,使用還是比較簡單的。
但是這里要注意的一點是:yw指令復制完一個“單詞”后就會停止,也就是說所謂的“字尾”,其實就是vim編輯器下“單詞”的尾。而且yw指令粘貼后是默認在當前光標位置粘貼的。
2.文字的刪除
和復制一樣,我們分為整行操作和部分操作。
對于整行內容,我們可以使用命令dd,此命令會刪除當前光標所在行的內容:
刪除前:
刪除后:
也可以使用n + dd一次性刪除多行:
最下面顯示的”4 fewer lines“意思就是少了四行,也就是我剛剛使用n + dd一次性刪除了從光標開始往下數的四行內容。
但是現在我不想刪除一整行,就只是想刪除一行內的個別字符,這怎么辦呢?
這里提供兩個指令:x和X,這個可以刪除一個字符,也可以在指令前面加上數字,指定一次刪除n個字符。
x刪除方式是把當前光標標記的字符刪除,本質上是刪除光標后的字符:
我們發現,光標標記的字符f被刪除了。
X的刪除方式是把當前光標開始到行尾的內容整體向左移動一個字符的位置,本質上刪除的是光標之前的字符:
直到當前光標處在行頭處,這個時候就代表著光標之前沒有字符可以被刪除了。此時再輸入命令X就沒有用了。
當然這兩個指令也可以在前面加上數字,達到一次性刪除多個字符的操作。在這里就不進行展示了。感興趣地讀者可以自行前往嘗試即可。
3.內容的剪切
當然有時候我們希望內容是被剪切(從某個位置刪除粘貼到另一個位置)。
這個時候其實不需要新的命令,直接使用前面的刪除命令就可以了:
使用指令dd:
使用指令p:
使用指令x和X也是一樣的。但是這里要注意的是,刪除后再使用命令p進行粘貼:
如果是剪切一行,那么粘貼的是在當前光標的下一行粘貼。
如果是剪切若干個字符,那么粘貼是在當前光標的位置的下一個字符的位置。
4.內容替換
有時候我們想直接替換掉部分內容,我們可以這樣做:
第一種方式就是切換到插入模式,然后直接對內容和進行刪除后替換。(內容不多的情況下)
但是此處講的是如何使用命令可以快速的進行替換,所以我們要知道替換的命令。
我們可以使用命令r + 替換字符,這個時候就可以把光標處的字符改成替換字符了:
當然也可以前面加數字n,一次性替換多個字符:
此時會把從光標開始的往后數n個字符全部替換。(如果n大于剩余字符個數是沒有反應的)
當然還可以切換成替換模式進行替換字符,在這里我們先不講。
但是如果想要轉換字符的大小寫,就應該使用命令shift + ~,此時就可以輕松的將光標處字符轉化大小寫情況:(大寫 → 小寫 小寫 → 大寫)
注意,光標處的字符大小寫被轉換后,光標會自動跳到下一個位置,直到行尾。對于沒有大小寫的字符,會直接跳到下一個位置。
5.內容查找
在一個文本當中,我們想實現某個內容的快速查找,可以使用命令shift + 3 == #:
這個指令會把光標處單詞在文本中的所有地方全部高亮出來:
而且我們會發現,高亮后光標會處在最后一次出現查找內容的地方。
這個時候我們使用指令n,這個時候光標就會從后往前走到指定內容的位置。如果光標不在單詞的開頭,那么使用指令n的時候會先跳到單詞的頭部。
但是很多人會發現,這個高亮好像去除不了。這個解決方法有很多種:
推薦方法:在底行模式下輸入noh即可。
6.撤銷操作
這個操作其實我們會經常用到。比如我們在vs 2022中寫代碼的時候,有時候寫錯了,想回退到一開始寫的基礎框架上,就會使用左上角的兩個鍵:
這兩個鍵分別是往前回退和往后回退。那么這兩個在vim中是如何使用的呢?
如果想要往前回退,就需要使用指令u,這個時候會回退到前面的指令。
使用指令ctrl + r就可以撤銷剛剛的u指令。就是上面這兩個箭頭的對應操作。
這兩個指令也是可以前面加數字達到一次性撤銷多步的,這里也不再演示。
以上大概就是我們當前需要掌握的在vim的命令模式下的基礎指令。
底行模式
底行模式在前面已經初步地介紹過了,在這里就不再過多介紹用法。
我們大概需要知道以下底行指令:
1.保存退出文件
在底行模式下輸入以下指令
w(保存當前文件)
q(退出當前文件)
wq (輸入「wq」,存盤并退出vim)
q! (輸入q!,不存盤強制退出vim)
前面已經經過,這里不再贅述
2.設置編輯器行號:
有時候我們想在命令模式下操作個別行的時候,知道行號是更方便的。
在底行模式下:
輸入set nu,其實就是set number的簡寫,就可以對當前文本編輯行號:
想取消行號也很簡單,輸入set nonu就可以了。
接下來將再介紹部分底行模式下的指令:
查找功能:
使用指令/關鍵字或者?關鍵字,然后系統會把關鍵字對應的位置高亮標識出來。當然也是按n就可以查找下一個。
但是這兩個用的其實比較少,稍微了解一下就可以了。
替換文本:
使用指令%s/dst/src,此時dst的內容全部被替換成src的內容:
使用指令:%s/printf/PRINTF:
我們在底行模式下,也是可以運行Linux的命令行命令的:
輸入!ls- l:
此時系統會短暫地”退出“vim然后在當前工作路徑下去執行指令。
當然還可以進行多文件的同時編輯:
使用指令:vs new_src,其中new_src是新的文件名:
使用指令vs h1.c,此時頁面中會出現多一個文件。即我們剛剛創立的文件。
這里要注意的一個原則就是:當前光標在哪里,操作的就是哪個文件!
而且后創立的文件是先操作的。
使用指令ctrl + w就可以對當前光標從左到右切換文件。有了這些知識后,進行多文件編程就簡單多了。
替換模式
這個部分我們來講一個前面沒講的內容——使用替換模式進行文本替換。
替換模式其實也是vim眾多模式的一種,在普通模式下,輸入命令shirt + r == R就可以進入替換模式:
切換到替換模式后,底下會顯示“REPLACE”字樣。
該模式下,我們輸入的字符都會把光標處的字符給替換掉。并且替換完后光標會自動地向后移動一個字符的位置:
且可以不斷地向后替換。
想要回退到普通模式也是一樣的,直接按下萬能的Esc鍵即可。
視圖模式
經過上面的一系列操作,我們其實已經對vim的操作有了基本的認識了。但是這里還差一個基本功能,即如果想要自行選中文本的區域來操作怎么辦?
就像我們使用鼠標選定一塊區域一樣,這該如何操作呢?這個時候就要切換到視圖模式。在普通模式下,輸入ctrl + v就可以進入視圖模式,此時我們可以使用hjkl這四個鍵進行上下左右的移動。這里大部分情況下來說,使用帶箭頭的上下左右鍵是沒辦法操作的。所以建議直接使用hjkl這四個鍵即可。
使用視圖模式再配合插入模式,我們就可以完成對代碼的批量化注釋了:
進入視圖模式下,地下會出現“VISUAL BLOCK”字樣。
然后我們可以通過hjkl這四個鍵進行區域選定:
這個時候,再輸入指令shift + i == I,此時就會進入插入模式:
然后這個時候我們只需要再光標位置輸入注釋符//,再按下Esc,就可以完成批量注釋:
這大大地方便了我們對代碼進行注釋的流程。
當然這里只是簡單地講解了一下批量化注釋的用法,視圖模式下用法還是蠻多的,但是當前我們只是作為了解。最需要理解的部分還是基礎的三個模式。
總結
對于本篇文章所講內容,可以歸為以下操作:
我們大致了解了各個模式的用法,原理以及對應的一些操作。
在這里最后需要說的一句就是,在vim中,很多指令前面是可以配合數字n來使用的,達到一次性操作多行/多個字符的效果。
后序我們需要勤加練習并且能夠較為熟練地掌握vim的使用。
使用vim的小技巧
這里提供兩個小技巧:
- 確定進入vim時候光標所在的行數:
使用指令vim src +n,就可以進入vim的時候,使光標處在第n行。這個還是很有用的,比如有時候代碼報錯在第幾行,就可以使用這個指令快速定位。 - 使用指令!v,使用這個指令可以快速的查看最近一次使用vim的指令,這樣子有時候就不用再自行輸入指令了。
vim的配置(了解)
當然,vim的強大之處不僅僅是在于以上那些功能。它還是一個可以進行配置的工具。有時候我們可以看到別的機器上的vim其實是非常好用的,寫代碼的時候會提供自動搜索,還會提供語法高亮,又或是自動縮進等功能。但是這些都是需要進行手動的配置的。
vim這個工具是我們的云服務器自帶的,在在目錄 /etc/ 下面,有個名為vimrc的文件,這是系統中公共的vim配置文件,對所有用戶都有效。
但是我們一般不會在這個路徑下的vimrc進行配置,因為不是所有的用戶需要的配置都是一樣的。我們希望的是,不同的用戶根據自己的需求去進行自行配置。這個就需要每個用戶的主目錄下有一個.vimrc的配置文件,這是個隱藏文件。
但是一般來說是沒有的(如果沒有自行添加)。所以在打開vim的時候,就搜索不到對應的配置文件,所以vim打開的時候就是以默認版本的打開。
我們接下來就簡單展示一下怎么樣去配置一個vim:
首先,我們要在主目錄下建立一個隱藏文件.vimrc:
然后,使用vim把.vimrc打開進行配置,所謂的配置,其實就是修改配置文件里面的信息:
我們使用以下常用的配置信息進行配置:
設置語法高亮: syntax on
顯示行號: set nu
設置縮進的空格數為4: set shiftwidth=4
然后我們再使用vim打開代碼:
這個時候確實是有對應的配置存在了。
如果還需要一些對應的配置,可以上網搜尋一些常用的配置指令。
但是如果要實現一些自動縮進、代碼補全、代碼搜索的功能光有這個配置文件也是不夠的,還需要我們去下載一些插件,但是下載插件不僅很麻煩,還可能會遇到各種奇奇怪怪的問題。所以這里就不推薦下載插件了。
我們可以直接下一個自動部署工具:
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
直接把這位大佬寫的工具下載到我們本地云服務器上。就直接將這個鏈接復制到主機上然后確認即可。然后等待它自動安裝。
注意:這個工具不要在root賬戶下跑!會出問題。還有就是,這個工具目前只支持centos 7.x系統,其它系統可能需要自行查找對應的工具。
下載完后,會出現多一個install.sh的文件,這就是我們剛剛下的工具。
這個時候我們再使用vim打開代碼:
這個時候該有的功能都有了,就很方便了。(這個是把vim配置成寫cpp代碼的)
當然動手能力強的可以自行手動配置,這個可以自行選擇。