Vim-編輯器之神

幾點聲明:php

  • 做者只是一位小小的 \(OIer\) ,並不會什麼過於神仙的東西,我這篇文章只是幫助人入門的而已。python

  • 如有人在 OI-Wiki上見過了原文章,原做者是我 \(......\) ,真不是抄 \(......\)git

歷史與爭端

Vim 的前身是 vi,一個簡潔可是略有不足的編輯器,可是從 vi 開始,編輯器的模式區分和惟快不破的思想就已經體現的很到位了。Vim 便是 vi improved,是在 vi 本來全部的方式上進行的進一步提高,可是並不會改變 vi 的其餘本質,只是增長了更多適應現在須要的一些功能。github

vi 於 1976 年誕生,與 Emacs 不分前後,二者因其快捷的編輯被奉爲主流的神器,甚至使用者們還有爆發過 「聖戰」,便是 神的編輯器 Emacs VS 編輯器之神 Vim,可是固然分不出結果,由於各有優劣。但它們共有的特色就是高度的擴展性與高度的可定製性以及快捷方便的使用。正則表達式

即便不少人說它們老了,太過古老的東西應該淘汰掉。但既然可以留存至今,它們的彌堅性固然也是很客觀的,也會有着某些現代編輯器沒法填補的優點。shell

Vim 的模式區分是一個頗有意思的設定,普通模式與插入模式是最主要經常使用的模式,普通模式下的每一個鍵都是命令,這即是 Vim 不一樣於 Emacs 的地方,如果習慣了 Vim 的模式之間的切換,大部分都是單個鍵的命令必然比 Emacs 的無限 Ctrl 會更高效,雖然 Vim 的小容量註定比不了 Emacs 「操做系統」 這個東西那麼萬能,可是論快而言,Vim 是絕不遜色的。vim

Vim 有豐富的插件擴展,這點顯然是比配置更迷人的存在。有這些擴展性存在,Vim 成爲一個 IDE 也不會是不可能的事情。windows

可是,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

就跳出了那個幫幫烏干達的可憐兒童啥的,按 ai 鍵開始編輯新文件吧。

或者要打開某個文件的話就能夠在終端中

vim 文件路徑

能夠直接編輯文件。

基礎篇

分模式來吧。

插入模式 (insert)

插入模式的知識點其實沒有太多,輸入纔是主職是伐。

首先,從普通模式如何進入插入模式呢?有數個命令:iaAo。前兩個差異不大,i 是在光標當前位置進行寫代碼,a 是日後挪一個字符寫代碼。A 是移動到當前行尾進行插入,o 是在行尾添加換行符並在下一行插入。

而如何返回普通模式?固然是 Esc 啦。可是,Vim 的插入與普通模式切換異常頻繁,而 Esc 又太遠了,有什麼辦法呢?Vim 還提供了 Ctrl + [ 的快捷鍵來返回普通模式,是否近多了呢?

雖然說可以熟練了後,切換模式再也不是問題,可是其實有的時候咱們只是須要進入普通模式下按一次小命令,來回切換又顯得浪費了一點點時間。而 Vim 又提供了插入 - 普通模式來避免這一尷尬的問題。在插入模式下,只須要按 Ctrl + o 便可進入此模式,當進行完一次操做後又會自動回到插入模式。這樣豈不是更省時間?

普通模式 (normal)

Vim 的命令大部分都是在普通模式下完成的,普通模式下可不能亂按,能夠說每一個鍵都是命令。

首先是 hjkl 四個方向鍵。                         
                                              k ^
                                           h <     > l
                                                v j

其實大多數編輯器都是用方向鍵作出移動命令,Vim 也不例外,但 hjkl 給了咱們更好的選擇,只須要一段時間的適應,你便能快速地操做它們進行移動,並且它們可沒有方向鍵那麼遠,節省時間是一流的。

普通模式下最重要的命令,沒有之一,那就是 u。撤銷命令,做用是撤銷上一次對文本的更改,普通模式下的 xdp 命令都會被撤銷,同時進入一次插入模式所編輯的文本也算一次更改,u 命令會刪去從進入到退出插入模式所輸入的全部東西。與之對應的是 Ctrl + r 命令,他的做用是撤銷上次的撤銷命令,至關於大部分 windows 下程序中的 Ctrl + y

而後的話, 就是普通模式下經常使用的命令。因爲對行命令的使用很頻繁,因此大部分的單鍵命令均可以經過按兩次來實現對行操做。經常使用命令是 x ,用於刪除光標後的一個字符。而後是 d 命令,也是刪除,可是種類更多,這裏不作贅述。同時 d 命令像以前說的,按兩次便可刪除整行,即 dd

而後是y命令,能夠複製被選中的區域,這涉及到可視模式,即按 v 進入可視模式,多用於選中區域。進入可視模式後移動光標來肯定選取範圍是能夠的,此時按 o 鍵便可切換活動端,省去了若是跑反方向的麻煩。固然,我相信不少人仍是習慣用鼠標操做這一過程的,包括移動光標。Vim 很舒適的提供了這一配置:set mouse=a。你能夠將它寫入你的配置文件中去。有了它以後,你將可以用鼠標選中區域並進行復制操做。固然,選中後按 xd 亦可刪除。同時,y 也符合 d 的性質,yy 將能夠複製當前行。

而後就是更快的跳躍了。若是說只是使用 hjkl 的話,光標的移動顯然不夠快,而鼠標卻又要伸手去拿。Vim 提供了普通模式下更快的跳躍方法,w 能夠跳到下個單詞的開頭,而 e 能夠跳到當前單詞結尾,0 能夠跳至行首,$ 能夠跳至行尾,豈不是快多了?並且 we0$ 還能夠用於許多命令中 dedwd0d& 分別對應刪至單詞尾,刪至下個單詞頭,刪至行首,刪至行尾。以及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 的時候,徹底不絕望有沒有,一個小命令,妙趣橫生。瞬間全部 intlong 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 註定比其餘編輯器會多出兩個鍵的按鍵 -- Esci。就像走路的時候別人都是邁步子,可是你必定要跳一下再走一步,這種重複使人十分煩躁與無奈。這能夠說是一個致命的缺點,可是,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 插件出馬了,很少說,放兩張圖天然明白。

airline1

airline2

那麼而後呢?字體是能夠在終端中設置的,Gvim 中更是有一個圖形化的菜單。再就是主題了,它掌管着語法高亮的色彩,背景顏色等等。我我的推薦一個主題,那就是 onedark 。附圖一張。

onedarktheme

使用主題的方法呢,就是在 .vim 文件夾下創建 colors 文件夾,再將主題文件放入。其後綴名爲 .vim ,如:onedark.vim。具體配置中怎麼寫,請移步配置篇。

啓動界面

這個其實無關緊要,是一個能快捷鍵打開歷史記錄的一個插件 vimplus-startify ,具體能夠本身嘗試。(至少沒有烏干達兒童了,小聲)

小方便性插件

commentary :快捷鍵 gc 註釋選中行,gcu 撤銷上次註釋。

ale ::w 保存時提示語法錯誤,而且能夠開啓與 airline 的攜同,狀態欄上也會顯示 ErrorWarning

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 nobackupset 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()
相關文章
相關標籤/搜索