ワタタツの日記!
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
としたらうまく行った。なんで?