2014/02/21

Vim Macro

在使用 vim 的時候常常會不小心讓狀態列出縣 recording 的字樣,按 q 可以消除,今天不小心看到某篇文章才發現這是 vim 的 macro 功能,而且十分強大,vim 真的是一個可以活到老學到老的工具,來示範幾個範例。

.sample {
    border: 1px; color: red; padding: 4px; margin: 10px;
}

以這個 css class 來講,假設我們要讓每個 ; 後斷行,有非常非常多的方式,marco 的步驟如下

  1. 先將游標移到 border 字樣
  2. 在 visual mode 按下 qa(qa 是指將過程錄到 a 這個暫存,a-z, 0-9 都可以使用)
  3. 按下 f;,此時游標會跑到 ; 上面
  4. 按下 a,游標會跑到 ; 後面並且變成 insert mode
  5. 按下 enter,完成了第一個斷行
  6. 按下 esc 變成 visual mode,在按一次 q 完成錄製
.sample {
    border: 1px;
    color: red; padding: 4px; margin: 10px;
}

現在內容應該會變成這個樣子

將滑鼠移到 color 那行按下 @a(@ 就是執行 macro,後面接要使用的紀錄),斷行自動產生了,如果要到每一行按 @a 也太弱了,可以在前面接數字指定 marco 次數,以這個 case 來說 3@a 就可以完成所有的斷行。

另外示範一個 increment 的範例,在 vim 中使用 ctrl + a 可以針對某個數字增量,ctrl + x 可以減量,但在 windows 裡面 ctrl + a 會被定義為全選,關掉的方式很簡單,打開 .vimrc 檔,在 behave mswin 下加上 :nunmap <C-a>,這樣便會取消全選功能。

a = 1

以這個例子當範例,可以選擇取代法,也可以用 macro

  1. 在 visual model 將游標移到 a = 1 那行
  2. 按下 qa
  3. 使用 yy 複製,按下 p 貼上
  4. 移到新的行數後按 ctrl + a,會發現數字變成 2 了
  5. 按下 q 完成錄製

按下 @a 可以發現新的行數會變成 a = 3,搭配數字便可以做出你需要的數量了。