vi命令-準備好你的手指!


VI的指令集龐大而繁雜,但是正如計算機指令系統,有精簡指令系統,還有擴展指令系統。
在對待vi命令的態度上,有人力求化繁爲簡,有人講究多多益善。
無論如何,想要熟練的應用到工作中,掌握一定數量的命令是必須的!


本文檔定位於:通過不斷的練習,能夠快速、準確的查看或者修改文件。
如果希望通過vim完成大型軟件代碼的查看和編寫,則不再本文檔的討論範圍
(涉及到在不同文件之間函數的跳轉,代碼塊之間的跳轉,縮進,註釋格式化,編譯等內容)


根據自己的習慣和工作需求,多多練習,直到你的手指可以不假思索地運用自如!



針對vim_user_manual_603的內容,結合自己工作中實際使用情況,整理了使用較多或者可能使用較多的命令供大家練習!



環境設置:
set ignorecase - 設置忽略大小寫, 關閉noignorescase 
set hlsearch - 高亮顯示所有符合的匹配, 關閉nohlsearch 
set incsearch - 在鍵入目標字符串的過程中同時開始了搜索工作
set nowrapscan - 搜索到文件頭或者文件尾時就停止,不會進行文件循環搜索
set ruler - 在vim窗口的右下角顯示當前光標的行列信息
set nowrap - 不要折行,這樣不會把超出當前顯示窗口顯示寬度的行折到下一行顯示
set list - 讓文件中的製表符成爲可見字符
set expandtab - 製表符會以相應寬度的空格來代替
set softtabstop=4 - 設置製表符的寬度爲4 ('tabstop'選項的默認值是8,如果改變這個值可能會影響其它的程序)
set background=dark - 設置背景色爲暗色
set textwidth=80 - 設置一行的最多字符數爲80,如果大於設置的數目vim就會自動換行
set linkbreak - 一個單詞不會分開在兩行中顯示(一半在上一行的行尾,另一半在下一行的行首)


map - Normal模式下按鍵映射 unmap - 刪除一個映射 


syntax enable - 語法高亮
syntax clear - 暫時關閉語法高亮
syntax off - 停用語法高亮
syntax case match - 在匹配語法元素時是大小寫敏感的
syntax case ignore - 在匹配語法元素時是大小寫不敏感的
syntax keyword {group} {keyword} - {group}是語法組的名字,
    使用“highlight”命令可以將一組顏色方案應用到該{group}語法組上,{keyword}參數指定了實際的關鍵字
    例如 syntax keyword xType int long char - 這個命令使"int" "long" "char"以同一種方式高亮顯示
         syntax keyword xStatement if then else endif - 這個命令使"if" ... "endif"以另一種方式高亮顯示
highlight link xType Type - 使得vim對組"xType"與"Type"相同的語法高亮
highlight link xStatement Statement - 使得vim對組"xStatement"與"Statement"相同的語法高亮


vim腳本語言的介紹:(主要用於vim初始配置文件)
let - 爲一個變量賦值
unlet - 刪除一個變量


命令概要:
J : 將本行和下一行合併
u : 撤銷操作
Ctrl-R : 反轉撤銷,也就是對撤銷的撤銷
w : 將光標移動到下一個單詞的首字符(以空格或者其它標點符號作爲單詞的分隔符) W :移動到下一個單詞(以空格作爲單詞分隔符)
b : 將光標移動到前一個單詞的首字符
e : 將光標移動到下一個單詞的尾字符
ge : 將光標移動到前一個單詞的尾字符
$ : 移動到行尾
0 : 移動到當前行的第一字符
^ : 移動到當前行的第一個非空白字符
f : 在當前行查找下一個字符
% : 跳轉到匹配的"("或者")",對 方括號和花括號、尖括號或者#ifdef #else #endif同樣適用

gd : 高亮顯示當前光標處的字符串

gg : 到達文件的第一行

