Jex’s Note

Vim 快捷鍵

Command Line

  • 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 : 水平分割顯示

新增、刪除、插入

  • 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 模式
  • 6i6a + 任意字串 : 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模式己選取下,自動縮排

游標移動

  • # : 向前搜尋游標上相同的單字。或按N 往下 n 往上
  • * : 向後搜尋游標上相同的單字
  • % : 在() {} 上會切換到相對應的上
  • [ + { : 在括號裡游標會移到 {
  • ] + } : 在括號裡游標會移到 }
  • [ + ( : 在括號裡游標會移到 (
  • ] + ) : 在括號裡游標會移到 )
  • 0 : 游標移到最前
  • ^ : 游標移到最前(保留縮排)
  • $ : 標移到最後
  • :1212G: 游標移到第12行
  • H : 移動到該頁第一行
  • M : 移動到該頁中間那一行
  • L : 移動到該頁最後一行
  • 1Ggg : 移動到檔案的第一行
  • 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 : 根據目前的游標位置將畫面水平移動到最右

在分割視窗時讓其他視窗一起 scrolling down

對每個視窗下 :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 + q : 結束目前視窗
  • ctrl + w + x : 視窗交換位置
  • :sq + 按space + (按)tab + :列出可選的選項,按↓進入資料夾
  • ctrl + w + v : 垂直
  • ctrl + w + s : 水平
  • ctrl + w + o : 留下目前視窗關閉其他
  • ctrl + w + (jkhl) : 切換下、上、左、右
  • ctrl + w + (+-) : 調整垂直大小
  • ctrl + w + (<>) : 調整水平大小
  • ctrl + w + _ : 將視窗垂直打開到最大
  • ctrl + w + |(pipe) : 將視窗水平打開到最大
  • ctrl + w + = : 將其他視窗復原大小

暫存器

  • :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 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,並關閉目前所在頁面

其他操作

  • 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 : 自動補齊變數名稱或語法
  • ~ : 可以將游標上的字切換大 / 小寫
  • . : 重覆前一個動作
  • >> : 縮排
  • 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 會補齊指令

範圍

加上註解(//)

  • 加上註解 :
    1. 在第一行按下ctrl + v 進入到選取區塊模式
    2. 游標向下移到要註解的最後一行
    3. I
    4. 輸入 // (註解符號,看你的程式語言是什麼)
    5. esc
  • 取消註解 :
    1. 在第一行按下ctrl + v 進入到選取區塊模式
    2. 游標向下移到要註解的最後一行
    3. 按一個右鍵, 讓區塊把 // 包起來
    4. x刪除

  • 加上註解 : :34,37s/^/\/\//g
  • 取消註解 : :34,37s/^\/\///g

範圍縮排

shift + v : 選出要縮排的列再按>>,這時候只會縮排一次,再按.(複製上一個動作)就可以要縮排幾次就按幾下

vim plugin

hello.vim

function! XX()
    echo getpos(".")
endfunction

隨便編輯其他文件

  1. :source hello.vim
  2. :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

Comments