必威电竞|足球世界杯竞猜平台

VIM
來源:互聯(lián)網(wǎng)

Vim是一個(gè)類似于Vi的著名的功能強(qiáng)大、高度可定制的文本編輯器,在Vi的基礎(chǔ)上改進(jìn)和增加了很多特性。 VIM是自由軟件

Vim普遍被推崇為類Vi編輯器中最好的一個(gè),事實(shí)上真正的勁敵來自Emacs的不同變體。1999 年Emacs被選為Linuxworld文本編輯分類的優(yōu)勝者,Vim屈居第二。但在2000年2月Vim贏得了Slashdot Beanie的最佳開放源代碼文本編輯器大獎(jiǎng),又將Emacs推至二線,總的來看, Vim和Emacs在文本編輯方面都是非常優(yōu)秀的。

發(fā)展歷程

Vim是從 vi 發(fā)展出來的一個(gè)文本編輯器。代碼補(bǔ)全、編譯及錯(cuò)誤跳轉(zhuǎn)等方便編程的功能特別豐富,在程序員中被廣泛使用,和Emacs并列成為類Unix系統(tǒng)用戶最喜歡的文本編輯器。

使用vim先知道其設(shè)計(jì)理念是很重要的,有助于記憶,舉一反三。

2019年6月,Vim 和 NeoVim?曝出了一個(gè)允許任意代碼執(zhí)行的高危漏洞。漏洞編號(hào)?CVE-2019-12735,Vim 8.1.1365 和 Neovim 0.3.6 之前的版本都受到影響。漏洞位于編輯器的 ?modelines 功能中,該功能允許用戶指定窗口大小和其它定制選項(xiàng),modelines 限制了沙盒內(nèi)可用的指令。

1.vim的設(shè)計(jì)理念是組合;

命令組合:

Vim強(qiáng)大的編輯能力中很大部分是來自于其普通模式命令。vim的設(shè)計(jì)理念是命令的組合。例如普通模式命令"dd"刪除當(dāng)前行,"dj"代表刪除到下一行,原理是第一個(gè)"d"含義是刪除,"j"鍵代表移動(dòng)到下一行,組合后"dj"刪除當(dāng)前行和下一行。另外還可以指定命令重復(fù)次數(shù),"2dd"(重復(fù)"dd"兩次),和"dj"的效果是一樣的。"d^","^"代表行首,故組合后含義是刪除到光標(biāo)開始到行首間的內(nèi)容(不包含光標(biāo));"d$" $"代表行尾,刪除到行尾的內(nèi)容(包含光標(biāo));用戶學(xué)習(xí)了各種各樣的文本間移動(dòng)/跳轉(zhuǎn)的命令和其他的普通模式的編輯命令,并且能夠靈活組合使用的話,能夠比那些沒有模式的編輯器更加高效的進(jìn)行文本編輯。

模式間的組合:

在普通模式中,有很多方法可以進(jìn)入插入模式。比較普通的方式是按"a"(append/追加)鍵或者"i"(insert/插入)鍵。

2.很多快捷鍵設(shè)置和正則表達(dá)式類似,可以輔助記憶; ^ $ w 等

3. vim針對(duì)程序員做了優(yōu)化;

寫代碼的時(shí)候手需要時(shí)刻保持在鍵盤上,隨機(jī)定位代碼、隨機(jī)刪除代碼、移動(dòng)代碼、插入代碼的操作大大多于閱讀、翻頁操作,中間卡頓一下效率就大大降低了;但對(duì)普通用戶而言,順序?qū)憽⒃O(shè)置字體格式、翻頁讀多于隨機(jī)寫刪除操作, 且每個(gè)動(dòng)作之間本身就有很多的停頓,用其他UI編輯器(word,notePad++等)效率反而比VIM高效,使用vim進(jìn)行操作只會(huì)徒增你的疑惑: vim為什么這么流行。(如果你不是一個(gè)代碼開發(fā)者,估計(jì)你看完這段話也無法感同身受,建議先去學(xué)一門編程語言,新手推薦學(xué)C,java入門,做一道50行代碼的課后習(xí)題,來感受下寫代碼的過程)

Bram Moolenaar 在 80 年代末購入他的Amiga計(jì)算機(jī)時(shí),Amiga 上沒有他最常用的編輯器vi。Bram 從一個(gè)開源的 vi 復(fù)制 Stevie 開始,開發(fā)了 Vim 的 1.0 版本。最初的目標(biāo)只是完全復(fù)制 vi 的功能,那個(gè)時(shí)候的 Vim 是Vi IMitation(模擬)的簡稱。1991 年 Vim 1.14 版被 "Fred Fish Disk #591" ——Amiga 用的免費(fèi)軟體集收錄了。1992 年 1.22 版本的 Vim 被移植到了 unix 和MS-DOS上。從那個(gè)時(shí)候開始,Vim 的全名就變成 Vi IMproved(改良)了。

