シェルコマンドの実行結果を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))


これで治りました。めでたし。めでたし。