alignta 秋の仕様改訂(案)

alignta の仕様が変わりました、というエントリではありません。

verion 0.2.0 から早半年。時間の経過とともに、現行の alignta の使いにくい点なども徐々に明らかに*1なってきました。そこで、こんな風に変えようと思ってるんですけどどうでしょう? という趣旨のエントリです。

問題の改訂案は、自分の中では大体この線で固まっているんですが、使っている人から「待った!」がかかるんなら、ちょっと立ち止まってみようかと。そんなわけで、作業に着手する前に、変更予定の項目についてまとめてみました。ご意見等ありましたらコメ欄にでも書き込んで下さると有難いです。

注意

このエントリの内容は随時書き換えます。また、必ずこの通りに仕様が変更されるということを保証するものでもありません。あくまで「案」です。(追記:2011-09-13)


以下の変更を行う予定です。

Vim の要求バージョンを 7.2 7.1 に上げる

Vim 7.0 を使っていた人から alignta を使おうとすると SEGV するという報告がありました。古い Vim でも動くようにしよう、という方向のモチベーションはあんまりないので、単純に 7.2以上を required にします。

とりあえず 7.1 を required としてみる。それでもやっぱりダメという報告があれば 7.2 にする。(追記:2011-09-13)*2

パターンは正規表現としてDWIM に解釈し、! はオワコン

現状、コマンド名に ! を付ける/付けないでパターンを正規表現として解釈するか否かを制御するようになっています。*3これは事実上 :Alignta と :Alignta! という2つのコマンドを使い分けているのに等しいので、「1つのコマンドですべてをまかなう」という要求に反しているように思います。

また、コマンドラインモードで alignta を使おうとして、

:Alignta \d\+

! 忘れた。ぐぬぬ……

という状況もいろんな人のところで起こっているようです。! の有無によってコマンドの引数の解釈を変える、という方法はあまり筋がよろしくない、というのが今となっての私の評価です。*4

よって、! の有無によってパターンの解釈方法を選択する、というのはやめ、パターンは原則、正規表現として解釈することにします。

! をなくす、という線は決まりだけど、パターンの解釈方法については試行錯誤中(追記:2011-09-13)
 ↓
エスケープしたいものを -e で指定する、正規表現として解釈したいものを -r で指定する、そのどちらを選択しても結局 -e または -r の指定忘れが発生し使い勝手に地味に響いてくると思ったので、

パターンを正規表現として解釈するか、エスケープして字面通りの文字列とするかをプログラムで判別することにした。(明らかに)正規表現のように見えるものは正規表現として解釈し、そうでないものは字面通りの文字列として解釈する。

この振る舞いを明示的に変更したい場合のみ -e または -r を前置する。

正規表現のように見える」の定義についてはヘルプに記載する。ほとんどのケースで -e も -r も指定することなく、ユーザーの意図した解釈が行われればよしとする。(正規表現のようには見えないが実は正規表現、みたいな特殊なケースでは -r を指定してもらう)(追記:2011-09-14)


すべて正規表現として解釈するとなると、パターンによってはエスケープがめんどくさくなるものもありますが、そういうのは

 -e, -escape

を前置することで正規表現としての解釈を抑制できるようにしようかと考えています。

Vim正規表現が苦手、という人にとっては現行のままの方がよい(安全)かも知れませんが、正規表現を一切使わないというわけにもいかないでしょうし、どうせ使うなら ! の有無で使い分けるより、終始一貫して正規表現である方がいいでしょう。

マージンの指定書式で @ を不要とする → 完了

マージンの指定と @ という記号の間には何の関係もない*5ので、この対応は覚えなければなりません。これは「覚えることを少なくする」という alignta の要求に反するのでなくします。

@ をなくすと直に数値で指定する形になりますが、

01
10
1:3
3:1

こういうのを整列のパターンにすることもそんなにないでしょうし、あったとしてもそこは数字じゃなくて \d が使われる局面じゃないかと思うので、実際のところパターンとの衝突は問題にならないのではと思います。

引数なしで実行した場合は前回と同じ整列を行う → ボツ

同じ条件(整列オプション&パターン)で整列を繰り返し実行したいことは多々あるので、こうした方が便利でしょう。

現在、引数なしで :Aligntaコマンドを実行した場合は g: or b:default_arguments変数に設定された引数リストを使うことになっていますが、これらの変数は deprecated とします。

当面は unite-alignta の候補として選択できるようにして、徐々に unite-alignta のバッファローカル設定への書き換えを促します。

〜な場合は前回と同じ整列を行う → 考え中

考え中

これは履歴機能の一部(特殊ケース)だなあ。(追記:2011-09-13)

後、整列の繰り返しを支援するため

  • repeat.vim に対応し、.(ドット)で繰り返せるようにする
  • 整列オプション&パターンの履歴をとり、unite-alignta から呼び出せるようにする

が ToDo となっています。


以上です。

ご意見等ありましたらコメ欄へどうぞ。Twitter へのリプも気軽にどうぞ。

*1:最初にリリースした時点で明察できるべきではありますが……

*2:ついこの間、循環参照にまつわる VimGC のバグ(?)を踏んだところなので、SEGV っていうとそういうところが怪しいのではないかと思うのだが、どこかに循環参照あったかなあ。vim-oop にはもう循環参照はないはずだし……ぬぬぬ。

*3:この仕様は、Vim正規表現にあまり精通していないユーザーが、Perl互換の正規表現(以下 PCRE)とのメタ文字の扱いの違いで混乱するのを避けるためにこのようにしました。例えば、"(" や "{" の位置で揃えたい場合など、これらは PCRE ではエスケープしなければなりませんが、Vim正規表現では逆で、エスケープすることでメタな意味を持つようになります。この辺のメタ文字の扱いについては、私自身 Vim を使い始めてからかなりの間馴染めず、ずっと eregex.vim のお世話になっていたので、「ユーザーはみんな、Vim正規表現についてちゃんとわかってる」という前提には立たないことにしたのでした。そこで、「俺はわかっている!」という人は自分からその旨を ! で宣言してもらって、Vim正規表現を思う存分使ってもらうと、そういう仕様でした。

*4:が、考えた当初はイケてると思っていたw

*5:一方、寄せを指定するための <, |, > などは直感的でわかりやすいと思っています。