コロン ":" の整形はフツーでいいです
何かまた忘れそうなので、備忘録。
"また..." なのですが 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_margin
、right_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 読めるようにならないとな、と。
と言う事で、おしまいです。