在這之后,Vim 加入了不計(jì)其數(shù)的新功能。做為第一個(gè)里程碑的是 1994 年的 3.0 版本加入了多視窗編輯模式(分割視窗)。從那之后,同一熒幕可以顯示的 Vim 編輯文件數(shù)可以不止一個(gè)了。1996 年發(fā)布的 Vim 4.0 是第一個(gè)利用圖形接口(GUI)的版本。1998 年 5.0 版本的 Vim 加入了 highlight(語法高亮)功能。2001 年的 Vim 6.0 版本加入了代碼折疊插件、多國語言支持、垂直分割視窗等功能。2006 年 5 月發(fā)布的 Vim 7.0 版更加入了拼字檢查、上下文相關(guān)補(bǔ)完,標(biāo)簽頁編輯等新功能。 2008 年 8 月發(fā)布的 Vim 7.2,該版本合并了 vim 7.1 以來的所有修正補(bǔ)丁,并且加入了腳本的浮點(diǎn)數(shù)支持,2010年08月15日,歷時(shí)兩年的時(shí)間,vim又發(fā)布了vim 7.3這個(gè)版本,這個(gè)版本修復(fù)了前面版本的一些bug,以及添加了一些新的特征,這個(gè)版本比前面幾個(gè)版本來的要更加優(yōu)秀。

4.2016年9月12日 Vim 8.0

十年以后,Vim 終于發(fā)布了一個(gè)新的大版本 8.0,結(jié)束了從 2006 年 5 月 7 日開始的 7.0 世代。雖然這十年間,Vim 也一直在不斷更新,從 7.0 到三年前的 7.4,每隔一兩年或兩三年就會(huì)有個(gè)小版本更新,但是這次跨越大版本更新,帶來了不少新的特性,據(jù)說有一些是從其它的 Vi 流派吸收來的特性。

主要功能

根據(jù)設(shè)定可以和原始vi完全兼容

多緩沖編輯、多tab編輯

任意個(gè)數(shù)的分割窗口(橫,豎)

vim7開始,支持多種數(shù)據(jù)類型,比如具備列表和字典功能、以及(簡單形式)面向?qū)ο缶幊痰哪_本語言vim script,對(duì)功能進(jìn)行高度定制化。

可以在腳本中調(diào)用 Perl,Ruby, Python,Tcl, MzScheme ,C,C++

單詞縮寫功能

動(dòng)態(tài)單詞補(bǔ)全

多級(jí)樹狀撤銷和重做操作

對(duì)應(yīng)550種以上文本文件的語法高亮

殼層LISP,C/C++, Perl, Java, Ruby, Python 等40種以上語言的自動(dòng)縮排

利用ctags的標(biāo)簽中跳轉(zhuǎn)

崩潰后文件恢復(fù)

光標(biāo)位置和打開的緩沖狀態(tài)的保存、復(fù)原(session功能)

可以對(duì)兩個(gè)文件進(jìn)行差分,同步功能的diff模式

遠(yuǎn)程文件編輯。

vim 8.0新增功能

支持異步 I/O 和通道(channels)、JSON

多任務(wù)

定時(shí)器

Partial、Lambda 和閉包

插件包管理

根據(jù)時(shí)間戳合并viminfo

Windows用戶:支持 DirectX

支持 GTK+ 3

學(xué)習(xí)方法

Vim已經(jīng)有各主流系統(tǒng)的版本,盡管vim較vi已經(jīng)改良了不少,但是初次使用還是會(huì)一頭霧水,不知如何操作,所以學(xué)習(xí)vim要首先過2關(guān)。第一關(guān)是理解vim的設(shè)計(jì)思路,vim設(shè)計(jì)之初就是整個(gè)文本編輯都用鍵盤而非鼠標(biāo)來完成,鍵盤上幾乎每個(gè)鍵都有固定的用法,且vim的制作者希望用戶在普通模式(也就是命令模式,只可輸入命令)完成大部分的編輯工作,將此模式設(shè)計(jì)為默認(rèn)模式,初學(xué)者打開vim,如果直接輸入單詞,結(jié)果就會(huì)滴滴亂響,這是因?yàn)関im把用戶輸入的單詞理解為命令了。第二關(guān)是命令關(guān),vim有過百條命令對(duì)應(yīng)編輯的需要,如果能熟練使用vim這些命令,編輯速度確實(shí)比鼠標(biāo)要快很多,但是想全都記住它們也是一件難事,我想記住它們最好的方法就是多多來練習(xí),確實(shí)把vim用在日常的文本編輯中去,且遇到難題不要放棄,而是查找解決的方法,每解決一個(gè)難題,你的vim技能就上升一級(jí)。

其實(shí), Vim與其它編輯器一個(gè)很大的區(qū)別在于, 它可以完成復(fù)雜的編輯與格式化功能. 在這些領(lǐng)域很少有軟件能與它分庭抗禮, 但是, 與所有的靈活性的代價(jià)一樣, 你需要用自己的雙手來實(shí)現(xiàn)它. 這在事實(shí)上造成了用戶在使用Vim過程中的幾個(gè)自然階段。

