有馬総一郎のブログ

(彼氏の事情)

2018年11月17日 17:31:43 JST - 4 minute read - Vim

間抜けがvim-easy-alignを使うと'-'(ハイフン)で整列出来ないと早合点してtabularを使う

ええ、私のことです。結論から言うとg:easy_align_ignore_groupsが影響してコメントが無視されてました。以上、終わり。

以下、アホが己の過ちに気付くまで。

初めは vim-scripts/Alignを使おうとした。しかし、以下のエラーメッセージが出るので止めた。

C:/Users/ユーザー名/.vim/plugged/Align/plugin/AlignMapsPlugin.vim の処理中にエラーが検出されました:
行  170:
E227: \tt というマッピングは既に存在します

なので、 junegunn/vim-easy-alignを使うことにした。皆が設定するようにvmap <Enter> <Plug>(EasyAlign)とする。

当時、sqlを書いていた。

select
  COLUMN_ABC   -- カラムABC
  ,      COLUMN_aiueo-- カラムaiueo
      ,        COLUMN_1234  -- カラム1234
    ,    COLUMN_alias     -- カラムalias

上記のようにSQLがあった場合、ビジュアルモードにして選択してEnter、そして,を押せばカンマでの整列はできた。しかし、-を入力しても、コメントが整列出来ない。

(Unknown delimiter key: -)

と出るので、ははぁーんとCtrl+xを入力して正規表現[-]\{2,\}を入力、これでどうだ!何も変化しない…'<,'>EasyAlign * /[-]\{2,\}/としても同じ。バカなぁと思い、何か制約があって出来ないのと早合点。

そして、似たような整列プラグインないかと、 godlygeek/tabularを使う。

これなら'<,'>Tabularize /--で整列できる。しかも'<,'>Tableize /--で以下のようにテーブルまで出来る!

      | COLUMN_ABC               | カラムABC   |
      | ,      COLUMN_aiueo      | カラムaiueo |
      | ,        COLUMN_1234     | カラム1234  |
      | ,    COLUMN_alias        | カラムalias |

それで、めでたしめでたしなんだけど、ふと vim-easy-alignドキュメントを見ると、「ハイライトでコメント、文字列扱いしてるものは区切り文字を無視しますよー」と書いてあるではないか!?しかもデフォルト設定。

つまり、let g:easy_align_ignore_groups = ['String']とすることで、文字列のみ除いてコメントを整列対象に含められる。

全体の設定を変えたくないというのであれば、<Ctrl+g>を押すごとに、{'ig': []){'ig': ['String']){'ig': ['Commet']){'ig': ['String', 'Commet'])と無視するグルーブを変えられるので、適宜変えて実行する。

もしくは、 vim-easy-align の設定、忘れて怖くなったので - ばかもりだしや、 extending-alignment-rulesなどを参考に、区切りルールを設定しておけば快適に整列出来る。

let g:easy_align_delimiters = {
\ "-": { 'filter': 'v/^\s*--/', 'pattern': '[-]\{2,\}', 'stick_to_left': 0, 'left_margin': 1, 'right_margin': 1, 'ignore_groups': ['String']},
\ '\': { 'pattern': '\s\{2,\}' },
\ }
オプション 意味
filter 整列対象とする行 この場合、v/^\s*--/としているので、空白文字で始まって--が続く行を除いた行を対象とする
pattern 整列基準となる文字列のパターン この場合、ハイフンが2つ以上続く文字列
left_margin 整列基準となる文字列の左側の余白スペース
left_margin 整列基準となる文字列の右側の余白スペース
stick_to_left 整列基準となる文字列を前列の左隣に寄せるかどうか boolean型で1(true)か0(false)

stick_to_leftの意味がイマイチ良く分かりにくいというか。

{'stick_to_left': 1, 'left_margin': 0} 整列基準となる文字列を、それぞれ前列の左隣に余白0で寄せる

select
  COLUMN_ABC--               カラムABC
  ,      COLUMN_aiueo--      カラムaiueo
      ,        COLUMN_1234-- カラム1234
    ,    COLUMN_alias--      カラムalias

{'stick_to_left': 0, 'left_margin': 1} 整列基準となる文字列を、前列の中央に左隣に余白1で寄せる

select
  COLUMN_ABC               --カラムABC
  ,      COLUMN_aiueo      --カラムaiueo
      ,        COLUMN_1234 --カラム1234
    ,    COLUMN_alias      --カラムalias

ちゃんとドキュメントは読もうということですね…