ワタタツの日記!
2011 年 5 月 22 日 (日)
☆ emacsclient + tmux
emacs はサーバ内では -nw なものを tmux か screen の内で1つ立ち上げっぱなしにしておいて、他のウィンドウから何かを開くときは emacsclient を使うことで、人生の貴重な時間を大事にするのが普通です。 できれば emacsclient したときに emacs を開いているウィンドウに自動ですっとんで、ちょこっと編集した場合は C-x # の後 emacsclient を実行したウィンドウに戻ってきて欲しいです。
後者の方はまだやってなかったので、探してみたら screen 版をさくっと作られている方がたくさんおられたので emacsclient+screen - speg03の日記 を参考にしてまるぱくりして tmux バージョンにしました。これずっとやりたかったんだー。speg03 さんありがとうございます。
em
#!/bin/sh
SERVER_WINDOW=~/.emacs.d/emacs-server-window
CLIENT_WINDOW=~/.emacs.d/emacs-client-window
INIT_ELISP=`cat <<EOF
(progn
(add-hook 'server-visit-hook
(lambda ()
(local-set-key "\C-xj" (lambda ()
(interactive)
(progn
(save-buffer)
(server-edit))))))
(add-hook 'server-done-hook
(lambda ()
(shell-command
"tmux select-window -t \\\`cat $CLIENT_WINDOW\\\`")))
(server-start))
EOF
`
case `basename $0` in
em)
NOWAIT_OPT='--no-wait';;
em-w)
BG_OPT='>/dev/null &';;
em-ext)
;;
esac
if emacsclient -e nil 2>/dev/null; then
echo `tmux display -p '#I'` >$CLIENT_WINDOW
tmux select-window -t `cat $SERVER_WINDOW`
eval emacsclient $NOWAIT_OPT "$@" $BG_OPT
else
echo `tmux display -p '#I'` >$SERVER_WINDOW
emacs "$@" --eval "$INIT_ELISP"
fi
em-w
em-w は em のシンボリックリンクとする。 わしは emw にした。 emw で起動した場合は emacsclient のように C-x # でき、その後に元のウィンドウに戻ってきてくれる。便利過ぎる。
戻ってきたいわけではなく、ただファイルをぽぽぽぽーんと emacs に送りたいだけなら em で開けばいい。便利だなー
tmux の現在 window 番号
tmux で現在の window の番号をとってくるのは
tmux display -p '#I'
で出るんだけど、
tmux display -p '#I' >$CLIENT_WINDOW
とリダイレクトするとなぜか固まる。ctrl-c もきかない。 仕方がないので
echo `tmux display -p '#I'` >$CLIENT_WINDOW
としたらうまく行った。なんで?