G  : 到達文件的最後一行
H : 到達當前屏幕的最上方
M : 到達當前屏幕的中間部分
L : 到達當前屏幕的最下方
zz : 將當前行置爲屏幕正中央
/<Up> : 查找之前使用的搜索,可以多次使用<Up>鍵. 同樣可以使用:和<Up>組合
/\<the\> : 匹配獨立的單詞“the”
* : 將光標定位於某個word上,然後按下"*"鍵,vim會將這個word作爲目標字符進行搜索。#是*號的反向版。
ZZ : 保存文件
·· : 回到剛纔光標的位置,可以用在兩點之間來回跳轉
dw : 刪除當前光標至一下word的開頭
d$ : 刪除當前光標到行尾的內容(相當於D)
dG : 刪除當前行至文件尾的內容
dd : 刪除當前的一整行
. : 重複上一個操作命令
xp : 交換兩個字符(x是刪除字符,但是刪除的字符會被保存起來,這樣使用p命令就可以取回)
yw : 複製一個word
yy : 複製一整行
y$ : 複製當前光標至行尾
args - 查看整個列表中有哪些文件
saveas another_filename - 將當前編輯的文件另存爲一個新的文件名
1,15s/string1/string2/gc - 將第一行到第15行中出現的string1替換爲string2,並對每次替換都需要確認
!{command} : 如果需要只執行一個shell命令的話,可以在vim中這樣使用。例如,查看當前目錄的內容:!ls
g CTrl-g : 查看光標所在的字符在整個文件中的位置(g和Ctrl-g之間並沒有空格,使用時也不需要在前面添加:)
gq : 將一行文本重新格式化(在Visual模式下選定要格式化的內容,然後再按下命令"gq")
(gq命令根據indent comments textwidth等多個選項進行工作)
} : 移動到一段的末尾
{ : 移動到一段的開頭
\c \C : 如果只想對搜索模式的一部分應用大小寫不敏感的策略,可以在前面加上一個“\c”,如果大小寫敏感則可以使用"\C"
         ("\c" 和 “\C”這個兩個前綴的優先級高於‘ignorecase’和‘smartcase’)



split - 將屏幕分爲上下兩個窗口並將光標定位在上面的窗口中
vsplit - 將屏幕拆分爲左右兩個窗口
new - 新開一個窗口
vnew - 在豎直方向上新開一個窗口
close - 關閉窗口
qall - 針對打開很多窗口的情況,關閉所有窗口
wall - 針對打開很多窗口的情況,保存所有窗口
wqall - 針對打開很多窗口的情況,保存並退出所有窗口
qall!- 針對打開很多窗口的情況,放棄修改強制退出所有窗口



Ctrl-F : 向文件尾部滾動一屏
Ctrl-B : 向文件頭部滾動一屏
Ctrl-Z : 掛起vim的執行,使得用戶回到啓動vim的shell中,進行別的操作,之後使用“fg”命令回到vim
Ctrl-a : 將數字參數加一,前綴部分也可以加一個數字參數例如 3Ctrl-a
Ctrl-x : 將數字參數減一,前綴部分也可以加一個數字參數例如 3Ctrl-a



Ctrl-x Ctrl-f : 在插入模式補齊文件名,使用Ctrl-n在提供的候選文件命中進行選擇
Ctrl-a : 插入上次在insert模式下錄入的內容(插入模式下的效果)
Ctrl-y : 插入光標處上一行中相同位置的字符
Ctrl-e : 插入光標處下一行中相同位置的字符
Ctrl-n : 自動補齊,對於一個較長的字符串,可以先輸入開頭部分的幾個字符,接着按下“Ctrl-n”鍵,vim會找到相近的匹配



Ctrl-b : 光標移動到命令行行首
Ctrl-e : 光標移動到命令行行尾
Ctrl-w : 刪除命令行中光標之前的一個單詞
Ctrl-u : 刪除命令行中光標之前的所有內容




v : (小寫字符)進入Visual模式
V :(大寫字符)進入Visual模式(整行整行的選擇文本)
Ctrl-V :進入Visual模式(矩形的文本塊爲對象,使用o將光標置於被選中文本的另一頭)


esc按鍵: 進入Normal模式


R : 進入replace模式




命令示例: ---------------------------------------
:%s/\s\+$//    命令作用-消除行尾的空格或者跳格鍵,這個命令並不能刪除空白行,
               命令解釋-從整體上來看,這是個查找替換的命令,命令的格式爲:範圍/word1/word2/
               %表示作用的範圍是每一行,\s\+$表示的是行尾的一個或多個空白字符    




模式匹配: ---------------------------------------
/a*     匹配“a” "aa" "aaa" 等等以及“”
/\(ab\)*    匹配“ab” "abab" "ababab" 等等以及“”
/ab\+   匹配“ab” "abb" "abbb" 等等
/cellx\=    匹配“cell” "cellx" 等等 \= 表示一個可有可無的項
/ab\{,4}     匹配0,1,2,3或者4次 “a” "ab" "abb" "abbb" "abbbb"
/ab\{3,}    匹配3次以及以上 "abbb" "abbbb" 等等
/ab\{0,1}   匹配0次或者一次,相當於\=
/ab\{0,}    匹配0次或多次,相當於*
/ab\{1,}    匹配1次或多次,相當於\+
/ab\{3}     匹配3次
/ab\{-1,3}  匹配時儘可能少次數的重複,對於“abbb”使用/ab\{-1,3}匹配到的是“ab”
/{-}   匹配前面的項一次或0次 ,比如/a.\{-}b 會匹配到"axbxb"中的“axb”, /a.*b匹配到的是“axbxb”
/foo\|bar   匹配到"foo"或者“bar” 在一個模式中的“或”操作符是“\|”, 
/\(foo\|bar\)\+ 匹配到"foo" "foobar" "foofoo" "barfoobar" 等等。 要匹配多次,必須把整個字符串用"\(" 和"\)"前後括起來,
/[0-9a-f]   指定匹配的範圍
/[^some_set] 避免匹配到某個或者某些特殊的字符,在[]字符集的開頭用"^"



常用的一些預定義字符集-注意這些項不能用於[]內部
\d  數字,等價於    [0-9]  使用[0-9]比使用\d執行起來要慢一點,下同
\D  非數字,等價於  [^0-9]
\x  十六進制數,等價於  [0-9a-fA-F]
\X  非十六進制數,等價於  [^0-9a-fA-F]
\s  空白字符,包含空格符<Space>和製表符<Tab>
\S  非空白符,除空格符<Space>和製表符<Tab>之外
\l  小寫字母,等價於[a-z] 
\L  非小寫字母,等價於[^a-z]
\u  大寫字母,等價於[A-Z]
\U  非大寫字母,等價於[^A-Z]
\h  字母,等價於[A-Za-z]
\w  數字和字母,等價於[0-9A-Za-z]
\<, \> 用於識別整個的單詞




現在準備好你的手指,我們開始練習咯:---------------------------------------

根據自己的工作環境(window下或者Linux下),建議選擇一個較長的文件拷貝到某個目錄進行練習, 在操作之前請備份文件(cp -a filename testing)


用vim打開一個練習文件(vim testing)
(使用-o選項可以讓vim爲每個文件打開一個窗口 vim -o one.txt two.txt three.txt)
移動到23行(:23)
將第23行和第24行合併(J)
複製當前行(yy)
到達文件的尾部(G)
將剛纔複製的內容粘貼到此處(p或者P,注意看下兩者的不同)
將光標移動到文件的第一行(gg)
在文件的開頭部分加入#This is used for testing內容(O大寫字母,#This is used for testing)
查找文件中第一次出現lamp的地方(/lamp)
將字符l替換成L(rL)
將文件第2行到第10行之間出現的“name”替換爲"NAME" 對每次替換都事先確認一下(2,10s/name/NAME/gc)
進入Visual模式(v)
通過移動光標確定想要到達的位置,將選中的內容刪除(>或者l,d)
將光標定位到第5列,刪除後面的3個字符(,3x)
重複上一個操作看看什麼效果(.)
將光標向下移動5行(5j)
查看一下光標所在的行數,列數,字符數等信息(gCtrl-g)
插入一行註釋,註釋內容爲“you may check the file **”[**爲本目錄下的一個文件名開頭部分]
                    (o, you may check the file Ctrl-x Ctrl-f, 使用Ctrl-n在候選文件名中選擇 )
將光標向右移動3個字符或者向左移動5個字符(3l或者5h)
移動到這一行的第一個字符(0)
向右移動5個單詞,到達單詞的詞首部分(5w)
移動到第55行的行尾(:55, $)
跳轉到之前的光標位置(``,這裏按兩次··看看出現什麼效果)
(跳轉到第55行)向左移動6個單詞,到達單詞的詞首部分(6b 這裏可以多按幾次6b看看出現什麼效果)
移動到這一行的第一個非空白字符(^)
交換當前光標和光標右邊位置的兩個字符(xp)
移動到前一個單詞的詞首部分(b)
在當前行查找從當前光標位置出現的第3個字符'n'(3fn)
將字符'n'替換成字符'c'(rc)
撤銷操作(u),
反轉撤銷,對上一次撤銷操作的撤銷(Ctrl-r)
將文件保存一下(:w 如果要保存退出的話使用ZZ命令,字母大寫)
在文件中查找“Lam”,大小寫敏感(/\CLam)
在文件中查找“ibts”,忽略大小寫(/\cibts)
查看一下當前編輯文件的路徑(:!pwd)
掛起當前的vim,查看一個當面的目錄(Ctrl+z, 輸入命令pwd,然後鍵入命令“fg”回到vim)
刪除當前光標位置到行尾的內容(d$或者使用命令D)
查找文件中下一次出現state字符的地方(/state)
刪除光標以及光標右邊的一個字符(2x)
刪除當前光標後的3個單詞(d3w)
向文件尾部滾動一屏幕(Ctrl-F)
將當前行置爲屏幕正中央(zz)
從當前位置查找出現的172地方,將172改成175(/172, 3Ctrl-a)
將175改成174(Ctrl-x)
將光標移動到一段的末尾(})
將文件中的lampstation08替換爲lampstation12(本意是替換爲lampstation12,實際命令敲入時出現錯誤)(輸入:s/lampstaion08/lmapstation12/,
                               在按下回車之前按幾次Ctrl+b和Ctrl+e瞭解一下如何將光標快速在命令行首和行尾進行切換,
                               將光標移動到行尾,使用Ctrl+w刪除一個word或者使用Ctrl+u刪除光標之前的內容,將命令改寫正確
                               或者將光標移動到lmapstation12開始處,使用插入鍵<Insert>切換到改寫模式,改寫完畢後再使用使用插入鍵<Insert>切換回來)
