Hatena::ブログ(Diary)

月の塵

2013-12-22 Sun

Emacs に還って vi 性有りや無しや

(この記事は Lisp Advent Calendar 2013 の 22 日目の記事です)

「Emacs に vi 性あり」(Emacs has vi-nature)とは Vim 公案の説くところである。

実際、 Emacs における vi エミュレーションの歴史は GNU Emacs のリリースの翌年、 1986 年まで遡るという(参考: Evil: EmacsをVimのごとく使う - 導入編 - 貳佰伍拾陸夜日記)。

かように Emacs と vi は縁の深いものであるが、 Lisp 処理系でもある Emacs の vi モードに、オリジナルの vi にあった lisp モードが実装されていないのは残念なようである。

というわけで実装してみた。ベースはとりあえず、標準添付の viper-mode にした。

viper-mode では ex-setset 可能なオプションの名前がハードコードされているが、本体に手を入れると後々 Emacs のバージョンが上がったときに追随するのが面倒になりそうなので*1viper-lisp-mode というマイナーモードにした。 enable-viper-lisp-mode すると、 (, ), {, }, [‌[, ]‌] が S 式単位の移動になる。挙動はある程度 vi の lisp モードに合わせたが、 Emacs の S 式移動コマンドの上に実装しているので、オリジナルのものよりきちんと S 式を解釈しているところがある。他にも細かなところに違いがあるはずだ。

標準の C-M-f), C-M-b(, C-M-kd), C-M-DELd(, C-M-n}, C-M-p{, C-M-a[‌[,と vi らしいキーバインドで同じことができる。式をふたつ削除したい場合は d2)、式を書き換えたい場合は c)、ヤンクは y)、と vi でお馴染の方法で組み合わせることもできる。

viper-mode は色々なものがハードコードされていたり、副作用が分離されていなくてコードの使いまわしがしにくかったり、そもそも拡張することを前提に考えられていなかったり、と悩むところが多かった。 Evil の上に実装した方がよいのかもと思いつつ、なかなか試してみる時間が取れずに今回はこんな小ネタになったのでした。どっとはらい

*1:過去にそのような方針で改造していたものの更新が億劫になったのも今回の実装の動機だ

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/leque/20131222/p1