一開始,notepad,Visual Studio,Microsoft Word等壟斷你的大腦, 這些東西根深蒂固, 揮之不去。Vim的使用對(duì)你而言是一場噩夢(mèng), 它降低而不是提高了你的工作效率. 對(duì)三種工作模式的不解甚至使你認(rèn)為它是一個(gè)充滿BUG或者至少是一個(gè)古怪的與當(dāng)今友好用戶界面設(shè)計(jì)嚴(yán)重脫節(jié)的軟件。事實(shí)上, 這些起初看起來古怪的特性是Vim(或者是vi)的作者和它的用戶們?cè)谧约郝L的文字編輯程序設(shè)計(jì)生涯中總結(jié)出來的最快速最實(shí)在的操作, 在幾乎等于計(jì)算機(jī)本身歷史的成長期中, 歷經(jīng)無數(shù)嚴(yán)厲苛刻的計(jì)算機(jī)用戶的批評(píng)與檢驗(yàn), 無用的特性或糟糕的設(shè)計(jì)在Vim用戶群面前根本就沒有生存的余地. Vim細(xì)心而謹(jǐn)慎的作者們也不允許自己精心設(shè)計(jì)的軟件里有這樣?xùn)|西。

第二個(gè)階段,你開始熟悉一些基本的操作, 這些操作足以應(yīng)付你日常的工作, 你使用這些操作時(shí)根本就不假思索. 但這些階段你仍然很少去碰Vim那晦澀的在線幫助文檔. 它在你心里只是notepad、Visual Studio的勉強(qiáng)合格的替代品。

第三個(gè)階段, 精益求精的你不滿足于無休無止的簡單操作, 冗長而乏味,有沒有更好的辦法可以四兩拔千斤. 于是, 從unix參考手冊(cè)上, 從同事口中, 你漸漸叩開:help xxx的大門. 開始探索里面充滿魔力的咒語. 從雜耍般的帶有表演性質(zhì)的技巧開始, 這些技巧令人眩目但少有實(shí)用性. 不過這卻是你擁有魔力的第一步. 接下來, 你開始認(rèn)識(shí)到這些咒語背后的真經(jīng), 開始偷偷修改一些奇怪的符號(hào), 于是, 奇跡產(chǎn)生了, 魔力不但仍然有效, 而且真實(shí)地作用于你現(xiàn)實(shí)中的文字編輯生活. 你在第二階段由于熟練操作而塵封已久的大腦突然開始運(yùn)作. 但這個(gè)過程并非是達(dá)到某個(gè)臨界狀態(tài)后的一路坦途, 不斷的挫折, 新的挑戰(zhàn), 看似Mission Impossible的任務(wù)永遠(yuǎn)伴隨著任何一個(gè)人的任何一個(gè)學(xué)習(xí)過程. 這是你使用Vim的最后一個(gè)階段, 也是最漫長最有挑戰(zhàn)性同時(shí)也充滿無數(shù)奇趣的階段. 這個(gè)階段里你開始定制一些希奇古怪的顏色. 開始以敲入i18n來輸入internationalization, 開始讓Vim替你糾正經(jīng)常把the 誤敲成teh的毛病, 開始讓Vim與系統(tǒng)里各種精悍而強(qiáng)大的兄弟工具進(jìn)行合作, 開始寫越來越長的script, 每一次的文本編輯體驗(yàn)都妙趣橫生高潮迭起. 你的頭腦因?yàn)橐肰im完成高效的編輯而高度緊張. 你開始在Vim郵件列表里提一些確實(shí)是問題的問題. 也開始發(fā)現(xiàn)你在Vim里做了以前在殼層里做的幾乎一切事. 事實(shí)上你已經(jīng)成了一個(gè)無可救藥的Vim骨灰級(jí)玩家。

高效率移動(dòng)

1、在插入模式之外 基本上來說,你應(yīng)該盡可能少的呆在插入模式里面,因?yàn)樵诓迦肽J嚼锩?VIM 就像一個(gè)“啞巴”編輯器一樣。很多新手都會(huì)一直呆在插入模式里面,因?yàn)檫@樣易于使用。但 VIM 的強(qiáng)大之處在于他的命令模式!你會(huì)發(fā)現(xiàn),在你越來越了解 VIM 之后,你就會(huì)花越來越少的時(shí)間使用插入模式了。

2、使用 h、j、k、l

使用 VIM 高效率編輯的第一步,就是放棄使用箭頭鍵。使用 VIM,你就不用頻繁的在箭頭鍵和字母鍵之間移來移去了,這會(huì)節(jié)省你很多時(shí)間。當(dāng)你在命令模式時(shí),你可以用 h、j、k、l 來分別實(shí)現(xiàn)左、下、上、右箭頭的功能。一開始可能需要適應(yīng)一下,但一旦習(xí)慣這種方式,你就會(huì)發(fā)現(xiàn)這樣操作的高效之處了。

在你編輯你的電子郵件或者其他有段落的文本時(shí),你可能會(huì)發(fā)現(xiàn)使用方向鍵和你預(yù)期的效果不一樣,有時(shí)候可能會(huì)一次跳過了很多行。這是因?yàn)槟愕亩温湓?VIM 看來是一個(gè)大的長長的行。這時(shí)你可以在按 h、j、k 或者 l 之前鍵入一個(gè)g,這樣 VIM 就會(huì)按屏幕上面的行如你所愿的移動(dòng)了。

3、在當(dāng)前行里面有效的移動(dòng)光標(biāo)

