« 2012年6月のコミックス | メイン | 2012年7月のコミックス »

2012年5月27日 (日)

 雪見酒版ruby-modeでxyzzyのバッファ単位にタブ幅を指定できるようにする方法

今年に入り、ついにGitHubで開発が進んでいたxyzzyのリリース(0.2.2.236以降)が始まりました。
個人的にはUnicode周りの認識精度向上と、マルチモニタ環境でのウィンドウ位置保存バグの修正が嬉しいです。
有志の皆さんに感謝。

Rubyでコードを書くことが多い(たまにですが)僕としては、標準のモジュールにruby-modeが含まれてくれるとうれしいのですが、現在最新のリリース(0.2.2.238)にはまだ含まれていないので、服部さんのruby-modeを元に雪見酒さんが作成したruby-modeを使わせていただいています。

僕はちょっとしたスクリプトを書く程度なのでruby-modeの機能を使いこなしてはいないのですが、雪見酒版のruby-modeで困ったのがタブのインデント設定。
ドキュメントにある通り、服部版にあった *ruby-indent-column* が廃止され、共通設定のタブ幅((tab-columns) が返す値)を使うようになったのは良いのですが、共通設定とバッファのローカル設定が異なる場合が考慮されていないので(xyzzy 本体の 0.2.0.133 でも同様の問題が修正された形跡が……)、共通設定は互換性のためタブ幅を8としておき、Rubyプログラムを編集するバッファだけ自動でタブ幅を2や4にするといったことができないのです。

何とかならないかとマジメに調べてみたら、意外と簡単でした。
(オリジナルは ruby-mode100704.lzh より。表示幅の関係でコードの右端が切れている場合はこちらからご覧ください)


$ diff ruby-mode.l.orig ruby-mode.l
366c366
<                                       (insert " " (* level (tab-columns)))
---
>                                       (insert " " (* level (tab-columns (selected-buffer))))

これでバッファごとのタブ幅がインデントに反映されるようになるので、あとは .xyzzy に以下のような設定を追加すればOK。


(add-hook '*ruby-mode-hook* #'(lambda () (set-tab-columns 4 (selected-buffer))))

バッファローカルな tab-columns の考慮漏れだと思うので、雪見酒版にマージしていただけるとありがたいのだけど……。

投稿者 yone : 2012年5月27日 09:50

コメント

コメントしてください




保存しますか?