1.移動光标
在目前行裡面有效的移動光标,注意這些字母都可以配合删除、移動等操作。 fx:移動光标到目前行的下一個 x 處。很明顯,x 可以是任意一個字母,而且你可以使用 ; 來重複你的上一個 f 指令。 tx:和上面的指令類似,但是是移動到 x 的左邊一個位置。(這真的很有用) Fx:和 fx 類似,不過是往回找。 :jumps 看你過去移動光标的曆史 % 跳轉到配對的括号去 [[ 跳轉到代碼塊的開頭去(但要求代碼塊中'{'必須單獨占一行) w:光标往前移動一個詞。 e:跳到一個詞的尾部,然後從尾部跳到下一個詞 b:光标往後移動一個詞。 0:移動光标到目前行首。 ^:移動光标到目前行的第一個字母位置。 $:移動光标到行尾。 ):移動光标到下一個句子。 ( :移動光标到上一個句子。 '' 跳轉到光标上次停靠的地方, 是兩個', 而不是一個" gd 到達光标所在處函數或者變量的定義處。 gf 跳轉到相應的頭檔案。無法找出頭檔案的解決方法是:set path+=xxx,xxx是頭檔案所在目錄。 K 在 Man 裡面查找光标目前所在處的詞。 Ctrl+b:向上移動一屏。 Ctrl+f:向下移動一屏。 G:到檔案尾 numG:移動光标到指定的行(num)。(比如 10G 就是到第 10 行) gg:到檔案首 H:移動光标到螢幕上面 M:移動光标到螢幕中間 L:移動光标到螢幕下面 *:讀取光标處的字元串,并且移動光标到它再次出現的地方。 #:和上面的類似,但是是往反方向尋找。 j 向下 k 向上 k l 向右 h l ==> hjkl <=>左下上右 h 向左 j
2.查找
/pattern:從光标開始處向檔案尾搜尋pattern ?pattern:從光标開始處向檔案首搜尋pattern n:在同一方向重複上一次搜尋指令 N:在反方向上重複上一次搜尋指令 :s/源串/目标串/g 替換目前行中所有符合條件的字元串 :行号1,行号2s/源串/目标串/g 在指定行中進行替換 :%s/源串/目标串/g 全文替換 ma:在目前光标的位置标記一個書簽,名字為 a。書簽名隻能是小寫字母。你看不見書簽的存在,但它确實已經在那裡了。大寫字母(如A)是全局變量,在打開其他檔案時,輸入A則跳轉到原來檔案的部分 `a:到書簽 a 處。注意這個不是單引号,它一般位于大部分鍵盤的 1 的左邊。 `.:到你上次編輯檔案的地方。這個指令很有用,而且你不用自己去标記它。 :marks 檢視标記清單 複合搜尋:例如,要想搜尋出現在字元串 <code>{file}+1</code> 後面的字元串 <code>echo</code>,應該使用 <code>/{file}+1/;/echo/</code>。複合搜尋。例如,要想搜尋出現在字元串 <code>{file}+1</code> 後面的字元串 <code>echo</code>,應該使用 <code>/{file}+1/;/echo/</code>。
3.複制粘貼剪切
有效的移動大段的文本 v:按字元選擇。 V:按行選擇。這在你想拷貝或者移動很多行的文本的時候特别有用。 Ctrl +v:按塊選擇。 vi[ 選擇一對 [] 中的所有字元 vi( 選擇一對 () 中的所有字元 vi< 選擇一對 <> 中的所有字元 vi{ 選擇一對 {} 中的所有字元 vit 選擇一對 HTML/XML 的标簽内部的所有字元 在選擇模式的時候使用上面所述的方向鍵和指令(motion)。比如,vwww,會高亮光标前面的三個詞。Vjj 将會高亮目前行以及下面兩行。 一旦你高亮了選區,你或許想進行一些操作: d:剪貼選擇的内容到剪貼闆。 y:拷貝選擇的内容到剪貼闆。 c:剪貼選擇的内容到剪貼闆并且進入插入模式。 如果你很清楚的知道你想拷貝或者剪切什麼,那你根本就不需要進入可視選擇模式。這樣也會節省時間: d{motion}:剪切 motion 指令跨過的字元到剪貼闆。比如,dw 會剪切一個詞而 dfS 會将從目前光标到下一個 S 之間的字元剪切至剪貼闆。 d5w,則是剪切5個詞,d0則剪切光标的前一個詞 y{motion}:和上面類似,不過是拷貝。 c{motion}:和 d{motion} 類似,不過最後進入插入模式。 dd:剪切目前行。 yy:拷貝目前行。 cc:剪切目前行并且進入插入模式。 D:剪切從光标位置到行尾到剪貼闆。 C:和 D 類似,最後進入插入模式。 x:剪切目前字元到剪貼闆。 :和x類似,不過最後進入插入模式。 y+w 複制光标所在的位置到整個單詞所在的位置 使用多重剪貼闆 很多編輯器都隻提供了一個剪貼闆。VIM 有很多。剪貼闆在 VIM 裡面被稱為寄存器(Registers)。你可以列出目前定義的所有寄存器名和它們的内容,指令為":reg"。最好使用小寫字母來作為寄存器的名稱,因為大寫的有些被 VIM 占用了。使用寄存器的指令為雙引号 "。 比如:我們要拷貝目前行到寄存器 k。你應該按 "kyy。(你也可以使用 V"ky。為什麼這樣也可以呢?)現在目前行應該已經存在了寄存器 k 裡面直到你又拷貝了一些東西進入寄存器 k。現在你可以使用指令 "kp 來粘貼寄存器 k 裡面的内容到你想要的位置。 "ayy 将目前行複制到寄存器 a 中 "ap 将寄存器 a 中的内容粘貼到光标之後 l :registers 檢視所有寄存器的内容 l 通常情況下,寄存器 + ( " + Shift+= )對應X下的剪貼闆。您在其它程式中複制的内容,可以使用 "+p 粘貼到Vim中;您在Vim中,可以使用 "+y 将内容複制到剪貼闆,再粘貼到其它程式中 l 沒有指定寄存器時,Vim使用“無名寄存器”存儲内容
要查找單詞is,而不比對miss中的is,則使用//<is/>/c ,/<表示以此為開頭,/>表示以此為結尾,/c表示忽略大小寫(/C為區分大小寫)。
4.删除(c指令和d指令就差一個插入操作)
c{motion}:删除 motion 指令跨過的字元,并且進入插入模式。比如:c$,這将會删除從光标位置到行尾的字元并且進入插入模式。ct!,這會删除從光标位置到下一個歎号(但不包 括),然後進入插入模式。被删除的字元被存在了剪貼闆裡面,并且可以再粘貼出來。 例如:cw:删除光标所在處的詞并插入。(c —— change) d{motion}:和上面差不多,但是不進入插入模式。 vim中常用的删除文本指令: c+c 删除所在行,并插入 d+d 連按兩次d,可将光标所在的行删除,若連續删除,可以按住d不放 d+w 删除光标所在的單詞,若是光标在兩字之間,則删光标後的一個詞 D 将光标所在行後面所有的單詞删除 x 将光标所在位置後一個字元删除 X 将光标所在位置前一個字元删除 daw 删除光标下的普通單詞以及其後的空格 ciW 删除光标下的以空格分隔的“單詞”并進入插入模式 (i 表示 inner,不删除單詞後的空格) ci[ 删除一對 [] 中的所有字元并進入插入模式 ci( 删除一對 () 中的所有字元并進入插入模式 ci< 删除一對 <> 中的所有字元并進入插入模式 ci{ 删除一對 {} 中的所有字元并進入插入模式 cit 删除一對 HTML/XML 的标簽内部的所有字元并進入插入模式
5.插入
vim中指令行模式切換到輸入模式,進行插入: i:在目前字元的左邊插入 I:在目前行首插入 a:在目前字元的右邊插入 A:在目前行尾插入 o:在目前行下面插入一個新行 O:在目前行上面插入一個新行 :ab 替代符 原始資訊--自定義縮略符号。例如 :ab mymail [email protected] 以後在任意處輸入mymail然後按空格就可以插入這個資訊了
6.修改
r 修改光标所在字元 R 修改光标所在位置的字元,可以一直替換字元,知道按下ESC鍵 u 表示複原功能 U 取消對行所作的所有改變 >> 縮進所有選擇的代碼 << 和上面類似,但是反縮進 :1,20s/^//////g 連續行注釋,注釋第1行到第20行。(其中"^"表示在行首插入,"//"為要插的字元(要轉義),"g"表示執行替換時不确認) :r 檔案名 直接将其他檔案或指令執行内容導入目前檔案中(在注釋中寫入目前系統核心資訊,隻需:r !uname -a) v% = 在一遍的括号處按此組合鍵,括号中内容標明并按照C語言格式縮排,光标會自動跳到XXXX()函數的定義處, 變量, 結構, 宏, 等等, 都可以的。 v是visual模式,%是跳到與其比對的地方,=為源檔案格式化。 xp 前後交換兩個字元 ddp 上下交換兩行(這兩個挺好了解的) 增加注釋:(一個操作應用在多行)Ctrl + v 定位到開始行,然後標明需要的行,然後執行 I 指令,然後輸入 # 或 //,然後按 Esc鍵兩次,即可把注釋操作應用到所有標明的行,記住標明不能使用v指令,而應該使用Ctrl + v (清除注釋請參考上面的方法)(v是按行標明,Ctrl + v 是按照列標明) :line1,line2s!/s*//.*!! 去掉line1到line2之間的//注釋 :line1,line2s!/s*//*/_./{-}/*//s*! ! 去掉line1到line2之間的/* */注釋 :s%/^M//g 将DOS格式文本轉成Unix格式文本,其中^M 必須是同時按 Ctrl+V+M ,表示回車。 gg=G 格式化整個檔案 重放搜尋模式:假設要在檔案中搜尋以單詞 Martin 開頭的行并對每個比對添加字首 Mr 和字尾 Wicks,那麼進入指令模式,輸入 vi 指令 <code>:%s/^/(Martin/)/Mr /1 Wicks/g</code>,然後按回車。 下面把這個指令分解開解釋一下: <code>:%s</code> — 訓示 vi 執行替換。 <code>/</code> — 模式分隔符。 <code>^/(Martin/)</code> — 尋找以字元串 <code>Martin</code> 開頭的行并把這個字元串儲存在緩沖區 1 中。 <code>/</code> — 模式分隔符。 <code>Mr /1 Wicks</code> — 把找到的字元串替換為字元串 <code>Mr</code>,加上緩沖區 1 中的内容,再加上字元串 <code>Wicks</code>。 <code>/</code> — 模式分隔符。 <code>g</code> — 全局修改(即修改所有比對的地方)
7.檔案操作
e 加載新的檔案 w 寫檔案,它是儲存到臨時檔案中,直接退出,并沒有儲存到檔案中的 w! 如果想寫隻讀檔案,使用它強制寫入檔案 q! 不問你是否儲存檔案,強制退出 set 可以設定vim的某些特性。取消設定,使用 set none Z+Z 儲存并退出vim 直接利用指令修改檔案:例如按 Escape,輸入 <code>:1,$!sort</code> 并按回車,這個檔案就排序了 還可以在 shell 指令前面加上從目前遊标位置開始希望操作的行數。方法是按 Escape,然後輸入指定行數的數字,然後輸入兩個驚歎号(<code>!!</code>),最後輸入 UNIX 指令:4!!awk '{print "New text",$0}' 儲存部分内容:按 Escape,然後輸入 <code>:start,endw file</code>,其中的 start 是目前檔案中要儲存的第一行,end 是要儲存的最後一行,<code>w</code> 表示希望寫到另一個檔案中(或者覆寫現有的檔案),file 是指定的部分要儲存到的檔案。
8.宏
可以将一系列的操作錄制為一個宏,然後執行它 q<宏名稱> 開始錄制宏。宏名稱為一個字元 q 錄制中按下“q”鍵,結束錄制 @<宏名稱> 執行宏 可以使用 :registers(寄存器清單) 指令檢視已記錄的宏
9.統計:
全文字數:g+Ctrl+G 文章行數和目前位置占總行數的百分比:Ctrl+g
10.Tips in VIM
Tips:
1,當你不知道你是處于編輯方式還是指令方式時,可以使用Esc鍵退出指令方式,然後進行操作。
2,在使用vim時,萬一發生了系統掉電或者突然關機時,可以使用恢複指令,如編輯file檔案時突然斷電或系統崩潰後的恢複指令:$ vi file -r
3,啟動vim的時候使用vim -u /root/vimrc.vim,并且使用:vertion可以檢視到系統vimrc配置檔案,使用者vimrc配置檔案等的路徑
4,想檢視設定的快捷鍵,輸入:map即可看到。
如果要取消此快捷鍵,隻需輸入指令::unmap ^P
5,&XXX為否定XXX這個變量,在寫vimrc的function時可以使用,例如開關高亮顯示的函數為:
function ToggleHLSearch()
if &hls
set nohls
else
set hls
endif
endfunction
調用函數用::call ToggleHLSearch()
6,縮略語::ab sammail [email protected] 在輸入模式下錄入"sammail",再敲任意字母符号或者回車空格, "sam @ 163.com" 若想暫時取消則使用Crtl+V在後邊,這樣空格就不會導緻補全了。
7,執行UNIX/Linux指令不需退出Vim/Vi :!指令
8,:h quickref 翻到VIM Quick Reference頁(有用!)。
9,環境變量%表示目前檔案名。
10,# 加密(小心使用,不要忘了密碼)
:X : 然後vim會提示你輸入密碼
:wq(隻有儲存密碼才生效)
11,使用數字也是 VIM 強大的而且很節省時間的重要特性之一。在很多 VIM 的指令之前都可以使用一個數字,這個數字将會告訴 VIM 這個指令需要執行幾次。比如:
* 3j 将會把光标向下移動三行。
* 10dd 将會删除十行。
* y3″ 将會拷貝從目前光标到第三個出現的引号之間的内容到剪貼闆。
數字是擴充 motion 指令作用域非常有效的方法。
12,g 統計字數
13. map可以進行鍵盤映射,unmap取消
14.你可以快速處理 '、"、()、[]、{}、<> 等配對标點符号中的文本内容,包括更改、删除、複制等。
ci'、ci"、ci(、ci[、ci{、ci< - 分别更改這些配對标點符号中的文本内容 di'、di"、di(、di[、di{、di< - 分别删除這些配對标點符号中的文本内容 yi'、yi"、yi(、yi[、yi{、yi< - 分别複制這些配對标點符号中的文本内容
15. 打開并排的視窗 :split filename 縱向:vsplit filename 控制寬度:15 split (split可以簡化為sp) 跳轉:Ctrl+w Ctrl+w 增加或減小:Ctrlw – or Ctrlw + 等大:Ctrlw =
16.代碼折疊:
zf12j 折疊13 行 (12 + current line),zo打開,zk,zj在下一個和上一個折疊處跳轉,zd删除折疊,zm關閉折疊
16.希望 vi 不區分大小寫,那麼可以使用 <code>:set ignorecase</code>指令。使用 <code>:set noignorecase</code> 恢複區分大小寫。還可以使用簡寫(<code>:set ic</code> 和 <code>:set noic</code>)。
附:VIM模式總結(http://denven.blog.hexun.com/11922673_d.html)
Part1. 六種基本模式 : 1.Nomal Mode 普通模式 可以輸入所有普通的編輯指令,啟動編輯後預設處于普通模式,接受編輯指令。 2.Insert Mode 插入模式 輸入的内容會插入到目前緩沖區。這是我們最熟悉的普通編輯器的編輯模式。 3.Visual Mode 可視模式 與普通模式相似,但移動光标時光标會擴充高亮區域,非光标指令則可作用于高亮區域。 我将它分為三種具體的情況來了解。(圖中$表示行尾) 3.1. 普通可視模式。 按 v 進入,不單獨針對行或列,作用範圍為光标最初位置與光标目前位置間的内容。 ....cursor starts here|---------------------------------------------------------------$| +-------------------------------------------------------------------------------------------$| |---------------------------------------------------------------------------------------$| +---------------------------------------|the cursor stops here,maybe some content continued 3.2. 可視“行”模式。按 V 進入,光标移動作用與光标所在的整行内容。 如果光标開始位置所在行行号為i,標明時行号為j。 則作用内容為[i,j]行的内容。如圖所示: +----------------------------------------------------------starts here|--------------$| |----------------------------------------------------------------------------------------$| |-------------------------------------------------------------------------------------------$| +---------------------------------------$|the cursor stops here 3.3 可視“塊”模式。 按 CTRL-V 進入,gVim 則按 CTRL-Q(大寫) 進入。 標明範圍為光标最初點和光标移動後所在位置決定的矩形區塊内。 cursor begin|-------------+ +----------------| end |-------------| |----------------| +-------------| end begin |----------------+ exmaple 1 example 2 4.Command Mode 指令行模式 在底行可以輸入一行指令,也可稱作底行模式完成。按冒号進入指令行模式。我通常把它當作時普通模式的特例。因為可執行的指令太少。 5.Ex Mode Ex編輯器模式 以: 開始Ex模式,與指令行模式類似,但是指令完成後,會繼續停留在該模式下。 6.Select Mode 選擇模式 gVim中滑鼠選中的部分會在底下提示為“選擇”。 Part2. 五種附加模式: 1. 操作符等待模式:我尚未了解所謂的操作符指什麼。 2. 替換模式:可以認為是插入模式的特殊情況。 在插入模式下,按 即回到一種臨界的普通模式,這時可以切換其他模式,可以執行指令,但是完成指令後會立即傳回至插入模式。例如: 3. 插入普通模式 按 後執行一次編輯指令(即使是非a,i,A,I,o,O之類的指令)後進入插入模式。 4. 插入可視模式 按 後不執行編輯指令,而按鍵進入可視模式,可視選擇後執行一條指令(同上)就傳回到插入模式。 5. 插入選擇模式 按 後可以用滑鼠進行選擇,選擇結束(點選滑鼠)就傳回插入模式。