Vim-編輯器之神
幾點宣告:
-
作者只是一位小小的 \(OIer\) ,並不會什麼過於神仙的東西,我這篇文章只是幫助人入門的而已。
-
若有人在 OI-Wiki上見過了原文章,原作者是我 \(......\) ,真不是抄 \(......\)
歷史與爭端
Vim 的前身是 vi,一個簡潔但是略有不足的編輯器,但是從 vi 開始,編輯器的模式區分和唯快不破的思想就已經體現的很到位了。Vim 即是 vi improved,是在 vi 原本所有的方式上進行的進一步提升,但是並不會改變 vi 的其他本質,只是增加了更多適應如今需要的一些功能。
vi 於 1976 年誕生,與 Emacs 不分先後,兩者因其快捷的編輯被奉為主流的神器,甚至使用者們還有爆發過 “聖戰”,即是 神的編輯器 Emacs
VS 編輯器之神 Vim
,但是當然分不出結果,因為各有優劣。但它們共有的特點就是高度的擴充套件性與高度的可定製性以及快捷方便的使用。
即使很多人說它們老了,太過古老的東西應該淘汰掉。但既然能夠留存至今,它們的彌堅性當然也是很客觀的,也會有著某些現代編輯器無法填補的優勢。
Vim 的模式區分是一個很有意思的設定,普通模式與插入模式是最主要常用的模式,普通模式下的每個鍵都是命令,這便是 Vim 不同於 Emacs 的地方,若是習慣了 Vim 的模式之間的切換,大部分都是單個鍵的命令必然比 Emacs 的無限 Ctrl 會更高效,雖然 Vim 的小容量註定比不了 Emacs “作業系統” 這個東西那麼萬能,但是論快而言,Vim 是毫不遜色的。
Vim 有豐富的外掛擴充套件,這點顯然是比配置更迷人的存在。有這些擴充套件性存在,Vim 成為一個 IDE 也不會是不可能的事情。
但是,Vim 的初始學習註定是艱難的,因為其與多數主流操作不同的方式令稍懶的新手望而卻步,這需要時間來適應但當度過最開始的不適應期之後,Vim 就再無難度,你會慢慢上癮,不斷優化你的配置,尋找新的更好用的外掛。開始的過程就像是鑄劍,之後的過程就像是與劍的更好的磨合,然後在劍中逐漸注入你的靈魂,這樣它就成為了你最好的利器,令你無法割捨。乃至你會自己寫適合自己的外掛,就像是自創劍法,而不像是從別人那裡借來劍法,雜七雜八融為一爐。
有人說了這樣一句話:
Vim 是一款非常優秀的文字編輯器,但由於其陡峭的學習曲線,很多人還沒開始學就放棄了,所以他們無法領悟 Vim 唯快不破的設計思想和精巧的使用體驗。
附一張圖,論各大編輯器的學習曲線,縱座標代表掌握知識量及難度,橫座標代表使用的熟練程度與完成任務的效率。我們可以看到,Vim 的曲線豈止陡峭,都垂直了…… 但是開始過去後,是平穩的提升,只要度過開始的階段,Vim 的學習將再無阻礙,一路直上有沒有。
安裝
一般的話,Linux 系統都是會自帶 Vim 的,開啟終端輸入 vim
即可啟用。
Vim 依附於終端,所以調整終端設定也可以達到美化效果。比如背景透明這種極具美感的東西。而 Gvim 則可以通過圖形介面的選單欄來調節。
Vim確實是很方便的,而且各大系統基本上都有 Vim 版本,甚至對於許多 Linux 系統,Vim 本身就是自帶的。但是自帶的 Vim 很容易有功能殘缺,比如不能與系統剪下板互動 (將會在進階篇講解,當然主要是因為沒安裝其他東西啦),各種未開啟支援。如果想要使用一些新版的功能的話 (比如 Vim 內部調出終端以及自帶的除錯功能,當然, 如果沒有相關要需要實是沒有必要安裝的 ,可以直接往下走),那麼這時候我們就需要手動安裝。第一步先是解除安裝系統自帶的 Vim,畢竟舊的不去新的不來嘛。命令如下:
sudo apt-get remove vim
然後安裝有兩種做法。
做法一,使用命令安裝,但因為系統安裝的時候 Vim 就是從預設軟體源安裝的,所以軟體源裡 Vim 的版本並不是最新的 = =。這個時候應使用第三方軟體源安裝,命令如下:
sudo add-apt-repository ppa:jonathonf/vim sudo apt-get update sudo apt-get install vim
靜待安裝完成即可
做法二,先到 Releases - vim/vim 下載原始碼包,然後解壓,並進入解壓後的資料夾,並開啟終端,cd 至資料夾路徑,並依次輸入如下命令:
sudo apt-get install python-dev sudo apt-get install python3-dev sudo apt-get install libncurses5-dev ./configure make sudo make install
make 的過程可能稍久,淡定點等。
最後在終端輸入
vim
就跳出了那個幫幫烏干達的可憐兒童啥的,按 a
或 i
鍵開始編輯新檔案吧。
或者要開啟某個檔案的話就可以在終端中
vim 檔案路徑
可以直接編輯檔案。
基礎篇
分模式來吧。
插入模式 (insert)
插入模式的知識點其實沒有太多,輸入才是主職是伐。
首先,從普通模式如何進入插入模式呢?有數個命令: i
與 a
與 A
與 o
。前兩個差別不大, i
是在游標當前位置進行寫程式碼, a
是往後挪一個字元寫程式碼。 A
是移動到當前行尾進行插入, o
是在行尾新增換行符並在下一行插入。
而如何返回普通模式?當然是 Esc 啦。但是,Vim 的插入與普通模式切換異常頻繁,而 Esc 又太遠了,有什麼辦法呢?Vim 還提供了 Ctrl + [ 的快捷鍵來返回普通模式,是否近多了呢?
雖說能夠熟練了後,切換模式不再是問題,但是其實有的時候我們只是需要進入普通模式下按一次小命令,來回切換又顯得浪費了一點點時間。而 Vim 又提供了插入 - 普通模式來避免這一尷尬的問題。在插入模式下,只需要按 Ctrl + o 即可進入此模式,當進行完一次操作後又會自動回到插入模式。這樣豈不是更省時間?
普通模式 (normal)
Vim 的命令大部分都是在普通模式下完成的,普通模式下可不能亂按,可以說每個鍵都是命令。
首先是 hjkl 四個方向鍵。 k ^ h <> l v j
其實大多數編輯器都是用方向鍵做出移動命令,Vim 也不例外,但 hjkl
給了我們更好的選擇,只需要一段時間的適應,你便能快速地操作它們進行移動,而且它們可沒有方向鍵那麼遠,節省時間是一流的。
普通模式下最重要的命令,沒有之一,那就是 u
。撤銷命令,作用是撤銷上一次對文字的更改,普通模式下的 x
, d
, p
命令都會被撤銷,同時進入一次插入模式所編輯的文字也算一次更改, u
命令會刪去從進入到退出插入模式所輸入的所有東西。與之對應的是 Ctrl + r 命令,他的作用是撤銷上次的撤銷命令,相當於大部分 windows 下程式中的 Ctrl + y 。
然後的話, 就是普通模式下常用的命令。由於對行命令的使用很頻繁,所以大部分的單鍵命令都可以通過按兩次來實現對行操作。常用命令是 x
,用於刪除游標後的一個字元。然後是 d
命令,也是刪除,但是種類更多,這裡不做贅述。同時 d
命令像之前說的,按兩次即可刪除整行,即 dd
。
然後是 y
命令,可以複製被選中的區域,這涉及到可視模式,即按 v
進入可視模式,多用於選中區域。進入可視模式後移動游標來確定選取範圍是可以的,此時按 o
鍵即可切換活動端,省去了如果跑反方向的麻煩。當然,我相信很多人還是習慣用滑鼠操作這一過程的,包括移動游標。Vim 很溫馨的提供了這一配置: set mouse=a
。你可以將它寫入你的配置檔案中去。有了它之後,你將能夠用滑鼠選中區域並進行復制操作。當然,選中後按 x
或 d
亦可刪除。同時, y
也符合 d
的性質, yy
將可以複製當前行。
然後就是更快的跳躍了。如果說只是使用 hjkl
的話,游標的移動顯然不夠快,而滑鼠卻又要伸手去拿。Vim 提供了普通模式下更快的跳躍方法, w
可以跳到下個單詞的開頭,而 e
可以跳到當前單詞結尾, 0
可以跳至行首, $
可以跳至行尾,豈不是快多了?而且 w
, e
, 0
, $
還可以用於許多命令中 de
, dw
, d0
, d&
分別對應刪至單詞尾,刪至下個單詞頭,刪至行首,刪至行尾。以及 y
命令亦可同理。
然後是 Vim 的可重複。在輸入某個命令前,輸入一個數字的話,就會重複那麼多次。如在普通模式下:
asdasdasdasdasd asdadasdddd asdasdasd
游標正位於第一行,該如何刪除這三行呢?普通模式下按 3 dd
即可。其實還有 .
命令也是可以做到一些重複的,這會在效率篇中提到。
然後是全文的跳躍,按 gg
可跳至程式碼的開頭,按 G
可跳至程式碼最後一行,先按數字再按 G
可跳至指定行。
那麼在文中還有極為方便的查詢功能,普通模式下只需按 /
下方即會出現查詢框框,輸入需要查詢的字元按回車就好啦,如果有多個查詢結果,只需按 n
即可跳至下一個查詢處,按 N
即可跳至上一個。
常用命令大概就這些了……
命令列模式
其實這並不能稱作是一個模式 = =。
普通模式下只需要按 : 下方就會蹦出命令框框,輸入相關命令即可。如 Vim 線上幫助文件,輸入 :help
即可,如果看不懂英文…… 請下載 Vim 使用者手冊中文,或者移步外掛篇。
此模式下有一些很有用的命令
:q
退出, :w
儲存, :wq
儲存並退出, :q!
不儲存並退出, :e filename
開啟當前目錄下指定檔案,這些是比較基礎的。
然後是很強大的命令 :x1,x2 s/A 串 / B 串 /
作用是把第 x1
行至 x2
行中的所有 A 串替換成 B 串。想象一下題寫完了,但是發現沒開 long long
的時候,完全不絕望有沒有,一個小命令,妙不可言。瞬間所有 int
變 long long
。
以上都是 Vim 內部的命令,但是實際上如果命令形式是 :! 命令
那麼就將在外部執行命令,即是以 bash 終端執行命令。既然都是外部 bash 了我就不多做介紹了,那塊地不歸我管……
可視模式
可視模式的作用總結起來大概就是選中高亮,但是塊狀的可視模式可以幹更多的事情,不過太麻煩了,對於新人來說大概會腦闊疼。
普通模式下按 v
即可進入可視模式, hjkl
可以移動高亮選區某一頭,如果發現反了或者你進入可視模式的時候是在想要選中區域的中間位置,不用急著退出重進,更不用花時間又移回去,只需要按 o
即可切換活動端,操作高亮選區的另一頭。或者用滑鼠也不是不行啦……
用滑鼠選中高亮選區當然也可以說是進入可視模式的辦法之一。
然後就是 y
或者 d
操作,沒了 QwQ。
emm 基礎應該就用到這些了吧,往後的外掛,配置,更多操作在對應篇幅裡。
最後其實 Vim 還有一些基礎操作,它們在 Vim 自帶的教程裡將會講述。開啟終端輸入:
vimtutor
即可進入教程,二三十分鐘你就能掌握基礎了,但應當加以練習才能徹底掌握。
進階篇
這裡講的新東西不多,反而更多的是技巧與經驗,Vim 雖然是一個編輯器,但要用好它學問可不小。所謂技巧,都是如何更快更高效地使用 Vim,都是邏輯思維之間的碰撞。
從縮小控制區域開始
為什麼 Emacs 和 Vim 這些編輯器效率高?很重要的一點在於這些編輯器可以讓你切掉你的右半部分的鍵盤而讓你的雙手始終處於主鍵盤區域, 並且讓你的雙手保持合作, 而不會出現一隻手不停的按而另一隻手攤在鍵盤上。
所以, 如果你想用好 Vim , 不要去按方向鍵,不要去碰滑鼠,建議使用這幾行喪心病狂的配置:
" 使方向鍵失效 imap <UP> <Nop> imap <DOWN> <Nop> imap <LEFT> <Nop> imap <RIGHT> <Nop>
只需要最多一週的時間,你將完全適應 hjkl 的移動並感慨其效率之高。
但也許這還不夠, 你還可以進一步縮小你雙手需要控制的區域。
- Backspace (刪除鍵) 使用十分頻繁, 但它處在主鍵盤的角落, 你不得不挪開手或是伸長小拇指。
但在 Vim (甚至終端) 裡, 你可以用 ctrl+h 來徹底代替 Backspace 。 - 回車鍵使用同樣頻繁, 但同樣不挪一挪手就得伸長小拇指。
幸運的是在 Vim 和終端中, ctrl+m 完全等效與回車。 - 在絕大多數的情況下, 不要去按右邊的 ctrl, shift, 用左邊的代替。
違背常理的改變
Vim 本便是一個與尋常 IDE 不同的編輯器。那麼同樣你可以為它做出不尋常的改變。
如果長久使用可以發現,Esc 鍵太遠了,小拇指都按得不順手。那麼我們該怎麼處理呢?誒,我又不小心碰到大小寫鎖定切換鍵了!你會發現, CapsLock 按鍵實在太沒用了 O.O ,不僅難用到,而且這麼順手這麼近,還容易錯按到,我要它何用?我為什麼不吧它和 Esc 換一下呢?皆大歡喜呀。對嗎?
置換方案如下:
終端執行
sudo vim /usr/share/X11/xkb/symbols/pc
找到 key <ESC>
與 key <CAPS>
這兩行,並調換兩行的中括號 []
中內容並登出重新進入系統,你就會發現它們換過來了!!開始可能會極度極度懵逼,不大回得過神來,但是習慣了幾天後,你就會
接受了,這個時候你就會進一步享受 Vim 的模式,高速切換模式不是夢。
當然,你可能要問了,如果是在考場怎麼辦?沒有 sudo 許可權改不了啊。不用擔心,還有辦法,但是這個辦法重啟就失效了,所以考場就用這個辦法 ( \OvO/ ) 。在終端輸入如下語句即可哦 ( 考場親測 ):
xmodmap -e 'clear Lock' -e 'keycode x042=Escape'
當你能做到高速切換模式與熟練使用 hjkl 移動時,僅在想敲東西的時候進入插入模式並且敲完之後即刻推出就成了一種本能。其實你會發現 o 超級好用。現在很多時候我的換行並不是插入模式下的回車鍵,而是 <ESC> o
。而這也有另一個好處。這將會在 分塊撤銷 中得到體現。
重複!效率!重複!
毫無疑問,對動作的重複是提高效率最直接的辦法,也是對效率最直接的反映。接下來我將依次介紹 Vim 的 . 命令,簡單的錄製與重複巨集與 normal
命令。
自行車-- . 命令與 @: 命令
當你使用 Vim 的時候,對於重複的文字修改其實內心是絕望的,因為 Vim 註定比其他編輯器會多出兩個鍵的按鍵 -- Esc 與 i 。就像走路的時候別人都是邁步子,但是你一定要跳一下再走一步,這種重複令人十分煩躁與無奈。這可以說是一個致命的缺點,但是,Vim 其實為我們提供了一臺 “自行車” -- .
命令。它令我們能直接不用邁步落步,只要往下踩就好了。
要說起這個命令,其實效果也很簡單,那就是重複上次執行的命令。但是,看似簡單的外表,其實卻是無比的強大,重點就看你如何使用它了。這個重複上次的命令,其實可以是 數字+命令
的組合,同時, 進入插入模式+輸入文字+Esc
也是一個命令的範疇。那麼它的用處就大起來了
Vim 的宗旨是效率至上唯快不破,那麼一切都以 快
來思考才是正途。那麼如何使用這個自行車才是最快的呢?當然是沿著起點和終點之間的那條直線騎。同樣的, . 命令只有用到關鍵處才是最快的。如何使用它呢?我們來看幾個例子。
int a,b cin>>a>>b cout<<a+b return 0
可以看見每一行都少了空格。那麼如何使用 . 命令來優雅地修改呢?為了省去 Vim 的缺點,我們顯然可以先將游標移到第一行行尾,然後輸入 a;<Esc>
,然後接著向下移動到每一行行尾的時候,直接使用 . 命令即可。但是這還是沒有變快。那麼怎麼辦呢?你會想起 Vim 還有個進入插入模式的命令:A 。即移動到行尾插入。那麼一切都鮮明起來了,命令如下即可: A;<Esc>
,然後你只需要不停地 j.
就行了,還是挺
方便的。
那麼它的用處止步於此了嗎?顯然遠遠沒有。再來看如下一行程式碼:
int check() { book[1]=1,book[2]=1,book[3]=1,book[1]=1,book[2]=1,book[3]=1,book[4]=1,book[5]=1; }
後面五個賦值語句的陣列名寫錯了腫麼辦?一個個改顯然太坑了,而命令列模式的 s
命令又會 全部改掉 ,那麼怎麼辦呢?可以回憶一下我們普通模式下的 s
命令,它的作用是刪除游標處字元並進入插入模式。那麼怎麼使用呢?來到第一個錯誤的陣列名首字母處,按下 4s
,你會發現,陣列名四個字元統統消失啦!然後輸入正確的陣列名再退出即可。之後?一個個把游標移過去再使用 . 就好啦。
但是,這還不夠優雅,移動游標太浪費時間了!那麼有什麼辦法嘛?答案是顯然的。我們可以使用查詢模式! /book
再按下回車,並使用 n
鍵來到第四個陣列名處,然後 4s新陣列名<Esc>
,接著我們只需要重複 n.
就行了 ( O#O ),是不是灰常優雅!
再但是,其實如果你開啟了搜尋結果高亮的選項,查詢模式其實蠻難看的,這裡我們引入一個新的輕便型查詢命令 -- f
!使用很簡單,在一行中普通模式下, f+單個字元
即可查詢此行中出現的這個字元並將游標移至字元處,按 ;
下一個, ,
上一個。那麼無需查詢模式了,我們只需 fb;;;
之後進入插入模式修改,然後 ;.
即可!所以這麼說,對於行內移動,其實最常用的一般就幾個命令: h,l,0,$,f
,而且 $
命令是可以被 f
替代的,那就是 f;
。所以 . 是不是炒雞妙呀(* OvO *)。
做個總結: . 命令適用於重複的新增,修改,刪除文字。就像一個自行車,踩起來蹭蹭的 = =。
不過呢, . 命令所能重複的只是普通模式下的命令,命令列命令的重複則是對應另一個命令 @: 。
飛機--巨集
Vim 的巨集功能極度可怕,它重複的可不只是一個命令,你想要指定重複多長的命令它都可以的。那麼如何使用它呢?首先我們要先 “錄製” -- 顧名思義,把一串按鍵操作錄下來再回放,就達到了重複的效果。
錄製的方法很簡單,處在普通模式下先按 q
鍵,告訴 Vim 你要開始了。然後,巨集的按鍵錄製就像複製貼上的內容一樣是需要一個存放之處的,那麼下一步就是為它指定存放處,你可以按下 26 個字母中的任意一個來指定,然後左下方會顯示 記錄中@你剛剛選擇的字母
然後你就可以開始快樂地錄製了。同理普通模式下按 q
暫停錄製。
那麼如何呼叫呢?很簡單,在普通模式下按下 @
,再加上選擇的記錄字母 然後之前錄製的按鍵就被呼叫了......聽起來是不是麻煩沒用?當然不是,你忘了 . 命令不成,執行一遍巨集之後使用 . 命令不就可以不這麼麻煩了?當然,如果這些所有重複技巧在一起就很強大了 --- 錄製巨集 --> 呼叫巨集 --> . 命令重複 --> 數字+ . 命令達到無上效果。
豈不快哉?
normal 命令
顧名思義,自然有關 normal 模式,效果還是重複,但是 --- 這個命令可以選擇行。
如何使用呢? :
進入命令列模式,命令如下:
:a,b normal 命令
命令作用是在 a~b 行上, normal 模式下,執行 normal 後面的那串命令。或許看起來還不是特別強大,但是作為一個可以重複 . 命令的工具以及其便於理解性,它的使用頻率甚至更高於巨集。
重複命令的疊加
當命令們抱團的時候,它們才是最強大的,而絕非各自為戰。我們演示一個日常即可使用的方法吧。
打個比方,我下載了一本書,我需要它的每一個章節都變成 標題
--- 對,就是 \(Markdown\) 裡的那種 --- 以方便轉換成 mobi 之類的格式或者方便生成 TOC 目錄跳轉,怎麼辦呢?幾千個章節哪裡好處理哇。那麼重複命令就大大的有用了。
1 /正則表示式 進行查詢(搜尋章節名的表示式請務必上網搜一下) 3 I# <ESC> 進行修改操作 4 normal nn. 轉到下一處並重覆上一步操作,由於新輸入了字元游標移動了所以第一次 n 會回到老地方 5 數字+ @:多次重複上一步
完成了!快嗎?
重複命令的介紹到此結束。
多檔案編輯--分屏命令
在很多時候,我們需要快速地在各個檔案之間切換編輯,或者是需要快速地知道一個程式向某一個檔案輸出的結果,那麼我們有的時候會選擇將它們幾個同時開啟,通過調整視窗的位置和大小來充滿整個螢幕併合理分配螢幕位置。
但是我們要在視窗中間切換聚焦的話,還是離不開 \(Alt-Tab\) 或者滑鼠,這樣實在是非常的 \(......\) 難受。
這個時候,Vim 就為我們提供了幫助 -- 分屏命令。
通過分屏命令,我們可以在同一個編輯器視窗內開啟多個檔案,以快速地獲取輸出結果或者是同時編輯。那麼如何使用呢?
具體有如下命令:
vs filename sv filename
分別代表在當前視窗的左邊分割出一個視窗開啟檔案,以及在上面分割開啟檔案。
如何在視窗間切換聚焦呢?很簡單,使用 c-w 加上任何一個移動命令即可以切換至對應方向的下一個視窗,不過我個人建議利用對映稍稍修改,簡單化它的操作,譬如改為 Ctrl 加上任意一個方向鍵即可。
至於視窗大小的調整,抱歉還是要用滑鼠手動調整 (TAT) 。
進階篇還會陸陸續續地寫的 \(......\) 東西太多了 \(......\)
外掛篇
基礎篇裡說過,Vim 與 Emacs 之所以能成為兩大巔峰的神器是因為其高度的擴充套件與可定製性,而最能體現這一特性的就是外掛了。它們是最有魅力的一部分,是最令你無法抗拒的組成。
雖然考場上基本上不能用外掛,但是日常的學習中,外掛將對你的效率有很大的提高,而且一些外掛的部分功能可以通過 Vim 自帶實現以及配置實現。
首先,其實從前外掛的安裝必須下載之後丟到 .vim 資料夾中,刪了又要下云云,十分麻煩。於是在使用者們的搗鼓下,一枚強大的外掛管理器由此誕生——Vundle。
當然你的配置裡必須有如下兩行:
set nocompatible filetype plugin on
以確保你的 Vim 可以載入外掛,哪怕是 Vim 原生內建的外掛也需要的。
至於具體過程如下:
首先是在 home 目錄下建立資料夾 .vim。然後開啟終端輸入以下命令:
sudo apt-get install git git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
就安裝好了。
然後在 .vim 資料夾下建立資料夾 plugin 。這個資料夾用於存放那種不能用 Vundle 外掛下載,而在別的地方有得下載的指令碼外掛,名字是 xxx.vim,直接扔進這個資料夾就可以使用了。
Vundle 可以很輕鬆的管理外掛,只需要在配置中寫一下,並在 Vim 中執行 :PluginInstall
命令,就可以自動從 github 上拉取外掛,當然也拉取不了 github 上沒有的 = =。而如果不想用了什麼外掛也無須刪去,在配置中註釋掉那個外掛的相關就行了。具體配置請移步配置篇,此處將會詳細介紹我的各個外掛。
檔案管理
使用 Vim 的時候開啟檔案顯然毫不方便,不論是在目標資料夾下利用
vim filename
開啟檔案還是在 Vim 內使用 :e filename
來開啟檔案顯然都過於麻煩。那麼有沒有什麼更好的法子?
答案是顯然的,Vim 的使用者們開發了 nerdtree 這一外掛。這個外掛達到了一種類似於 VScode 中的效果——工程目錄樹,之需在左側目錄欄選中相應檔案即可開啟相應檔案。這在配置篇中將會有介紹。nerdtree 的開啟方式是在 Vim 中輸入 :NERDTreeToggle
,它會在左側開啟一個側邊欄視窗。我知道這顯然太過麻煩,所以在配置中我給它賦予了 F10 這個快捷鍵。至於具體還有什麼快捷鍵,詳請參照此文章。
也許有人要說考場上該如何呢?沒關係,Vim 自帶了一個稍遜一籌的檔案管理器 netrw 。如果你的命令是這樣的
vim 資料夾(或者說目錄)路徑
或者是在 Vim 中 e 資料夾路徑
即可開啟目錄外掛,你可以親手試一試,我覺得這個還是不難琢磨的。同時在上述兩個命令中可以用 .
來表示當前工作目錄,意思是可以用
vim .
或者在 Vim 中使用 e .
來開啟外掛
當然,如果僅是如此還不夠,使用檔案管理器開啟檔案的話,容易使工作目錄出現差錯,從而導致編譯的程式不存在於原資料夾中,所以你的配置檔案中還需以下語句:
set autochdir
它的作用是會自動把工作目錄移動到當前編輯檔案所在目錄。
美化介面
首先就是那行白乎乎的狀態列,顯示的資訊還不夠多,也不好看對吧。顯示的資訊是可以在配置中寫的,請移步配置篇。但是不好看的問題怎麼解決呢?這個時候就輪到了 airline 外掛出馬了,不多說,放兩張圖自然明白。
那麼然後呢?字型是可以在終端中設定的,Gvim 中更是有一個圖形化的選單。再就是主題了,它掌管著語法高亮的色彩,背景顏色等等。我個人推薦一個主題,那就是 onedark 。附圖一張。
使用主題的方法呢,就是在 .vim
資料夾下建立 colors
資料夾,再將主題檔案放入。其後綴名為 .vim
,如: onedark.vim
。具體配置中怎麼寫,請移步配置篇。
啟動介面
這個其實可有可無,是一個能快捷鍵開啟歷史記錄的一個外掛 vimplus-startify ,具體可以自己嘗試。(至少沒有烏干達兒童了,小聲)
小方便性外掛
commentary :快捷鍵 gc
註釋選中行, gcu
撤銷上次註釋。
ale : :w
儲存時提示語法錯誤,並且可以開啟與 airline
的攜同,狀態列上也會顯示 Error
和 Warning
。
easymotion :快速跳轉,我自己其實都不會用 233,需要可以查閱資料。
rainbow : 彩虹括號,使具有包含關係的括號顯現出不同的顏色,增強多括號程式碼的可讀性。具體還需要一些東西,Please 上作者的 github 專案觀看。
delimitMate : 括號補全功能。同時考試中可用配置實現部分功能,配置篇中會講述。
gundo :這個外掛將能夠顯示你的檔案修改樹,就像 github 上一般能夠回到歷史版本,時光機啊 QwQ 。Vim 中 :GundoToggle
即可在左側開啟時光機。但是需要 Vim 開啟 python 支援,請自行百度。
vimim :這個的安裝不在配置中,相當於 Vim 自帶中文輸入法,需在 .vim
中建立資料夾 plugin 並把 從這裡 下得的檔案扔入此資料夾中即可。開啟 Vim 並進入插入模式,按下 Ctrl + / 即可啟用。但是使用的是雲詞庫,若沒網就會卡死。所以建議下載 本地超大詞庫 ,也放入 plugin 資料夾中,與外掛指令碼同目錄即可啟用。
vim-instant-markdown :這個外掛可就厲害了。Vim 用習慣了之後什麼都想用 Vim 來做,比如想用 Vim 來寫 Markdown 並實時預覽怎麼辦?於是這個強大的外掛就誕生了,當開啟 Markdown 檔案時會自動在瀏覽器中開啟一個標籤頁,將能夠實時預覽你的 Vim 中的 markdown 內容。還有額外的需要,請至 github 首頁瞭解詳情。
一切外掛的安裝寫法及快捷鍵及配置皆在配置篇中,請移步。
配置篇
我的配置 Ps: 我就一 \(OIer\) ,講真配置不會太高階,不過這是我半年前的配置了,時刻在改哇。
結合我的配置講一講一些 Vim 中的小細節和快捷鍵以及一些…… 七裡八里的東西?
Vim 的配置語法沒那麼麻煩,基本上就是 set 開啟選項,call xxx() 呼叫函式,func 與 endfunc 定義函式,exec 執行命令,if 和 endif 描述以下條件表示式," 表示註釋,source 表示應用啥的,語法和 Vim 命令列下一模一樣,只是當你把配置檔案寫入,Vim 開啟時會自動執行配置中的每一行語句。
基礎設定
我必須說我的配置裡其實沒有背景方面的設定,因為我黑背景加個透明化很舒服了…… 接下來我會挑重要的配置來講,剩下的可以結合我的配置內的註釋來看
首先使用各種外掛容易與 vi 的模式產生衝突,所以我們要關閉 vi 的功能,那麼就有了如下配置:
set nocompatible
通過這個設定將關閉原有 vi 的功能以防衝突
隨後,當你開啟你的 cpp 檔案時,你會發現及其之醜,因為沒有了語法高亮,一切都是一個顏色了。那麼配置中需加入如下兩行
syntax enable syntax on
分別是開啟高亮支援與開啟語法高亮
然後是我們可愛的狀態列, set laststatus=2
這行配置將會使得狀態列總是顯示,而狀態列所顯示的資訊在配置中是可以設定的。設定如下:
set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ [%{(&fenc==\"\"?&enc:&fenc).(&bomb?\",BOM\":\"\")}]\ %c:%l/%L%)
這一行會使狀態列顯示包括檔案路徑,模式,檔案型別,檔案編碼,所在行數與列數,以及游標所在處是檔案的百分之多少。加上 airline 外掛,既美觀又實用。
再然後,預設情況下換行符是不可被刪除的,除非使用 dd
命令或者 J
命令才可做到。那麼我們需要 set backspace=indent,eol,start
這行配置來解除這種限制。
顯然還有一件事,那就是行號的問題。不管是評測檔案寫了多少行還是想要使用 數字 + G
的命令跳至指定行,沒有行號的顯示肯定是崩潰的。那麼可以使用 set number
開啟行號顯示的功能。然後是 Vim 的自動折行功能,那就是當某一行超過了 Vim 視窗的邊界,Vim 會怎麼做呢?多出的部分會自動顯示在下一行,而這種多出來的行前面是沒有行號的,比較好辨認,這些行被稱為螢幕行,而根據行號一一對應的便稱作實際行。但是僅僅憑著看前面的行號來辨認某個折下來的行屬於那個實際行的話,還是不夠快。我們可以使用 set cursorline
來開啟高亮顯示當前行,而這個高亮也是可以設定的,我的配置裡也有。
用 Vim 的一個煩惱事就是臨時檔案 swap
啥的 ...... 太煩了。以下兩行配置能夠禁止其生成
set nobackup" 設定不備份 set noswapfile" 禁止生成臨時檔案
至於主題...... 只需要如下一行
colorscheme xxx
xxx就是你的主題名稱 (去掉 .vim 字尾名)
然後是我們在基礎篇中提到過的,開啟滑鼠支援 set mouse=a
,以及外掛篇中提及的 set autochdir
與進階篇中有的 set fillchars=vert:\ ,stl:\ ,stlnc:\
這三個配置,作用各有提及。
其他的往我配置裡看啦 wwww。
那個 zsh
是一個 shell 的相關程式,有興趣的可以查查,特點是補全強大。 Tab
補全近乎完美,因為它對於檔名的補全遠強於 shell 終端。
還有一件事,就是檔案編碼,設定如下:
set langmenu=zh_CN.UTF-8 set helplang=cn set termencoding=utf-8 set encoding=utf8 set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030
快捷鍵設定
其實 Vim 普通模式下沒有多少按鍵是 "自由身",那麼使用者該如何定製自己的快捷鍵呢?Vim 為此提供了 leader 鍵來服務。 leader 鍵在配置中由自己定製,只需要短短一行
let mapleader = ""
雙引號之間就是你自己定義的 leader 鍵啦。
設定快捷鍵怎麼寫呢?
nnoremap 快捷鍵 指令 inoremap 快捷鍵 指令
兩行分別代表了在普通模式下和插入模式下的快捷鍵執行指令。當然指令不用想多了,沒有什麼語法,就是相當於在鍵盤上按你指令中寫下的鍵而已……
首先我的個人快捷鍵需求其實不是很多,我的 leader 鍵是 ` ,但是處於一種坐冷板凳的狀態,就更新外掛的時候用一用,不過還是很方便的,我的設定是:
nnoremap <leader><leader>i :PluginInstall<CR>
<CR>
代表回車。設定之後只需要連續按 ``i 即可更新外掛,很方便。
那麼你有沒有猜到如何利用配置寫出括號補全的部分功能呢?沒錯,就是利用快捷鍵。將插入模式下的左擴號當做快捷鍵即可,指令就是 ()
。如果補全後要使游標在括號裡怎麼辦呢?如果仔細觀察你就會發現每當退出插入模式,游標總是會向前跳一個字元,我們可以利用這一點,組合 Esc + i
不就變成了向前一個字元進行插入嗎?總結下來配置如下:
inoremap (()<esc>i inoremap [[]<esc>i inoremap """<esc>i inoremap '''<esc>i
當然我的配置裡沒有,而且我也不用括號補全外掛,其實原因是因為我希望我的撤銷樹會更合理與好看。你會發現,括號補全為了使游標回到括號內,已經退出了一次插入模式,那麼撤銷命令的效果就不完整了。而且其實插入模式下使用方向鍵,也相當與推出插入模式移動又重新回到插入模式,也會使撤銷樹不完整 = =。所以你會發現進階篇提到的,我的配置裡那個喪心病狂的東西……
還記得進階篇裡的分屏嗎?顯然使用滑鼠點選來選擇活動視窗太慢,而移動命令前加個 Ctrl + w 也不習慣對不對,所以我的做法是用 Ctrl + 移動命令來對映前面的按鍵組合。
nnoremap <c-h> <c-w>h nnoremap <c-l> <c-w>l nnoremap <c-j> <c-w>j nnoremap <c-k> <c-w>k
應該比原來的按法好記也好按…… 吧……
還記得自動折行吧,我們的 hjkl
命令其實都是在實際行之間移動,而折下來的螢幕行實在是沒法子,只能用 l
鍵不斷移過去。但實際上, g + 移動命令
便能夠使你在螢幕行間移動,因為考慮到這種移動的常用,我選擇將 g + 移動命令
與移動命令反過來對映。
noremap j gj noremap gj j noremap gk k noremap k gk
剛才也都說了,自由身的快捷鍵不多, F1~F12
就是方便而自由的快捷鍵。那用它們來幹嘛呢?
F9 一鍵編譯
我想有了之前的編譯命令,基礎篇命令列模式中的介紹,你應該大概能有個思路了吧。作出的操作肯定如下:
:w儲存 :!g++ xxx.cpp -o xxx 編譯(! 使得命令在外部執行) :!./xxx 執行
那麼如何實現呢?我傾向於寫個函式:
nnoremap <F9> :call CompileRunGcc()<CR> func! CompileRunGcc() exec "w" exec '!g++ % -o %<' exec '!time ./%<' endfunc
第一行代表執行 CompileRunGcc
函式,第二行代表定義函式,三至五行代表函式執行內容,第六行代表函式結束。 exec
表示執行命令, %
表示當前檔名, %<
表示當前檔名去掉字尾的名字。我想你應該是看得懂函式內容的。
time
選項則是回顯程式執行時間。
不過如果你使用得多了,就會發現當按下 F9 的時候轉到另一個屏即終端進行執行,但是每執行一次都會多一些資訊。如此累積的話多來幾次整個終端就滿了,這時可以使用 shell 下的命令
clear
來清屏,不過我傾向於也把它封裝在一個快捷鍵內,按 F12 就會自動清屏了,個人覺得用著挺爽……
nnoremap <F12> :call Clss()<CR> func! Clss() exec '!clear' endfunc
還有,在 Vim 中執行外部命令縱使有 :!
的方法,其實還是不方便,要是能直接在 Vim 中再開啟一個終端就好了,對吧。Vim 從 8.0 之後就增添了在內部分個屏來開啟一個終端的功能,命令是 :terminal
。我個人也將它設定成了快捷鍵,作為強迫症還是裝在了函式中 = =。我想有了命令你應該自己會寫了。
nnoremap <F8> :call Term()<CR> func! Term() exec 'terminal' endfunc
按 F8 就能在上面分出一個視窗開啟終端了。
介於更各種 Vim 版本的壓迫,Vim 作者也是奮發圖強,Vim 8.1 又更新了除錯程式,先用 packadd termdebug
開啟此設定,然後在 Vim 中輸入 :Termdebug + 編譯出的程式名稱
即可開始 GDB 的過程,具體詳細操作可以參考 這篇文章 。這個自然也被我封裝函數了 >_<。
packadd termdebug nnoremap <F11> :call GDB()<CR> func! GDB() exec 'Termdebug %<' endfunc
寫程式碼好用的
首先是 Tab 鍵,我們可以用 set tabstop=
來定義 Tab 的長度,一般當然是 4 個空格,在等於號後面填的數字是多少那麼長度就是多少空格。
然後是寫程式碼的時候,當多個括號巢狀時用肉眼顯然不好看出對應的括號,那麼我們可以用 set showmatch
開啟高亮顯示匹配括號。
有的時候開啟 Vim 是不是經常會提示有什麼 swap 檔案是否確認啥的,那個是臨時快取檔案,挺煩的,我們可以使用 set nobackup
與 set noswapfilei
來禁止其生成,這樣就方便舒爽多了(還是開著吧)。
最後嘛,大多數時候除錯程式碼都會用 freopen
來輸入輸出,再利用分屏操作來開啟 .in
.out
檔案,就可以實時看到結果。不過每次執行程式之後你都會發現因為 .out
檔案的修改而會彈出一個確認選項是否重新載入檔案,這個也是很不爽的,我們可以開啟 set autoread
選項以自動載入改動的檔案。
關於外掛
外掛篇中說到了強大的外掛管理器 Vundle,那麼在配置中該如何寫呢?框架如下:
set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin('~/.vim/自己建立的用來放外掛檔案的資料夾') call vundle#end()
在兩塊之間來寫需要安裝的外掛,格式如下:
Plugin '作者 Github 上的名字/Github 上的外掛倉庫名'
寫完儲存後進入 Vim,使用 :PluginInstall
即可自動開始安裝。
我的外掛列表:
set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin('~/.vim/plugged') Plugin 'VundleVim/Vundle.vim'" 使用Vundle的必須配置 Plugin 'scrooloose/nerdtree'" 目錄樹 Plugin 'tiagofumo/vim-nerdtree-syntax-highlight' " 目錄樹美化 Plugin 'vim-airline/vim-airline'" 狀態列美化 Plugin 'vim-airline/vim-airline-themes'" 狀態列美化主題 Plugin 'tpope/vim-commentary'" 快速註釋 Plugin 'w0rp/ale'" 語法錯誤提示 Plugin 'Lokaltog/vim-easymotion'" 快速跳轉 Plugin 'luochen1990/rainbow'" 彩虹括號 "Plugin 'Raimondi/delimitMate'" 括號補全 call vundle#end()