header

2015年3月4日水曜日

Emacs evil の text object について調べた

今年から evil.el という Emacs 内で vim をエミュレートする拡張を使っているけれど、text object が便利そうだったので調べた。

Evil 単品で調べるとあんまり情報が入らないと思い、vim で text object で調べたら、以下のページ詳しく書いてあるようだった。

http://blog.carbonfive.com/2011/10/17/vim-text-objects-the-definitive-guide/

しかしながら、実際 dai(indent object?) なるコマンドを normal state で実行してもなんか動いてる感じがしなかった。

そこで Emacs 内での text-object のキーマップを調べてみた。(最初からこっちを調べればよかった) 以下のコードを scratch バッファとかで実行すると message バッファに出力がでる。

(require 'cl-lib)
(cl-loop with inner = (cdr evil-inner-text-objects-map)
with outer = (cdr evil-outer-text-objects-map)
for (char . func) in (append inner outer)
do (message (format "%c : %s" char func)))

出力結果

o : evil-inner-symbol
t : evil-inner-tag
` : evil-inner-back-quote
" : evil-inner-double-quote
' : evil-inner-single-quote
> : evil-inner-angle
< : evil-inner-angle
} : evil-inner-curly
{ : evil-inner-curly
B : evil-inner-curly
] : evil-inner-bracket
[ : evil-inner-bracket
) : evil-inner-paren
( : evil-inner-paren
b : evil-inner-paren
p : evil-inner-paragraph
s : evil-inner-sentence
W : evil-inner-WORD
w : evil-inner-word

inner の部分が a になっただけでキーバインドも同じなので
Outer text object は省略しました。



出力結果をみるとどうやら、vim と evil の text-object は完全互換というわけではないみたい。(evil-version は evil-git-1def26d で確認しました。)

気になって確認したところ

evil-inner-back-quote ってひょっとして`symbol'のような emacs-lisp 内のドキュメントを扱うのかと思ったけど、ほんとに backquote 同士で囲われてる文字列に対応していた。むしろそういう lisp 内のシンボルの扱いは evil-inner-symbol がうまいこと扱うことができるみたい。(`symbol'のような文字列の中のテキストと lisp コード内の foo-bar のようなシンボルも扱えた)

あっあと、括弧のテキストオブジェクトを扱うときに"(", ")"を押すのがちょっとキーボードから遠いし英語キーボードと日本語キーボードで配置が違うのでキーマップ変えようかなぁと思ってたけど、"b"でも扱えるようで特に設定しないでもいい感じに使えそう。

おわり

まだ指がもつれる感じだけど、テキストオブジェクトの考えかたが非常に面白いと思った。特に terminal で Emacs を使うのであれば C-M-キーの代わりに便利に使えそう。

0 件のコメント:

コメントを投稿

Popular Posts

Blogger templates

Blogger news