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-キーの代わりに便利に使えそう。

2015年3月3日火曜日

Emacs から firefox36 で browse-url-firefox が失敗する問題の対処法

いつのまにか、Emacs で browse-url で Firefox が違う URL(ただの google.com のページ)を開くようになっていたので調べたら、Firefox36 で–remote オプションが削除されていた。おそらく Emacs 側ですぐに対処されると思うけれど一応、対応策を書いておく。

ぐぐったら以下のページがみつかりどうやら、url-remote 変数を nil にすればうまいこといくらしい。http://askubuntu.com/questions/590265/clicking-link-in-emacs-no-longer-opens-page-in-browser

というわけで以下のようにした。

(require 'browse-url)
(defadvice browse-url-firefox (around my-ff-fix-remote-option activate)
"Apply firefox version 36 which was removed --remote option."
;; assign nil to use-remote of `browse-url-firefox'
(let ((system-type 'windows-nt))
ad-do-it))
(advice-add 'browse-url-mozilla :override 'browse-url-firefox)

なんか mew でリンク開くと失敗して調べたら browse-url-mozilla で開いてるっぽかったので browse-url-firefox で開くようにしておいた。(同じ引数をとっているので問題ないっぽいし、実際動いた。)

system-type を変更するのは正直きもいが、まぁ一時的だし browse-url-firefox の中だけなので我慢する。。。どうしても嫌な人は、リンク先にあるとおり url-remote の代入部分に nil をいれればいいと思います。(自分は開発版の Emacs なのでこっちのほうがアップデートするとき都合がよかった。)

Popular Posts

Blogger templates

Blogger news