2011/10/15

VIM Note

手動 Fold

  • zf 將選取的範圍 fold 起來
  • zd 刪除游標上的 fold
  • zo 打開游標上的 fold
  • zO 遞迴地打開游標上底下所有的 fold
  • zc 把游標上的 fold 折起來
  • zC 遞迴地折起游標上底下所有的 fold
  • zM 把整個檔案所有的 fold 都折起來
  • zR 把整個檔案所有的 fold 都打開
  • :2,6fold 將 2-6 行 fold
  • :mkview 記憶手動 fold
  • :loadview load 手動 fold

檔案比較

  • vimdiff FILELEFT FILERIGHT 如果還沒開啟某個檔案,可以在指令列這樣下
  • diffsplit FILE_RIGHT 水平分割開啟比較檔案
  • vertical diffsplit FILE_RIGHT 垂直分割開啟比較檔案
  • :diffthis 將看到的視窗使用檔案比較功能
  • :diffoff 關閉檔案比較
  • :set scrollbind 同步捲動
  • :set noscrollbind 停止同步捲動
  • ]c 移到下一個差異點
  • [c 移到上一個差異點
  • dp 將目前的內容放置到另一個視窗
  • do 將另一個視窗的內容放置到目前的視窗
  • :diffupdate 手動刷新比較結果

自動 Fold

  • set foldmethod =
    • manual 手動摺疊
    • indent 級別折疊
    • syntax 語法折疊
    • marker 所有文本將按照特定標記(默認為{{{和}}})自動摺疊
  • set foldlevel=0 控制可以看見的折疊層級

搜尋與取代

  • / 在 c-mode 的情形下,按 / 就會在左下角出現一個 /,然後鍵入您要尋找的字串,按個 Enter 就會開始找
  • ? 和 / 相同,只是 / 是向前(下)找,? 則是向後(上)找
  • n 繼續尋找
  • N 繼續尋找(反向)
  • /\c 不分大小寫搜尋,譬如要搜尋 test,/\ctest 可以搜尋到 test, Test, tEst 等等
  • :set nohlsearch 關閉搜尋的 highlight 效果
  • :%s/a/b/gi 不分大小寫將 a 取代為 b
  • :2,6s/a/b/gi 不分大小寫將 2,6 行 a 取代為 b

強大的檔案搜尋 vimgrep

notepad++ 跟 Dreamweaver 都可以針對某個資料夾的檔案做原始碼關鍵字的搜尋,沒想到 vim 也可以,真的太強大了,假設今天要搜尋 test 資料夾裡面所有含 $name 的檔案,code 只要這樣下。

:vimgrep /$name/ c:\AppServ\www\test\*

不分大小寫的話直接加上 \c 就可以了。

:vimgrep /\c$name/ c:\AppServ\www\test\*

複合式的搜尋,下方指令會搜尋當下資料夾的檔案跟 template 下的所有檔案

:vimgrep /$name/ * template/*

搜尋包含全部子目錄

:vimgrep /$name/ **/*

vimgrep 其他功能介紹

  • :cw - 開啟符合檔案列表
  • :cn - 下一個檔案
  • :cN - :cn 的相反
  • :cp - 上一個檔案
  • :cP - :cp 的相反
  • :cc - 顯示目前編輯的檔案

小技巧

修改符號內容

假設有個內容是這樣 "aaa-bbb-ccc",如果我們移到 aaa 按下 cw 想要修改內容,會變成 "-bbb- ccc,但其實我們的目的是要修改掉整個 "" 的內容怎麼辦呢,只要在該 "" 範圍內、按下 ci",便會把 "" 內的內容作變更的動作,同理,要清除可以用 di",複製則是 yi",若使用 ca" 則是把 " 一併修改,ciw 會修改一個整個字,跟 ci 的差別在於 ci 只會修改目前 cursor 之後的字,而 ciw 會判斷前面,ci( 以及 ci{ 會修改 ( 以及 { 裡面的內文,ca( ca{ 會連 ( 以及 { 一起取代掉。

修改標籤內容

另外一種常遇到的情況就是 <a href='"#"'>aaa-bbb-ccc</a>,我們想要修改 <a> 標籤內的內容,此時只要使用 citt = tag 的意思,cat 則是連 tag 本身都修改。

段落前後加上文字

如果今天有一個段落的內容如下:

aaaaa
bbbbbbb
ccccc

今天想要在前方或後方加入 x 這個字的話,前方可能還好,可以用區塊編輯的方法,但後方並沒有對齊,不能這樣做,此時我們可以用取代的方式。

  • :1,3s/^/x/gi - 前方加 x
  • :1,3s/$/x/gi - 後方加 x

複製、修改、刪除區段

  • dfx - 刪除到 x
  • dtx - 刪除到 x 為止
  • d/word - 刪除到 word 為止

此技巧可以搭配數字使用,例如說 d4f",便會刪除至 4 個 "

Hot Key

  • $ 行尾
  • :2,6m12 將第 2 行至第 6 行移動到 12 行之後
  • :2,6t12 將第 2 行至第 6 行複製到 12 行之後
  • :command! 這個 ! 強迫中止目前正在編輯的動作,而去執行所下的指令
  • :find **/aa.php 在所有目錄下搜尋 aa.php
  • :lcd 改變當下目錄
  • :m+ 將游標所在位置往下移動一行
  • :m-2 將游標所在位置往上移動一行
  • :m20 將游標所在位置移到第 20 行
  • :pwd 顯示當下目錄
  • :q 及 :q! 是對目前編輯中的檔案作用
  • :q 如本文有修改而沒存檔,會警告,且無法離開(quit)
  • :q! 捨棄所有修改,強迫離開
  • :qa 或 :qa! 來整個離開 vim,a 就是 all 的意思
  • :sort i 忽略大小寫
  • :sort n 依照字數排序
  • :sort u 移除重複的內容
  • :sort 昇冪排序
  • :sort! 降冪排序
  • :sp 水平分割視窗
  • :tabc 關閉標籤頁
  • :tabe filename 在新標籤頁打開一個檔案
  • :tabl 最後一個標籤頁
  • :tabm [N] 移動到第 N 順位
  • :tabn 下一個標籤頁 或是 gt,C-PageDown
  • :tabo 關閉其他標籤頁
  • :tabp 上一個標籤頁 或是 gT,C-PageUp
  • :tabr 第一個標籤頁
  • :tabs 顯示所有標籤頁
  • :vs 垂直分割視窗
  • :w 檔名 另存他檔不加檔名就是寫入原檔(write)
  • :wq 存檔後離開縱使檔案未曾修改也是會再存一次檔
  • :x 也是存檔後離開,但如果檔案沒有修改,則不會做存檔的動作
  • >> 整行向右移一個 shiftwidth(預設是 8 個字元,可重設)
  • >> 整行向左移一個 shiftwidth(預設是 8 個字元,可重設)
  • ^ 行首第一個字元
  • a 在游標所在字元後開始輸入文字(append)
  • A 在行尾開始輸入文字
  • B 同上,但會忽略一些標點符號
  • b 移至前一個字字首
  • c confirm,每次替換前會詢問
  • C 取代至行尾,即游標所在處以後的字都會被替換或 c$
  • c0 取代至行首,或 c^
  • cc 取代整行內容或大寫 S 亦可
  • Crtl+r 這個也是很重要,就是 redo 鍵
  • Ctrl+w+< 增加寬度
  • Ctrl+w+= 平均視窗尺寸
  • Ctrl+w+> 減少寬度
  • Ctrl-b 整個視窗往上移動
  • Ctrl-d 在編輯模式下,會將開行往左移動
  • Ctrl-e 視窗逐行下移
  • Ctrl-f 整個視窗往下移動
  • Ctrl-t 在編輯模式下,會將開行往右移動
  • Ctrl-v 這是方塊標示(block visual),可縱向標示矩形區域再按一次 Ctrl-v 就會結束 v-mode結束 v-mode 的方式亦可使用 Esc 鍵,或統一使用 Ctrl-c
  • Ctrl-w f 開一新視窗,並編輯游標所在處之 word 為檔名的檔案
  • Ctrl-w j 移至下視窗
  • Ctrl-w k 移至上視窗
  • Ctrl-w n 即 :new開一空的新視窗
  • Ctrl-w o 即 :only! 使游標所在之視窗,成為目前唯一顯示的視窗其它視窗會隱藏起來
  • Ctrl-w q 即 :q 結束分割出來的視窗
  • Ctrl-w r 向右或向下輪替視窗
  • Ctrl-w R 與上方相反方向
  • Ctrl-w s 即 :sp(lit),會開一新視窗,且原檔分屬兩個視窗
  • Ctrl-w x 交換同列或同欄視窗位置
  • Ctrl-w X 與上方相反
  • Ctrl-w++ 增加高度
  • Ctrl-w+- 減少高度
  • cw 替換一個英文字(word),中文不適用(change)
  • D 刪至行尾,或 d$(含游標所在處字元)
  • d 刪除標示區內容
  • d0 刪至行首,或 d^(不含游標所在處字元)
  • d1G 刪至檔首或 dgg(只能用於 vim)
  • dd 刪除一整行(delete line)
  • dG 刪至檔尾
  • dw 刪除一個字(delete word)不能適用於中文
  • e 不顯示 error
  • E 同上,但會忽略一些標點符號
  • e 移至後一個字字尾
  • g globe,不詢問,整行替換
  • G 移至檔尾(最後一行的第一個非空白字元處)
  • gg 移至檔首(第一行之第一個非空白字元處)
  • gUU 整行轉大寫
  • guu 整行轉小寫
  • g~~ 整行大小寫反轉
  • h j k l 左 下 上 右
  • H 移至螢幕頂第一個非空白字元
  • i ignore 不分大小寫
  • i 在游標所在字元前開始輸入文字(insert)
  • I 在行首開始輸入文字
  • J 將下一行整行接至本行(Joint)
  • L 移至螢幕底第一個非空白字元,內文內容並未動,只是游標在動而已
  • M 移至螢幕中間第一個非空白字元
  • O 在游標所在行上開一新行來輸入文字
  • o 在游標所在行下開一新行來輸入文字(open)
  • P 大寫 P 代表貼至游標前(上)
  • p 小寫 p 代表貼至游標後(下)
  • pattern 就是要被替換掉的字串,可以用 regexp 來表示
  • R 取代字元至按 Esc 為止
  • r 取代游標所在處之字元vi(m)
  • range 指的是範圍,1,7 指從第一行至第七行,1,$ 指從第一行至最後一行,也就是整篇文章,也可以 % 代表
  • resize n 設定視窗高度
  • s 替換一個字元為您所輸入的字串和 R 不同,R 是覆蓋式的取代,s 則是插入式的取代,您可親自實驗看看ㄟ!是小寫的 s
  • Shift-> 標示區內容向右移一個 Tab
  • Shift-< 標示區內容向左移一個 Tab
  • Shift-h 移到該視窗頂端
  • Shift-l 移到該視窗尾端
  • Shift-m 移到該視窗中央
  • string 將 pattern 由 string 所取代
  • U 在游標沒離開本行之前,回復所有編輯動作
  • u 這個太重要了,就是 undo,傳統的 vi 僅支援一次 undo,vim 及 elvis 就不只了,vim 是沒有限制的
  • V 大寫 V,這是行標示(line visual),按下 V 後會整行標示起來(包括行首前空白的部分),您移動上下鍵,會標示多行mouse 連按三次左鈕,也是屬於此類的標示再按一次 V 就會結束 v-mode
  • v 小寫 v,這是屬於字元標示(character visual),按下 v 後您就可以移動游標,游標走過的地方就會標示起來再按一次 v 就會結束 v-mode您用 mouse 拉出的標示區也是屬於這類的標示
  • vertical resize n 設定視窗寬度
  • W 同上,但會忽略一些標點符號
  • w 移至次一個字(word)字首
  • windows 系統下 Ctrl-v 是複製鍵,可以使用 Ctrl-Q 來替代
  • X 刪除游標前之字元不可使用 Backspace 鍵
  • x 刪除游標所在處之字元在 vim 及 elvis 亦可用 Del 鍵
  • y 複製標示區內容
  • y$ 複製至行尾含游標所在處字元
  • y1G 複製至檔首
  • y2w 複製兩個字
  • y^ 複製至行首,或 y0不含游標所在處字元
  • yG 複製至檔尾
  • yw 複製一個 word
  • yy 複製游標所在行整行或大寫一個 Y,2yy 或 y2y 複製兩行
  • zb 將游標位置拉至螢幕底部
  • zt 將游標位置拉至螢幕頂部
  • ZZ 和 :x 完全一樣,隨您高興用哪一個
  • zz 將游標位置拉至螢幕中間
  • ~ 游標所在處之大小寫互換當然不能用於中文

沒有留言: