Command
vim http://www.google.com : 開啟google原始碼
vim -p qq.php cc.php : 用tabe顯示,用gt切換下一個tabe
vim -O qq.php cc.php : 垂直分割顯示
vim -o qq.php cc.php : 水平分割顯示
vim -u NONE cc.php : 不要進行初始化直接開啟檔案 (對開大檔會快很多)
新增、刪除、插入
O : 在游標那行的上一行插入新的一行
o : 在游標那行的下一行插入新的一行
I : 在該行的第一個字元進入插入模式
i : 在游標前進入插入模式
A ( = $ + a) : 在該行的最後一個字元進入插入模式
a : 在游標後進入插入模式
C : 刪除游標後的字串並進入到insert模式
cc : 刪除該行並進入到insert模式(保留縮排)
1cj : 刪除游標該行及下一行共2行並進入插入模式
D : 刪除游標後的字串
dd : 刪除整行
2dd : 刪除下列2行
10dh : 向左刪除10個字元
d0 : 刪除游標位置前的字元
d^ : 刪除游標位置前的字元(保留縮排)
d$ : 刪除游標位置到最後一個字元
de : 刪除游標位置到區塊的最後一個字元
db : 向前刪除區塊單字
dw : 向後刪除區塊單字
x : 刪除游標所在的字元
X : 向前刪除字元
s : 刪除游標那個字元並進入 insert 模式
S : 同 cc
10x : 刪除游標後的5個字元
J : 將游標所在列與下一列的資料結合成同一列
3J : 將下兩行包含游標該行共3行合併成一行
d0 : 游標所在處向前刪除到第0格
d^ : 游標所在處向前刪除到縮排處停止
diw : 刪除游標上的單字
ciw : 刪除游標上的單字並進入insert模式
cw : 刪除在單字上游標以後字串
ci' : 刪除單引號內的字串並進入insert模式
ci" : 刪除雙引號內的字串並進入insert模式
ci( : 刪除括號內的內容並進入insert模式
ci[ : 刪除中括號內的內容並進入insert模式
ci{ : 刪除大括號內的內容並進入insert模式
ci< : 刪除<(內容)>並進入insert模式
ca' : 刪除單引號內的字串及單引號並進入 insert 模式
di' : 刪除單引號內的字串
dst : 刪除 html 標籤, 但內容會保留
dit : 刪除 html 標籤內容, 但標籤會保留
cit : 刪除 html 標籤內容, 並進入 insert 模式
6i 或 6a + 任意字串 : 6 次 * 任意字串
d/a : 刪到 a 為止
guu : 整行變小寫
gUU : 整行變大寫
g~~ : 整行大小寫交換
複製、剪下、貼上
shift + Insert : (insert模式下)將系統剪貼簿貼上游標位置。
ctrl + v : 對區塊共同做編輯
ctrl + v 選取後按c : 把選取的字刪掉並進入insert模式
V(select whole line) + y : 相當於 ctrl + c
v(select area) + y : 相當於 ctrl + c
P : 貼上於目前游標的上一行
p : 貼上於目前游標的下一行,相對於 ctrl + v
y1G : 複製游標所在列到第一列的所有資料
y0 : 複製游標所在的那個字元到該行行首的所有資料
y$ : 複製游標所在的那個字元到該行行尾的所有資料
yy : 複製游標所在的那一行
20yy : 複製 20 行
Y : 複製游標所在的那一行
:m+ : 把目前這一行往下移動一行
:m-2 : 把目前這一行往上移動一行
shift + insert : 在insert模式貼上滑鼠複製的東西
[p : 貼到游標前
]p : 貼到游標後
dip : 刪除最外層的tag及裡面的所有內容
yiw : 複製單字
yi' : 複製單引號內的字串
vi' : 選取單引號內的字串並進入visual模式
" + a + y + i + ' : 將單引號的內容(不包含單引號)存進暫存a
" + a + y + a + ' : 將單引號的內容(包含單引號)存進暫存a
v + ^ + y : 複製從游標到最前面的字串
vitp : 貼在 HTML Tag 裡
:2y : copy 第 2 行
:2,7y : copy 第 2 ~ 7 行
Visual模式
~ : 在visual模式已選取下,切換大 / 小寫
U : 在visual模式已選取下,轉成大寫
u : 在visual模式已選取下,轉成小寫
viw : 選取游標上的單字並進入visual模式。(v = visual, i = inside, w = word)
vit : 選取<tag>裡面的內容並進入visual模式。例: <a href='#'>(選取這一塊)</a>
vat : 選取<tab>全部內容包含<tag>本身,並進入visual模式(a = around)。選取<a ..(略)..>內容</a>整段
vip : 選取最外層的tag及裡面的所有內容並進入visual模式
ggVG : 全選
= : 在visual模式己選取下,自動縮排
g, ctrl + g : Count selected lines
游標移動
# : 向前搜尋游標上相同的單字。或按N 往下 n 往上
* : 向後搜尋游標上相同的單字
% : 在() {} 上會切換到相對應的上
[ + { : 在括號裡游標會移到 {
] + } : 在括號裡游標會移到 }
[ + ( : 在括號裡游標會移到 (
] + ) : 在括號裡游標會移到 )
0 : 游標移到最前
^ : 游標移到最前(保留縮排)
$ : 標移到最後
:12 或 12G: 游標移到第12行
H : 移動到該頁第一行
M : 移動到該頁中間那一行
L : 移動到該頁最後一行
1G 或 gg : 移動到檔案的第一行
G : 移動到檔案的最後一行
w : 移動到下一個單字, 2w 移到下兩個單字
W : 跳下一個單字比w更遠
b : 移動到前一個單字、與w相反
e : 移動到目前單字的最後一個字
t + a : 找到 a 的前一格
fa : 往下移動找到 a 。按;移到下一個
Fa : 往上找到 a 。按;移到下一個
3fa : 移動到往後的第三個a的位置
4j : 往下移動4行
4k : 往上移動4行
4h : 往左移動4格
4l : 往右移動4格
ctrl + o : 回覆到上一個游標的位置(按太多會到你上一個編輯的檔案)
( : 跳到上一個區塊的第一行或最後一行
) : 跳到下一個區塊的第一行或最後一行
[[ : 跳到上一個區塊的第一行
]] : 跳到下一個區塊的第一行
{ : 跳到上一個區塊的最後一行
} : 跳到下一個區塊的最後一行
+ : 移動到非空白區的下一列(保留縮排)
- : 移動到非空白區的上一列(保留縮排)
mx : 記下目前的為止為 x
'x : 回到 x 這個位置
'' : 回到最後的 jump點
ctrl + i : 回到後一個 jump 點
ctrl + o : 回到前一個 jump 點
畫面移動
ctrl + f : 下一頁 ( = Page Up)
ctrl + b : 上一頁 ( = Page Down)
ctrl + d : 下半頁
ctrl + u : 上半頁
ctrl + y : 畫面移上一行
ctrl + e : 畫面移下一行
zz : 移動畫面置中游標
zb : 移動畫面置底游標
zt : 移動畫面置頂游標
zl : 畫面向右水平移動一格
zL : 畫面向右水平移動半個畫面
zh : 畫面向左水平移動一格
zH : 畫面向左水平移動半個畫面
zs : 根據目前的游標位置將畫面水平移動到最左
ze : 根據目前的游標位置將畫面水平移動到最右
對每個視窗下 :set scb (:set scrollbind 縮寫), 然候再測試是否 work (ctrl + e)
取消的話對其中一個下 :set scb! (:set noscrollbind 縮寫) 就可以解除了
搜尋、取代
/abc : 向下搜尋abc
?abc : 向上搜尋abc
n : 下一筆搜尋結果
N : 上一筆搜尋結果
:35,44g/uid/ : 在 33 到 44 行之間搜尋 uid
:100,200s/vbird/VBIRD/g : 在 100 到 200 行之間搜尋 vbird 並取代為 VBIRD
:1,$s/word1/word2/g : 從第一行到最後一行尋找 word1 字串,並將該字串取代為 word2
:1,$s/word1/word2/gc : 且在取代前顯示提示字元給使用者確認 (confirm) 是否需要取代
:%s/phpindo/phpinfo/g : 取代。%s = 1,$s
:101,201s/phpindo/phpinfo/g : 取代 101~201 行
gd : 在程式的變數上循序按下 gd,可以找到 local declaration 的位置
gD : 同上,只是會找到 global declaration 的位置
分割視窗
:new : 開新的水平分割視窗
:vnew : 開新的垂直分割視窗
:sp : 新增目前的檔案到新視窗
:sp t1.php : 新增另一個檔案加入到分割視窗
vs : 同vsp
:vsp : 垂直分割
:sp ./ : 用選取的方式尋找檔案
:q : 離開
shift + ZZ : 離開; 等同 :q
ctrl + ww : 切換到下一個視窗
ctrl + w + 3w : 切換到第三個視窗(如果有多個視窗)
ctrl + w + p : 切換到前一個視窗
ctrl + w + n : 開啟新視窗
ctrl + w + w : 游標切到不同的視窗 (不管是水平還是垂直)
ctrl + w + q : 結束目前視窗
ctrl + w + x : 視窗交換位置
:sq + 按space + (按)tab + ↓ :列出可選的選項,按↓進入資料夾
ctrl + w + v : 垂直
ctrl + w + s : 水平
ctrl + w + o : 留下目前視窗關閉其他
ctrl + w + (j、k、h、l) : 切換下、上、左、右
ctrl + w + (+、-) : 調整垂直大小
ctrl + w + (<、>) : 調整水平大小
ctrl + w + _ : 將視窗垂直打開到最大
ctrl + w + |(pipe) : 將視窗水平打開到最大
ctrl + w + = : 將所有視窗的寬高調整至均等
ctrl-w K: Change vertical split window to horizonal split window
ctrl-w H: Change horizonal split window to vertical split window
暫存器
:reg : 把暫存器裡的東西叫出來看
"2y : 複製到暫存器索引2 (可配合visual模式使用)
"kyy : 複製整行到索引k
"kp : 貼上索引k
:let @k='' : 清空索引k
:let @0=@1 : 索引1複製給索引0
"+x : 剪下,將資料放進剪貼簿及vim緩衝區
"+y : 複製,將資料放進剪貼簿及vim緩衝區
"+gp : 貼上
buffer
:e qq.php : 跳去編輯 qq.php 這個檔案, qq.php 會在 buffer 裡
:ls : 顯示buffer裡的檔案
:bn : 切到下一個buffer檔案
:bp : 切到上一個buffer檔案
:b2 : 切到buffer 2號檔案
:b qq.php : 切到檔名為qq.php的buffer檔案
ctrl + 6 : 回到上一個開的buffer檔案。注意 : :bp是不一樣的!
tab
:h tabe : 列出tabe的helper
gt : 跳到下一個tabe
gT : 跳到上一個tabe
:tab ba : 將目前的buffer切換成tab
:tabe : 開一個新的tab
:tabe %: 以目前檔案開一個新的tab
:tabe qq.php : 開啟qq.php為tab(不存在就會在當前目錄建立新檔案)
:tabmove 1 : 將當前 tabe 順序移動到順序1
3gt : 跳至tabe順序3
儲存、離開
:wa : 全部儲存
:qa : 關掉全部視窗
:w : 儲存
:q : 離開
:w! : 強制儲存
:wq : 儲存後離開
:w ~/qq.php : 另存新檔
:e qq.php : 打開qq.php,並關閉目前所在頁面
vimdiff
:diffget: restore line changes during vimdiff
]c: move to the next difference.
[c: move to the previous difference.
其他操作
u : 回復上一個動作
ctrl + r : 回復下一個動作
:noh : 取消選取的highlight
:! ls -l : 在 vim 下暫時切到外面執行 ls -l
:set nu : 顯示行號,設定之後會在每一行的最前面顯示行號
:set nonu : 與 set nu 相反,為取消行號!
:set paste : paste模式,直接貼上文字時格式不會跑掉
:set tabstop=4 : 設定一個tab等於四個空白長度
:set expandtab : 設定以後,使用tab鍵時會用空白取代(由tabstop設定而定)
:set incsearch : / 不需按 Enter, 邊打邊搜尋
:set nohlsearch : / 不要 highlight 找到的字串
:retab : 將tab轉換成space
:edit or :edit! : reload
ctrl + p : 自動補齊變數名稱或語法
1 + ctrl-g: show the full path of current file
~ : 可以將游標上的字切換大 / 小寫
. : 重覆前一個動作
>> : 縮排
3>> : 游標那行與下2行一起縮排
<< : 縮排倒退
:3,5>> : 3到5行向右縮排2次
:3,5< : 3到5行向左縮排1次
:%norm A* : 在每一行最後面加上 *。 norm = type the following commands
:11,13 norm Aqq : 在第 11~13 行最後面加上 qq 字串
gf : 跳到 source code 的檔案, 例如在 /tmp/cc.ff 上按, 就會跳到該檔案
ctrl + w + gf : 會在 tab 打開 source code 的檔案
:指令 + ctrl + d : 會出現相關指令的 menu, 再按 tab 會補齊指令
Execute outside commands
Json
Install jq command
Make one line into readable json
:'<,'>!jq
visual select on the JSON line, then execute jq
Make readable json into one line
:'<,'>!jq -c
visual select on the JSON line, then execute jq -c
範圍
加上註解(//)
- 加上註解 :
- 在第一行按下
ctrl + v 進入到選取區塊模式
- 游標向下移到要註解的最後一行
- 按
I
- 輸入
// (註解符號,看你的程式語言是什麼)
esc
- 取消註解 :
- 在第一行按下
ctrl + v 進入到選取區塊模式
- 游標向下移到要註解的最後一行
- 按一個右鍵, 讓區塊把 // 包起來
- 按
x刪除
或
- 加上註解 :
:34,37s/^/\/\//g
- 取消註解 :
:34,37s/^\/\///g
Append text to multiple lines:
- - Enter Visual Block mode.
- Use j/k to select the lines.
- $ - Move cursor to last character.
- A - Enter insert mode after last character.
- Insert desired text.
- - Exit insert mode and finish block append.
範圍縮排
shift + v : 選出要縮排的列再按>>,這時候只會縮排一次,再按.(複製上一個動作)就可以要縮排幾次就按幾下
vim plugin
hello.vim
function! XX()
echo getpos(".")
endfunction
隨便編輯其他文件
:source hello.vim
:call XX()
就會 print 出你目前的游標位子了, 如: [0, 3, 8, 0]
get external command return
let a = system('ls -al')
echo a
讓 vim 複製到 Clipboard
確認目前 vim 版本有支援此功能
(TODO: 未完成)
vim --version | grep clipboard
如果看到 +clipboard or +xterm_clipboard 就表示有
看到 -clipboard and -xterm_clipboard 表示沒有
:set clipboard=unnamed
:set clipboard+=unnamed
查看檔案的 binary hex
command:
vim test.txt
test.txt 進入後輸入 :%!xxd
0000000: 3031 3233 3435 3637 3839 4142 4344 4546 0123456789ABCDEF
0000010: 4748 494a 4b4c 4d4e 4f50 5152 5354 5556 GHIJKLMNOPQRSTUV
0000020: 5758 595a 0a WXYZ.
最後面的 0a 是換行字元
編輯中間的 hex
0000000: 3031 3233 3435 3637 3839 4142 4344 4546 0123456789ABCDEF
將 23 (hex 3233) 位置調換成 32 (hex 3332)
0000000: 3031 3332 3435 3637 3839 4142 4344 4546 0123456789ABCDEF
再執行 :%!xxd -r 將 hex 轉回來
0132456789ABCDEFGHIJKLMNOPQRSTUVWXYZ