很多編輯器只提供了簡單的命令來控制光標(biāo)的移動(dòng)(比如左、上、右、下、到行首/尾等)。VIM 則提供了很多強(qiáng)大的命令來滿足你控制光標(biāo)的欲望。當(dāng)光標(biāo)從一點(diǎn)移動(dòng)到另外一點(diǎn),在這兩點(diǎn)之間的文本(包括這兩個(gè)點(diǎn))稱作被“跨過”,這里的命令也被稱作是 motion。(簡單說明一下,后面會(huì)用到這個(gè)重要的概念)

4、常用到的一些命令(motion

fx:移動(dòng)光標(biāo)到當(dāng)前行的下一個(gè) x 處。很明顯,x 可以是任意一個(gè)字母,而且你可以使用 ; 來重復(fù)你的上一個(gè) f 命令。

tx:和上面的命令類似,但是是移動(dòng)到 x 的左邊一個(gè)位置。(這真的很有用)

Fx:和 fx 類似,不過是往回找。使用 , 來重復(fù)上一個(gè)F命令。

Tx:和 tx 類似,不過是往回移動(dòng)到 x 的右邊一個(gè)位置。

b:光標(biāo)往前移動(dòng)一個(gè)詞。

w:光標(biāo)往后移動(dòng)一個(gè)詞。

0:移動(dòng)光標(biāo)到當(dāng)前行首。(是數(shù)字0)

^:移動(dòng)光標(biāo)到當(dāng)前行的第一個(gè)字母位置。

$:移動(dòng)光標(biāo)到行尾。

):移動(dòng)光標(biāo)到下一個(gè)句子。

( :移動(dòng)光標(biāo)到上一個(gè)句子。

5、在整個(gè)文件里面有效移動(dòng)光標(biāo)

VIM 有很多命令,可以用來到達(dá)文件里面你想到達(dá)的地方。下面是一些在文件里面移動(dòng)的命令:

:向下移動(dòng)一屏。

:向下移動(dòng)半屏。

:向上移動(dòng)一屏。

:向上移動(dòng)半屏。

G:到文件尾

numG:移動(dòng)光標(biāo)到指定的行(num)。(比如 10G 就是到第 10 行)

gg:到文件首H:移動(dòng)光標(biāo)到屏幕上面

M:移動(dòng)光標(biāo)到屏幕中間

L:移動(dòng)光標(biāo)到屏幕下面

*:讀取光標(biāo)處的字符串,并且移動(dòng)光標(biāo)到它再次出現(xiàn)的地方。

#:和上面的類似,但是是往反方向?qū)ふ摇?/p>

/text:從當(dāng)前光標(biāo)處開始搜索字符串 text,并且到達(dá) text 出現(xiàn)的地方。必須使用回車來開始這個(gè)搜索命令。如果想重復(fù)上次的搜索的話,按 n移動(dòng)到下個(gè) text 處,N 移動(dòng)到上一個(gè) text 處。

?text:和上面類似,但是是反方向。

m{a-z}:在當(dāng)前光標(biāo)的位置標(biāo)記一個(gè)書簽,名字為 a-z 的單個(gè)字母。書簽名只能是小寫字母。你看不見書簽的存在,但它確實(shí)已經(jīng)在那里了。

`a:到書簽 a 處。注意這個(gè)不是單引號(hào),它一般位于大部分鍵盤的 1 的左邊。

`.:到你上次編輯文件的地方。這個(gè)命令很有用,而且你不用自己去標(biāo)記它。

%:在成對(duì)的括號(hào)等符號(hào)間移動(dòng),比如成對(duì)的 [ ] , { }, ( ) 之間。將光標(biāo)放到任意符號(hào)上,然后通過 % 來移動(dòng)到和這個(gè)符號(hào)匹配的符號(hào)上,% 還可以正確的識(shí)別括號(hào)的嵌套層數(shù),總是移動(dòng)到真正匹配的位置上。因此這個(gè)命令在編輯程序代碼的時(shí)候非常有用,可以讓你方便的在一段代碼的頭尾間移動(dòng)。

高效的輸入

1、使用關(guān)鍵詞自動(dòng)完成

VIM 有一個(gè)非常漂亮的關(guān)鍵詞自動(dòng)完成系統(tǒng)。這表示,你可以輸入一個(gè)長詞的一部分,然后按一下某個(gè)鍵,然后 VIM 就替你完成了這個(gè)長詞的輸入了。舉個(gè)例子:你有一個(gè)變量名為 iAmALongAndAwkwardVarName 在你寫的代碼的某個(gè)地方。也許你不想每回都自己一個(gè)一個(gè)字母的去輸入它。

使用關(guān)鍵詞自動(dòng)完成功能,你只需要輸入開始幾個(gè)字母(比如 iAmAL),然后按 (按住 Ctrl,再按 N)或者 。如果 VIM 沒有給出你想要的詞,繼續(xù)按,直到你滿意為止,VIM 會(huì)一直循環(huán)它找到的匹配的字符串。

2、聰明的進(jìn)入插入模式

很多新手進(jìn)入插入模式都只是用 i。這樣當(dāng)然可以進(jìn)入插入模式,但通常不是那么合適,因?yàn)?VIM 提供了很多進(jìn)入插入模式的命令。下面是最常用的一些:

i:在當(dāng)前字符的左邊插入

I:在當(dāng)前行首插入

a:在當(dāng)前字符的右邊插入

A:在當(dāng)前行尾插入

o:在當(dāng)前行下面插入一個(gè)新行

O:在當(dāng)前行上面插入一個(gè)新行

c{motion}:刪除 motion 命令跨過的字符,并且進(jìn)入插入模式。比如:c$,這將會(huì)刪除從光標(biāo)位置到行尾的字符并且進(jìn)入插入模式。ct!,這會(huì)刪除從光標(biāo)位置到下一個(gè)嘆號(hào)(但不包括),然后進(jìn)入插入模式。被刪除的字符被存在了剪貼板里面,并且可以再粘貼出來。

d{motion}:和上面差不多,但是不進(jìn)入插入模式。

3、有效的移動(dòng)大段的文本

使用可視選擇(visual selections)和合適的選擇模式

不像最初的 VI,VIM 允許你高亮(選擇)一些文本,并且進(jìn)行操作。這里有三種可視選擇模式:

v:按字符選擇。經(jīng)常使用的模式,所以親自嘗試一下它。

V:按行選擇。這在你想拷貝或者移動(dòng)很多行的文本的時(shí)候特別有用。

:按塊選擇。非常強(qiáng)大,只在很少的編輯器中才有這樣的功能。你可以選擇一個(gè)矩形塊,并且在這個(gè)矩形里面的文本會(huì)被高亮。

在選擇模式的時(shí)候使用上面所述的方向鍵和命令(motion)。比如,vwww,會(huì)高亮光標(biāo)前面的三個(gè)詞。Vjj 將會(huì)高亮當(dāng)前行以及下面兩行。

4、在可視選擇模式下剪切和拷貝

一旦你高亮了選區(qū),你或許想進(jìn)行一些操作:

d:剪貼選擇的內(nèi)容到剪貼板。

y:拷貝選擇的內(nèi)容到剪貼板。

c:剪貼選擇的內(nèi)容到剪貼板并且進(jìn)入插入模式。

在非可視選擇模式下剪切和拷貝

如果你很清楚的知道你想拷貝或者剪切什么,那你根本就不需要進(jìn)入可視選擇模式。這樣也會(huì)節(jié)省時(shí)間:

d{motion}:剪切 motion 命令跨過的字符到剪貼板。比如,dw 會(huì)剪切一個(gè)詞而 dfS 會(huì)將從當(dāng)前光標(biāo)到下一個(gè) S 之間的字符剪切至剪貼板。

y{motion}:和上面類似,不過是拷貝。

c{motion}:和 d{motion} 類似,不過最后進(jìn)入插入模式。

dd:剪切當(dāng)前行。

yy:拷貝當(dāng)前行。

cc:剪切當(dāng)前行并且進(jìn)入插入模式。

D:剪切從光標(biāo)位置到行尾到剪貼板。

Y:拷貝當(dāng)前行。

C:和 D 類似,最后進(jìn)入插入模式。

x:剪切當(dāng)前字符到剪貼板。

s:和x類似,不過最后進(jìn)入插入模式。

5、粘貼

粘貼很簡單,按 p。

6、使用多重剪貼板

很多編輯器都只提供了一個(gè)剪貼板。VIM 有很多。剪貼板在 VIM 里面被稱為寄存器(Registers)。你可以列出當(dāng)前定義的所有寄存器名和它們的內(nèi)容,命令為“:reg”。最好使用小寫字母來作為寄存器的名稱,因?yàn)榇髮懙挠行┍?VIM 占用了。

使用寄存器的命令為雙引號(hào)“。

比如:我們要拷貝當(dāng)前行到寄存器 k。你應(yīng)該按“kyy。(你也可以使用 V”ky。為什么這樣也可以呢?)當(dāng)前行應(yīng)該已經(jīng)存在了寄存器 k 里面直到你又拷貝了一些東西進(jìn)入寄存器 k。你可以使用命令“kp 來粘貼寄存器 k 里面的內(nèi)容到你想要的位置。

7、避免重復(fù)

令人驚奇的 . 命令

在 VI 里面,輸入 . (小數(shù)點(diǎn)符號(hào)),將會(huì)重復(fù)你輸入的上一個(gè)命令。比如,你上個(gè)命令為“dw”(刪除一個(gè)詞),VI 將會(huì)接著再刪除一個(gè)詞。

8、使用數(shù)字

使用數(shù)字也是 VIM 強(qiáng)大的而且很節(jié)省時(shí)間的重要特性之一。在很多 VIM 的命令之前都可以使用一個(gè)數(shù)字,這個(gè)數(shù)字將會(huì)告訴 VIM 這個(gè)命令需要執(zhí)行幾次。比如:

3j 將會(huì)把光標(biāo)向下移動(dòng)三行。

10dd 將會(huì)刪除十行。

y3t″ 將會(huì)拷貝從當(dāng)前光標(biāo)到第三個(gè)出現(xiàn)的引號(hào)之間的內(nèi)容到剪貼板。

數(shù)字是擴(kuò)展 motion 命令作用域非常有效的方法。

高效讀代碼

建議在vim上安裝Taglist+cscope+ctags插件有利于高效讀代碼,有利于學(xué)習(xí)!

1、安裝

對(duì)于小編我來說我使用的是Ubuntu,安裝軟件一般使用的命令是APT install ***!

對(duì)于vim+Taglist+cscope+ctags組合編輯器的創(chuàng)建,vim , cscope , ctags安裝起來比較方便使用上述命令即可安裝!

(對(duì)于不同的Linux發(fā)行版本安裝軟件的命令不太一樣,需要根據(jù)自己的安裝版稍微修改,比如說fedora即使用yum命令安裝)

對(duì)于Taglist使用這個(gè)方法安裝不了,我們需要先下載,然后安裝完成:

首先上網(wǎng)下載Taglist插件,下載完成后解壓,再將文件下的taglist.vim使用cp命令拷貝到HOME/.vim/plugin文件夾下(cp -r taglist.vim ~/.vim/plugin)

2、vim的配置

vim是一個(gè)非常好用的編輯工具,以下介紹幾個(gè)常用的底行模式命令:

(1). 設(shè)置縮進(jìn)

:set smartindent // 設(shè)置縮進(jìn)

:set smartindent shiftwidth=4 // c語言自動(dòng)縮進(jìn),縮進(jìn)值為4個(gè)字符寬度

(2). 顯示光標(biāo)行列信息

:set ruler // 顯示光標(biāo)信息(右下角)

(3). 查看制表符

:set list // 顯示制表符,以^符號(hào)顯示制表符的位置

(4). 查看行數(shù)信息

:set number //顯示行號(hào)(左邊)

(5). 關(guān)鍵字高亮

:syntax on //關(guān)鍵字高亮

(6). 多文件編輯,在編寫程序時(shí)有可能需要同時(shí)編輯多個(gè)文件,在這種情況下,需要如下設(shè)置

: split two.c // 多文件編輯

當(dāng)然,如果不嫌麻煩,可以在每次打開Vim時(shí) 輸入如上命令,如我經(jīng)常用的是:set number :set ruler :syntax on :set smartindent 命令,如果將平時(shí)在底行模式下輸入的命令直接寫入配置文件,則以后使用Vim時(shí)不用再次輸入這些命令。

首先,試著在Vi的底行模式下輸入如下命令,如果不支持的話,去下載一個(gè)Vim的全版本,sudo APT install vim-full。

以下是修改配置文件的方法:

(1). 找到Vimrc文件。

(2)查看文件的權(quán)限:

ls -l vimrc

shisir@shisir-desktop:/usr/share/vim$ cd /etc/vim

shisir@shisir-desktop:/etc/vim$ ls

gvimrc vimrc vimrc.tiny

shisir@shisir-desktop:/etc/vim$ ls -l vimrc

-rrr-- 1 root root 2492 2009-04-10 08:08 vimrc

(3)如果沒有寫權(quán)限的話,修改權(quán)限,使我們可以修改該配置文件

sudo chmod a+w vimrc

(4)根據(jù)個(gè)人需要將上述命令寫入配置文件

比如,我個(gè)人的設(shè)置是: syntax on , set ruler ,set number , set smartindent shiftwidth=4

下面貼上我的vimrc文件的配置信息:

"顯示行號(hào)

set number

"檢測文件的類型

filetype on

"記錄歷史的行數(shù)

set history=1000

"自動(dòng)對(duì)齊

set autoindent

set cindent

"智能選擇對(duì)齊方式

set smartindent

"tab為4個(gè)空格

set tabstop=4

"當(dāng)前行之間交錯(cuò)時(shí)使用4個(gè)空格

set shiftwidth=4

"設(shè)置匹配模式,輸入左括號(hào)會(huì)出現(xiàn)右括號(hào)

set showmatch

"編輯時(shí)顯示光標(biāo)狀態(tài)

set ruler

"快速匹配

set incsearch

"修改文件自動(dòng)備份

if has("vms")

set nobackup

else

set backup

endif

"""""""""""""設(shè)置開啟ctags"""""""""""""

settags=/home/zhouyl/linux-3.4.7/tags;"這邊設(shè)置的是你使用ctags -R的目錄,后面有介紹!你根據(jù)自己的使用修改這個(gè)路徑

set autochdir

"""""""""""""""""Taglist設(shè)置"""""""""""""""""

""let Tlist_Auto_Open = 1

let Tlist_Ctags_Cmd = '/usr/bin/ctags'

let Tlist_Show_One_File = 1

let Tlist_Exit_OnlyWindow = 1