整行整行的選擇文本(按下V進入Visual模式,使用j或者h來整行整行的選擇文本)
從當前位置查找出現單詞“the”的第一個地方(/\<the\>)
查看當前編輯的文件列表中有哪些文件(:args, :previous回到前一個文件 :next去往後一個文件, :first移到第一個文件, :last移到最後一個文件)
將當年編輯的文件另存爲一個其它的文件名(:saveas another_filename)
將當前屏幕拆分成兩個窗口(:split或者使用:vsplit 將會在豎直方面上拆分)
在兩個窗口中進行光標切換(Ctrl-w)
將當前的窗口關閉(:close也可以使用:wq!或者q!命令)
移動到第46行(46G)
將當前行刪除(dd)
向右移動3個單詞,到達單詞的詞尾部分(3e)
移動到前一個單詞的詞尾部分(ge)
插入一個內容爲Helloworld的字符串(i, Helloworld)
插入一個新行,新行的內容爲上次插入的內容(o, Ctrl-a)
插入一個新行,新行的內容爲HelloEarth(o,Ctrl-y[按5次],Earth)[可以按一下Ctrl-e看看是否會複製下一行相同位置的字符]
插入一行,內容爲 if ( a == (b * c) / d) print " This is what we wanted"(o, if ... wanted")
移動到當前行的第一個字符處(0)
查找第一個(出現的位置(f()
確認一下括號的書寫是否跟預期的一樣(將光標移動到(或者)處,按幾次%看看效果)
插入一個新行,新行的內容爲Helloworld(o,輸入Hello,然後按幾次“Ctrl-n”查看會發生什麼)
查找倒數第二次使用/命令查找的那個字符串的下一個位置(/<Up><Up>)
新開一個窗口用於記錄閱讀當前文件的筆記(:new 或者使用:vnew命令 將會在豎直方向上新開一個窗口)
在新的窗口中輸入一些內容
將新窗口中輸入的內容以文件的形式保存下來(:saveas notes)
保存文件退出(wq!)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章