Group 是什麼

cycle.vim 搜尋相關候選字時 (例如目前是 true,應該要找到 false),會在一連串的 group 中查詢; 每個 group 是由 items 和 options 組成,以下便是一個簡單 group:
{ 'items': ['true', 'false'], 'options': {} }
如果想讓 foo 變成 bar,增加一個 items 為 ['foo', 'bar'] 的 group 就可以了。


怎麼設定 group

使用中的 groups 會存在 cycle_groups 這個變數,可以用 :echo string(g:cycle_groups) 查看; 但是這東西比較繁瑣,所以不建議直接修改它的值。

比較好的方式是在 .vimrc 定義 g:cycle_default_groups 這個變數, cycle.vim 啟動時會自動解析它,把需要的 group 都建好。

具體例子如下:

let g:cycle_default_groups = [
      \   [['true', 'false']],
      \   [['yes', 'no']],
      \   [['on', 'off']],
      \   [['+', '-']],
      \   [['>', '<']],
      \   [['"', "'"]],
      \   [['==', '!=']],
      \   [['0', '1']],
      \   [['and', 'or']],
      \   [['in', 'out']],
      \   [['up', 'down']],
      \   [['min', 'max']],
      \   [['get', 'set']],
      \   [['add', 'remove']],
      \   [['to', 'from']],
      \   [['read', 'write']],
      \   [['save', 'load', 'restore']],
      \   [['next', 'previous', 'prev']],
      \   [['only', 'except']],
      \   [['without', 'with']],
      \   [['exclude', 'include']],
      \   [['width', 'height']],
      \   [['asc', 'desc']],
      \   [['是', '否']],
      \   [['上', '下']],
      \   [['男', '女']],
      \   [['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
      \     'Friday', 'Saturday'], ['hard_case', {'name': 'Days'}]],
      \   [['{:}', '[:]', '(:)'], 'sub_pairs'],
      \   [['(:)', '「:」', '『:』'], 'sub_pairs'],
      \ ]

可以只為特定檔案類型設 group 嗎

cycle_groups 可以分成 global 和 buffer 兩個 scope(作用範圍)的版本,分別是 g:cycle_groupsb:cycle_groups 兩個變數。 搜尋的時候會以 buffer 版為優先,你可以讓 "get" 在 html 類型的 buffer 中轉為 "post",在其他類型 buffer 中則轉為 "set"

設定方式是在 .vimrc 定義 g:cycle_default_groups_for_{filetype},其中 {filetype} 表示想生效的檔案類型。
例如 html 專用的設定是:
let g:cycle_default_groups_for_html = [ ...(後略)

註:可以用 :echo string(b:cycle_groups) 檢查設定。


調整 group 行為

Group 的行為可以用 options 微調。目前(version 0.1.0)支援的選項如下:

  • name

    名稱,目前沒什麼用,只有處理衝突時(在多個 group 都有搜尋到目標字時)會顯示一下。

  • match_case

    搜尋候選字時,大小寫預設是不計的,所以 TruetruetrUe 都會被 cycle,只要設定其中一個即可。
    反之若要限制大小寫相符才 cycle,就要設定這個選項。

  • hard_case

    預設情形會保留關鍵字的大小寫位置,也就是 true/false 互換時,True 會變成 FalsetRUe 會變成 fALse
    這個選項可以停用此功能,互換時「若設定中是寫 fAlse,就一律換成 fAlse」。

  • sub_tag

    如果開啟這個選項,cycle.vim 會搜尋成對的 xml 開啟/結束標籤,有的話就一起 cycle 掉。
    例如 <EM>example</EM> 可以變成 <STRONG>example</STRONG>

  • sub_paris

    這個比較特別,它是 sub_pairend_withbegin_with 三個選項的簡易寫法,具體請看 doc。(建議用 sub_pairs 即可)

    [['(:)', '「:」'], 'sub_pairs'] 為例, 各個 item 會由 ":" 拆開, (:) 會拆成 「:」 會拆成
    cycle.vim 處理 "(" 時,會搜尋成對的 ")",若有的話就一起 cycle,
    例如 請保密) 可以變成 請保密」


具體要怎麼設定選項(options)

設定 group 時,每個 group 的第一個參數是 items,之後就都是 options 了。
支援以下各種型式:

  • [['true', 'false']] - 沒有 options
  • [['true', 'false'], {'match_case': 1}] - 以 hash 型式指定 options
  • [['true', 'false'], 'match_case'] - options 可以是字串,cycle.vim 會把它轉成 hash,hash 的預設值依各個 option 而不同,此處 'match_case' 的預設值為 1
  • [['true', 'false'], 'match_case', {'name': 'BOOL', 'sub_tag': 1}, 'hard_case'] - 字串和 hash 混著用也沒關係

你說完了沒

這篇應可滿足一般使用,我自己用到的也差不多這樣了。
在 doc 裡一些比較深入、低階的操作也有介紹,需要的話可以參考看看。