""""""""""""""""""""""cscope設(shè)置""""""""""""""""""

set cscopequickfix=s-,c-,d-,i-,t-,e-

if has("cscope")

set csprg=/usr/bin/cscope

set csto=1

set cst

set nocsverb

" add any database in current directory

if filereadable("cscope.out")

cs add cscope.out

endif

set csverb

endif

因?yàn)槲业奈臋n中的原配置文件已經(jīng)有了語法高亮:

" Vim5 and later versions support SYNTAX highlighting. Uncommenting the next

" line enables syntax highlighting by default.

if has("syntax")

syntax on

endif

所以我就沒寫了,您如果vimrc文件里面沒有此項(xiàng)建議自己加上syntax on 設(shè)置語法高亮

PS:在配置文件中"符號(hào)后的內(nèi)容是注釋,而且在配置文件中是不需要添加符號(hào)的,這里關(guān)于cscope、ctags和Taglist的設(shè)置可以先寫上,后面將對(duì)這三個(gè)插件有介紹。好了,去開一個(gè)Vim,編輯一個(gè)程序看看,是不是感覺很不一般呢?

好了,下面順便演示下,智能補(bǔ)全的用法,我分四種情況:1、前面申明過的變量或者函數(shù)名的補(bǔ)全;2、結(jié)構(gòu)體等自建結(jié)構(gòu)的補(bǔ)全;3、標(biāo)準(zhǔn)模板庫等標(biāo)準(zhǔn)庫的補(bǔ)全;4、括號(hào)、引號(hào)等自動(dòng)匹配補(bǔ)全。

對(duì)于第一種情況,寫程序的過程中,直接用CTRL+p即可選擇,對(duì)于第二種情況,如果想申明了結(jié)構(gòu)體T,想在輸入T.時(shí)彈出成員供選擇,只需在用之前按一下:CTRL+F12,然后效果如圖:

3、Taglist插件的使用

TagList插件,是一款基于ctags,在vim代碼窗口旁以分割窗口形式(如上圖所示)顯示當(dāng)前的代碼結(jié)構(gòu)概覽,增加代碼瀏覽的便利程度的vim插件.

在Vim中加載代碼文件后,可以使用以下命令控制taglist

:TlistOpen 打開并將輸入焦點(diǎn)至于標(biāo)簽列表窗口,效果如上圖所示

:TlistClose 關(guān)閉標(biāo)簽列表窗口

:TlistToggle 切換標(biāo)簽列表窗口狀態(tài)(打開←→關(guān)閉),標(biāo)簽列表窗口是否獲得焦點(diǎn)取決于其他配置

ctl-w + w 或ctl-w + 方向鍵 窗口切換(taglist本質(zhì)上是一個(gè)vim分隔窗口,因此可以使用ctl-w系列快捷鍵對(duì)窗口進(jìn)行切換操作)

在Taglist窗口主要有以下操作

一級(jí)方程式錦標(biāo)賽:打開幫助

回車鍵:跳到光標(biāo)所在的標(biāo)記的定義處(如將光標(biāo)移到main函數(shù),按回車鍵)

o:新建一個(gè)窗口,跳到標(biāo)記定義處

p:預(yù)覽標(biāo)記定義(仍然在taglist窗口)

空格:顯示標(biāo)記的原型(如函數(shù)原型)

u:更新標(biāo)記列表(比如源文件新增了一個(gè)函數(shù),并在保存后,可在taglist窗口按u)

s:選擇排序字段(暫時(shí)我也不知道什么意思)

d:刪除光標(biāo)所在的taglist文件(如用vi打開了兩個(gè)文件f1.c,f2.c可以刪除f1.c的標(biāo)記)

x:n放大/縮小taglist窗口

+:展開(指標(biāo)記)

-:折疊

*:全部展開

=:全部折疊

[[:將光標(biāo)移到前一個(gè)文件的起點(diǎn)

]]:將光標(biāo)移到后一個(gè)文件的起點(diǎn)

q:退出taglist窗口

一級(jí)方程式錦標(biāo)賽:關(guān)閉幫助

4、ctags插件的使用

VIM簡單易用,大家只要看看VIM自帶的vitutor,大約只要20分鐘就能掌握VIM的用法,上面也簡單介紹了點(diǎn)vim的用法。但是對(duì)于Linux下的C/C++的 程序員,使用VIM+Ctags的組合來寫程序也許是最佳的選擇。^_^

盡管ctags也可以支持其它編輯器,但是它正式支持的只有VIM。并且VIM中已經(jīng)默認(rèn)安裝了Ctags,它可以幫助程序員很容易地瀏覽源代碼。

熟練的使用ctags僅需記住下面七條命令:(很簡單吧,呵呵)

1. $ ctags–R * ($ 為Linux系統(tǒng)Shell提示符)

2. $ vi –t tag (請(qǐng)把tag替換為您欲查找的變量或函數(shù)名)

3. :ts (ts 助記字:tagslist, “:”開頭的命令為VI中命令行模式命令)

4. :tp (tp 助記字:tagspreview)---此命令不常用,可以不用記

5. :tn (tn 助記字:tagsnext) ---此命令不常用,可以不用記

6. Ctrl + ] 跳到光標(biāo)所在函數(shù)或者結(jié)構(gòu)體的定義處

7. Ctrl + T 返回查找或跳轉(zhuǎn)

下面我們逐條的解釋上面的命令:

“$ ctags–R *”:“-R”表示遞歸創(chuàng)建,也就包括源代碼根目錄(當(dāng)前目錄)下的所有子目錄。“*”表示所有文件。這條命令會(huì)在當(dāng)前目錄下產(chǎn)生一個(gè)“tags”文件,當(dāng)用戶在當(dāng)前目錄中運(yùn)行vi時(shí),會(huì)自動(dòng)載入此tags文件。Tags文件中包括這些對(duì)象的列表:

用#define定義的宏

枚舉型變量的值

函數(shù)的定義、原型和聲明

名字空間(namespace)

類型定義(typedefs)

變量(包括定義和聲明)

類(class)、結(jié)構(gòu)(struct)、枚舉類型(enum)和聯(lián)合(union)

類、結(jié)構(gòu)和聯(lián)合中成員變量或函數(shù)

VIM用這個(gè)“tags”文件來定位上面這些做了標(biāo)記的對(duì)象。

剩下的命令就是定位這些對(duì)象的方法:

“$ vi –t tag” :在運(yùn)行vim的時(shí)候加上“-t”參數(shù),例如:

[/usr/src]$ vim -t main

這個(gè)命令將打開定義“main”(變量或函數(shù)或其它)的文件,并把光標(biāo)定位到這一行。如果這個(gè)變量或函數(shù)有多處定義,在VI命令行模式“:ts”命令就能 列出一個(gè)列表供用戶選擇。 “:tp”為上一個(gè)tag標(biāo)記文件,“:tn”為下一個(gè)tag標(biāo)記文件。當(dāng)然,若當(dāng)前tags文件中用戶所查找的變量或函數(shù)名只有一 個(gè),“:tp,:tn”命令不可用。 :(

最方便的方法是把光標(biāo)移到變量名或函數(shù)名上,然后按下“ Ctrl+] ”,這樣就能直接跳到這個(gè)變量或函數(shù)定義的源文件中,并把光標(biāo)定位到這一行。用“ Ctrl+T ”可以退回原來的地方。即使用戶使用了N次“Ctrl+]”查找了N個(gè)變量,按N次“Ctrl+t”也能回到最初打開的文件,它會(huì)按原路返 回。 ^_^

注意:運(yùn)行vim的時(shí)候,必須在“tags”文件所在的目錄下運(yùn)行。否則,運(yùn)行vim的時(shí)候還要用“:settags=”命令設(shè)定“tags”文件的路 徑,這樣vim才能找到“tags”文件。在完成編碼時(shí),可以手工刪掉tags文件(帚把不到,灰塵不會(huì)自己跑掉^_^)。

5、cscope插件的使用

Cscope是一個(gè)類似 ctags的工具。你可以把它想作是超過頻的 ctags,因?yàn)樗δ鼙萩tags 強(qiáng)大很多。在 Vim 里,通過 cscope 查詢結(jié)果來跳轉(zhuǎn)就象跳轉(zhuǎn)到其他的標(biāo)簽完全一樣;它被保存在標(biāo)簽棧里。這樣你就可以象使用 ctags一樣在函數(shù)等等之間便捷的跳轉(zhuǎn)。

在VIM中使用cscope非常簡單,首先調(diào)用“cscope add”命令添加一個(gè)cscope數(shù)據(jù)庫,然后就可以調(diào)用“cscope find”命令進(jìn)行查找了。VIM支持8種cscope的查詢功能,如下:例如,我們想在代碼中查找調(diào)用work()函數(shù)的函數(shù),我們可以輸入:“:cs find c work”,回車后發(fā)現(xiàn)沒有找到匹配的功能,可能并沒有函數(shù)調(diào)用work()。我們?cè)佥斎搿?cs find s work”,查找這個(gè)符號(hào)出現(xiàn)的位置,vim列出了這個(gè)符號(hào)出現(xiàn)的所有位置。我們還可以進(jìn)行字符串查找,它會(huì)雙引號(hào)或單引號(hào)括起來的內(nèi)容中查找。還可以輸入一個(gè)正則表達(dá)式,這類似于egrep程序的功能。

在源代碼目錄下打開vim。要使用cscope查找就必須加載cscope.out文件。在vim命令行下執(zhí)行:(按照上述方法配置好的vimrc中有這一步)

:cs add cscope.out

在vim命令行下執(zhí)行:

:cs help

cscope commands:

add : Add a new database (Usage: add file|dir [pre-path] [flags])

find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name)

c: Find functions calling this function //查找調(diào)用本函數(shù)的函數(shù)

d: Find functions called by this function //查找本函數(shù)調(diào)用的函數(shù)

e: Find this egrep pattern //查找egrep模式,相當(dāng)于egrep功能,但查找速度快多了

f: Find this file //查找并打開文件,類似vim的find功能

g: Find this definition //查找函數(shù)、宏、枚舉等定義的位置,類似ctags的功能

i: Find files #including this file //查找包含本文件的文件

s: Find this C symbol //查找c語言符號(hào),即查找函數(shù)名、宏、枚舉值等出現(xiàn)的地方

t: Find assignments to //查找指定的字符串

help : Show this message (Usage: help)

kill : Kill a connection (Usage: kill #)

reset: Reinit all connections (Usage: reset)

show : Show connections (Usage: show)

例如:使用cscope查找do_fork函數(shù)的定義:

在vim命令行下執(zhí)行: :cs f g do_fork

不支持版本

??16 位的DOS、OS/2 和 Amiga 版本

??32 位的 MS-DOS/Windows 95/98 的字符界面版

??16 位的 MS-Windows 版本

參考資料 >

VIM.VIM 官方網(wǎng)站.2016-09-25

Vim 8.0 released!.vim官網(wǎng)新聞.2017-03-10

十年生聚,Vim 8.0 發(fā)布了!.linux中國.2016-09-25

linux下vi命令大全.星塵-博客園.2012-10-16

Vim中關(guān)于 cscope 的幫助.CSDN.2012-08-27

生活家百科家居網(wǎng)