Vim Cheat Sheet

VIM操作指令
* 同一操作有兩種以上指令可用時,以打字區按鍵為主

= 頁面捲動 =
c-e c-y	向下/上捲動一行	Ctrl+x needed first for insert mode
zt	scroll current line to top of window

= 游標移動 =
== 基本 ==
hjkl    =方向鍵 左下上右,或方向鍵 (左右不跳行),可配合數字一次跳多行/字
bs sp   左右 (可跳行)
c-f c-b 向下/上翻頁(=PgDn PgUp, ps-上下也可)
c-d c-u 向下/上翻半頁
== 跳行 ==
gg          移至檔首 (=1G)
G           移至檔尾 (=0G)
:54         Goto line 54 (=54gg或54G)
100  往後跳100行 (=+或c-m)
100-        往前跳100行
40%         跳到檔案40%的地方
''          回到上一個位置(雙引號那顆鍵按兩下)
H M L       游標跳至畫面 頂 中 底 (停在非空白字元)
3H 3L       游標跳至畫面 頂 底 3行處
=== Bookmarks ===
ma	mark position as (a-z)
'a	move to position (a-z)
'0	open previous file (0~n)
:marks  列出Bookmarks
== 行內操作 ==
0       =Home
^       移到行首但不包括indent
$       =End
80|     跳至column 80 (中文OK)
fc Fc   向後/跳至c的位置
tc Tc   向後跳至c的位置之前,向前跳至c的位置之後
;和,    正向/反向重覆上一個fFtT動作
== 字操作 ==
e       往後移至字尾(大寫時跳過標點符號)
w       往後移至下個字首(大寫時跳過標點符號)
b       往前移至字首(大寫時跳過標點符號)
== 區塊移動 ==
)  移至下一個句子(sentence)首。
(  移至上一個句子(sentence)首。
}  移至下一個段落(paragraph)首。
{  移至上一個段落(paragraph)首。
* sentence 是以 . ! ? 為區格。
* paragraph 是以空白行為區格。
%   跳躍至與{} [] ()匹配的符號上(目前游標在其中一個符號上)
[(  跳躍至前一個(
[)  跳躍至下一個)
[{  跳躍至前一個{
]}  跳躍至下一個}

= Command Mode =
~         大小寫互換 (一個字母或選擇範圍)
g?w       ROT13 encoding
gu{motion}
gU{motion}
gU2b      把前兩個字換為大寫 (Visual Mode直接按U就好)
gu2b      把前兩個字換為小寫 (Visual Mode直接按u就好)
(需要研究gu用法)
c-n 5c-x 游標下的數字+/-5

.   重覆上一個指令
== 復原/重作 ==
u     undo
U     回復整行的所有編輯動作(從游標進入開始算),再按一次Redo
c-r   redo
== 取代 ==
r     取代
gr    取代,但保持排版
R     連續取代
gR    連續取代,但保持排版
s     取代後進編輯模式
(c/s指令相當於d指令之後進編輯模式,再加上游標位置處理方式不同)
cw ce 取代至字尾(不含空白)
cb    向前取代至字首
C     取代至行尾
c0 c^ 向前取代至行首/行首縮排(不含游標位置)(=d0a)
cc S  取代整行(=0DA)
== 刪除(剪下) ==
x     =Del,剪下。 (Insert mode時按Del只是單純的刪除)
X     向前刪,相當於一般的backsapce
de dw 向後刪至字尾/+空白
db    向前刪至字首(不含游標位置)
D     向後刪至行尾(或d$)
d0 d^ 向前刪至行首/行首縮排(不含游標位置)
0D    清除本行(不包括換行字元)
J     刪除換行字元,並將游標移到該位置。如果本行有字,會在結合的兩行中間插入一個space。
gJ    刪除換行字元,並將游標移到該位置。
dd    刪行 (=:d)
dgg   刪至檔首
dG    刪至檔尾
* 所有d和x的指令都是"剪下",不止是刪除。
* J不會"剪下"換行符號,只是單純刪除。
== 複製貼上 ==
y           複製 (用法跟d一樣,但大Y=yy,並非複製至行尾)
yy或Y       複製整行
p 或 P      貼到游標後(下) 或 前(上)
]p 或 [P    與p/P相同,但調整indent
gp 或 gP    與p/P相同,但游標會移到貼上的文字之後。(原本是在文字最後一個字)

== 暫存器 ==
* 暫存器說明
* "   上一次複製的內容。
* 0~9 再之前複製的內容。
* a~z 使用者自行使用
* A~Z 同a~z,但為Append功能
* %   目前編輯的檔案名稱
* #   前次編輯的檔案名稱
* +   系統暫存器 (例如Windows剪貼簿)
:reg  查看暫存器
"ayy  複製本行至暫存器a
"Ayy  附加本行至暫存器a (Append)
""p   (=p)

== 系統剪貼簿 ==
"+dd      剪下 (或用s-del)
"+yy      複製 (或用c-ins)
"+p       貼上 (或用s-ins)
滑鼠中鍵  貼到滑鼠游標指的地方



== 加數字應用 ==
3x    刪3個字元
d3w   也是刪3個字元
y3w   複製3個字元
2yy   複製2行 (y2y也行)
5a AB 輸入5次個AB (按ESC後才會跑出)
5dd   刪5行
5J    5行併一行(合併行之間插space)
5j    向下移動5行

= Insert Mode =
== 進入 ==
i a 從游標前/後進入
I   從行首第一個非空白字元進入
A   從行尾進入
o O 游標行下/上加一行進入
== 操作 ==
c-r0      貼上reg 0的內容
c-a       重覆上次貼上動作 (只試成功一次)
c-v       按鍵  輸入特定按鍵,例如c-v tab
c-v       數字  輸入ASC碼代表的字元 (Hex還是Dec?)
c-n c-p   文字自動完成 向後/向前
c-w       刪除游標前的字元
c-u       刪除本行所有插入的內容
c-d       縮排

= Visual mode =
v V       分別為Visual Mode和Visual Line Mode(選字和選行)
o         變換選取起始點 (再按一次回復為變換結束點)
gv        選擇上一次的選取範圍
aw as ap  select a word, a sentence, a paragraph
ab  aB    select a block ( ), a block { }

== Visual Block ==
* c-v進入vitual block
* 用鍵盤選擇區塊
* 按大寫I或A進入Inser Mode
* 輸入資料 (只會出現在第一行)
* 按ESC!過一秒才全部會跑出來
== visincr ==
在column mode下產生自動遞增的數字

= 排版 =
(依據sw(shiftwidth))
>>  indent
<<  un-indent
(依據tw(textwidth))
:ce(nter)  本行文字置中。注意是冒號命令!
:ri(ght)   本行文字靠右。
:le(ft)    本行文字靠左。
gqip  整段斷行。中文會出槌!:-(
gqq   本行斷行。

= Search / Replace =
== 單檔搜尋 ==
/ 和 ?    向後/前搜尋。特殊字必需以\脫逸。例如^$。
`*` 和 #    向後/前搜尋游標下的單字。
g* 和 g#  同*和#,但不需全部符合。
n 和 N    向後/前繼續找
區域變數: gd
全域變數: gD
\c        加在要搜尋的字串前面,可不分大小寫
set ic    ignore case,反過來的話就是noic
== 多檔搜尋 ==
:vim[grep] /search string/ `**/*`
:cn :下一個搜尋結果
:cp :上一個搜尋結果
:copen :QuickFix視窗
= 搜尋取代 =
:s/AAA/bbb      將目前行的第一個AAA換成bbb
:s/AAA/bbb/g    將目前行的所有AAA換成bbb
:12s/AAA/bbb/g  將第12行的所有AAA換成bbb
:%s/AAA/bbb/gIc  將目前文件中所有AAA換成bbb,區分大小小,並詢問確認。
:%s/AAA/BBB/gi  同上,不分大小寫,不詢問。
* 參數說明
%   目前文件
c   confirm, 替換前先詢問
g   一行中所有符合都替換(不然只會換第一個)
i   ignore, 大小寫忽略。

= File / Buffer =
:ls         顯示buffer列表。(或:buffers 或:files)
c-^         編輯前一個檔案 (= :e#)
:bn         buffer next
:bl         buffer last
:b1         開啟buffer (:ls中的buffer編號, 1~n)
:bd[elete]  刪除buffer
:e!         Reload file. (discard changes)
c-g         顯示目前檔名 (= :f),如果沒有顯示路徑的話,就打1c-g
:r 檔名     在游標處插入檔案
:35 r 檔名  將檔案插入至 35 行之後
:q          如本文有修改而沒存檔,會警告,且無法離開。(quit)
:q!         捨棄所有修改,強迫離開。
:wq         存檔後離開。縱使檔案未曾修改也是會再存一次檔。
:x          也是存檔後離開,但如果檔案沒有修改,則不會做存檔的動作。
ZZ          和 :x 完全一樣,隨您高興用哪一個。
:w          檔名  另存他檔。不加檔名就是寫入原檔。(write)
:X          加密。或是用vim -x 檔名 進入。
:recover 檔名   回復檔案

= 視窗功能 =
:sp 檔名 開另一新視窗來編輯檔案。
c-w s 即 :sp(lit),會開一新視窗,且原檔分屬兩個視窗。
c-w f 開一新視窗,並編輯游標所在處之 word 為檔名的檔案。
c-w q 即 :q 結束分割出來的視窗。
c-w o 隱藏其他視窗
c-w j 移至下視窗。
c-w k 移至上視窗。
zt or z set current line at top of window
zz or z  set current line at center of window
zb or z- set current line at bottom of window
zh  zl scroll one character to the right, left
zH  zL scroll half a screen to the right, left
c-Wn or :new create new empty window
c-Wo or :on make current window one on screen
c-Wj  c-Wk move to window below, above
c-Ww  c-Wc-W move to window below, above (wrap)
== 視窗調整 ==
c-w = 水平平均分配視窗大小
c-w < > 水平調整視窗大小
c-w +/- 垂直調整視窗大小

= TAB 操作 =
tabe[dit]
tabnew
tabo[nly]
tabn[ext] {count}

tabm[ove]

= 折疊功能 =
手動產生折疊的指令是 zf、zF
zfap ,zf^  將游標所在處的那個段落折疊成一行。
zf7G 自游標所在處至全文第 7 行折疊起來。
5zF 將游標所在處起算 5 行的內容折疊起來。
zo 將游標所在處的折疊打開。open。
zc 將游標所在處已打開的內容再度折疊起來
zC 將游標所在處已打開的內容全部折疊起來
zR 全部展開。
za 	Open/close (toggle) a folded group of lines.
zA 	Open a closed fold or close an open fold recursively.
zd 	Delete a folded line.
zD 	Delete all folded lines recursively.
zE 	Eliminate all folded lines in file.
zF 	Create "N" folded lines.

= Tags =
:ta  t jump to tag t
:nta jump to n th newer tag in list
c-]  c-T jump to the tag under cursor, return from tag
:ts  t list matching tags and select one for jump
:tj  t jump to tag or select one if multiple matches
:tags print tag list
:nc-T jump back to n th older tag in tag list
:npo jump back from n th older tag in tag list
:tl jump to last matching tag
c-W{  :pt  t preview tag under cursor, tag t
c-W] split window and show tag under cursor
c-Wz or :pc close tag preview window

= 括號指令 =
`[[`  `]]` start of section backward, forward
`[]`  `][` end of section backward, forward
[(  ]) unclosed (, ) backward, forward
[{  [} unclosed {, } backward, forward
[m  ]m start, end of backward, forward java method
[#  ]# unclosed #if, #else, #endif backward, forward
[*  ]* start, end of /*  */ backward, forward

= diff =
$ vimdiff filename1 filename2
:diffsplit {filename}
:diffthis
]c    Jump to next change
[c    Jump to previous change
do    diff obtain (:diffget)
dp    diff put (:diffput)

= 其它 =
:sh  :!c start shell, execute command c in shell
K lookup keyword under cursor with man
:make start make, read errors and jump to first
:cn  :cp display the next, previous error
:cl  :cf list all errors, read errors from file
c-L  c-G redraw screen, show filename and position
gc-G show cursor column, line, and character position
ga show ASCII value of character under cursor
gf open file which filename is under cursor
:redirf  redirect output to file f

= 常用set指令 =
nu[mber]  顯示行號
autoindent
tabtop
background

= 好用指令 =
:retab 可以將目前文件中的tab轉換成設定的space。
:1,$s/\t/    /g   取代tab為4 spaces
:set filetype= 設定目前檔案的類型,可以讓vim識別文件
ex: set filetype=python ; set filetype=java
=可以重新排版
所以可以用gg 跳到第一行,=G重新排版到最後一行
gg=G 就可以把整份文件重新排版
:set hls
搜尋字串高亮顯示,hls!可以關閉這個功能。
:set wrap
自動折行,wrap!可以關閉這個功能。
:set nu
顯示行號,nu!可以關閉這個功能。

= Code Trace =
* Ctags
* Exuberant Ctags
http://ctags.sourceforge.net/
apt-get install exuberant-ctags
* 操作
* $ ctags –R *  : 為當前目錄(含子目錄)產生tags檔案。
* $ vi –t tag   : 打開定義某變數的文件,並移到該變數。
* :ts           : tag list
* :tp           : tag previous
* :tn           : tag next
* Ctrl + ]      : 跳到變數定義
* Ctrl + T      : 退回原本地方(一步一步)
* 語言類型
* $ ctags --list-maps  (看目前支援的檔案類型)
* $ ctags --langmap=Tcl:+.exp  (不用+號的話會變替代)
* $ ctags --language-force=language (強制指定語言類型)

* Cscope
* quickfix
* Project
* trinity
* Source Explore
* taglist (Ctag)
* NERD_Tree

在 “Vim Cheat Sheet” 有 4 則留言

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *