読者です 読者をやめる 読者になる 読者になる

コロン ":" の整形はフツーでいいです

tech vim settings

何かまた忘れそうなので、備忘録。

"また..." なのですが vim プラグインvim-easy-align の設定について。

コロン : での形成は、プラグイン提供のデフォルトですと YAML(またはJSON) の記述スタイルで整形してくれます。;

mysql:
  # JDBC driver for MySQL database:
  driver:      com.mysql.jdbc.Driver
  # JDBC URL for the connection (jdbc:mysql://HOSTNAME/DATABASE)
  url:         jdbc:mysql://localhost/test
  database:    test
  "user:pass": r00t:pa55

でもここではそうじゃなく、もっとごく単純にコロン : で揃えたい、と思ったのです。
等号 = などみたく。

こんな風に。;

Joan of Arc 20 Years Anniversary Japan Tour - Tokyo 1st Night
* しゅつえん : Joan of Arc, Climb the Mind
* にちじ    : 2016/03/20 7:00PM(開場6:30)
* ばしょ    : Shibuya – TSUTAYA O-NEST
* りょうきん : 3800(前売) + 1drink / 4300(当日) + 1drink

そして色々悩んだ挙句。

.vimrc へ easy-align の設定としてこんな設定を施すことにしました。ごくごく普通に。;

let g:easy_align_delimiters = {
\ '.': { 'pattern': '\.\{2,}' },
\ '"': { 'pattern': '"', 'filter': 'v/^\s*"/', 'ignore_groups': ['String']},
\ "'": { 'pattern': "'", 'filter': "v/^\s*'/", 'ignore_groups': ['String']},
\ '-': { 'pattern': '-\{2,}'},
\ '#': { 'pattern': '\s#\+', 'ignore_groups': ['String'] },
\ ':': { 'pattern': ':',  'left_margin': 1, 'right_margin': 1, 'stick_to_left': 0 },
\ }

一番最後の行 ":" の行がそれです。

easy-align を起こして「[:] キーを叩いたら...」で、こんなことするよう定義しています。;

定義 内容
'pattern': ':', コロン ":" で。
'left_margin': 1, コロンの左側に挿入する半角スペース、1。
'right_margin': 1, コロンの右側に挿入する半角スペース、1。
'stick_to_left': 0 コロンは左(上の例だと "にちじ" や "ばしょ" と言ったラベル)側に寄せない、つまり真ん中に。

':' : { 'pattern': ':' } だけでも行けると思います。
left_marginright_margin を定義しないと "1" が、そして stick_to_left には "0" がデフォルト値として使われるようなので。(:h easy-align-list-of-options 参照)

確かに手っ取り早いのですが、easy-align 側がデフォルトで提供する、いわゆる YAML(またはJSON) なスタイルでの整形を行いたいケースがあった時、どうしようか、と。

ここが引っ掛かるところ。

もっとスマートな方法はないものかと、自分の知識の無さを恨む。

迷った他の方法 (1): キー ga<Right>:

easy-align の README.md の "Syntax-aware alignment" で紹介されている方法です。

vip なりでヴィジュアルモードで範囲を決め、ga で easy-align を呼び、右矢印キー <Right> を叩く、というもの。

悪くはないんだけど、矢印キーに手を持って行くのにちょっとした抵抗があったりするのです(笑。

ちなみに、この <Right> キーには、stick_to_left オプションの値を制御できるよう割り当てられていて、当該の値を "0" (オフ)で整形するよう振舞ってくれるみたいです((もっと細いこと言いますとstick_to_left に "0"、そしてleft_margin に "1" とセットするようになっています。))。

迷った他の方法 (2): コマンドライン:EasyAlign :>l1

これも同 README.md の "Examples using predefined rules" にバチーンと書かれているものです。

範囲を指定し、コマンドラインEasyAlign に引数 >l1 と言うもの。
分解しておくと、">" で stick_to_left をオフとして "0"、"l1" は left_margin として 1 文字分のスペースを入れる、という感じかと。

これも悪くないのですが、ちょっと面倒かも(笑

自分の場合、EasyAlign コマンドは "Align" と言う自分勝手なコマンドに定義しているので、こうなるのですが、;

:Align :>l1

それでも面倒?
とは言え、何れにせよ慣れの問題で、この抵抗感は最初だけなのかも、とは思ってはみるものの。

迷った他の方法 (3): 専用に別途コマンドを用意する? Alignc とか。

例えば、こんな感じで。;

command! -nargs=* -range Alignc <line1>, <line2>call easy_align#align('<bang>' == '!', 0, '', ':>l1')

でもこれは野暮か、と思い(笑、
却下。

他にもっとエレガントな方法あるのでしょうが、如何せん知識が...

決めたこの方法: ":" コロンのデフォルト設定を上書きしてしまう。

これが冒頭で採り上げた設定です。

プラグイン側では、<Space>、=、:、.、,、|、 &、そして # の 8 つのキャラクタを整形のデリミタとし、それぞれにデフォルトのスタイルが定義されています。

この内容を上書きで設定しています。

その設定は、g:easy_align_delimiters に定義します。詳細は README.md の "Extending alignment rules" に記載されています。

設定の仕方は、プラグイン側で、デフォルトとして提供する内容を参考にしながらだとイメージし易いかも、と思います。

記憶障害のために一応、ここにも転載しておこうかと。

let s:easy_align_delimiters_default = {
\  ' ': { 'pattern': ' ',  'left_margin': 0, 'right_margin': 0, 'stick_to_left': 0 },
\  '=': { 'pattern': '===\|<=>\|\(&&\|||\|<<\|>>\)=\|=\~[#?]\?\|=>\|[:+/*!%^=><&|.-]\?=[#?]\?',
\                          'left_margin': 1, 'right_margin': 1, 'stick_to_left': 0 },
\  ':': { 'pattern': ':',  'left_margin': 0, 'right_margin': 1, 'stick_to_left': 1 },
\  ',': { 'pattern': ',',  'left_margin': 0, 'right_margin': 1, 'stick_to_left': 1 },
\  '|': { 'pattern': '|',  'left_margin': 1, 'right_margin': 1, 'stick_to_left': 0 },
\  '.': { 'pattern': '\.', 'left_margin': 0, 'right_margin': 0, 'stick_to_left': 0 },
\  '#': { 'pattern': '#\+', 'delimiter_align': 'l', 'ignore_groups': ['!Comment']  },
\  '&': { 'pattern': '\\\@<!&\|\\\\',
\                          'left_margin': 1, 'right_margin': 1, 'stick_to_left': 0 },
\  '{': { 'pattern': '(\@<!{',
\                          'left_margin': 1, 'right_margin': 1, 'stick_to_left': 0 },
\  '}': { 'pattern': '}',  'left_margin': 1, 'right_margin': 0, 'stick_to_left': 0 }
\ }

そろそろ、いい加減、普通に vimscript 読めるようにならないとな、と。

と言う事で、おしまいです。