シェルコマンドの実行結果をEmacsのバッファに吐き出す
見つけた
lewang/e-sink - GitHub https://github.com/lewang/e-sink
cloneします。
$ git clone git://github.com/lewang/e-sink.git
e-sinkはe-sink.elとe-sink.plから構成されています。
e-sink
-- e-sink.el `-- e-sink.pl
設定
e-sinkはemacsclientを使うので
(server-start)
しておく。
そんで、e-sinkを読み込む。
(add-to-list 'load-path "/path/to/e-sink") (require 'e-sink)
使いかた
lessとかの代わりにe-sink.plを使えばいいだけ。
適当にsymlink貼っておけば良いさ。
$ ln -s /path/to/e-sink.pl $HOME/bin/e-sink
細かい使いかたは -h でも見てくださいな。
$ e-sink -h Usage: /home/toshi/bin/e-sink [OPTION]... [buffer-name] --tee output to STDOUT as well --cmd use command-line instead of temporary file -h this screen
日本語が文字化けする!?
使ってみたら日本語が文字化けした。
ソース見てみたら、Emacsのバッファにコマンドの結果を挿入しているのはこのe-sink-insert-and-finishっていう関数のようだ。
(defun e-sink-insert-and-finish (name file) "" (let ((buffer-name (e-sink-buffer-name-transform name))) (with-current-buffer buffer-name (goto-char (point-max)) (insert-file file) (e-sink-finish name))))
あ、細かいけどinsert-fileはプログラムから使うものではないので良い子はinsert-file-contents使いましょう。
insert-file-contentsはエンコードを
- coding-system-for-read
- file-coding-system-alist
- last-coding-system-used
を見て判断する。
insert-fileのドキュメントにはそこらへん載ってないんだけど、同様にここらを設定すれば良い気がした。
ので、
;; Specify the coding system for read operations. (setq coding-system-for-read 'utf-8-unix)
ってやってみたくなるんだけど、これだとutf-8以外のファイルもutf-8で開かれちゃって、
Shift-JISとかで書かれた.elが化けちゃったりした。
そこでdefadviceですよ。
e-sink-insert-and-finishのときだけcoding-system-for-readを設定する。
;; 日本語が文字化けしないように (defadvice e-sink-insert-and-finish (around set-encoding activate) (let ((coding-system-for-read 'utf-8-unix)) ad-do-it))
これで治りました。めでたし。めでたし。