emacsclient+screen
emacsclientは便利なのだけど,GUIのない環境でもうまく使いたい.
解決したいのはこの辺.
- screenのウィンドウ切り替え(行き帰り)をして欲しい.
- .emacsにemacsclient用の設定を書きたくない.
.emacsに書きたくないのは,スケジューラ専用のemacsとかを別で立ち上げていたりするので,そちらはサーバになって欲しくないから.
この辺を参考にした.
シェルスクリプト
emという名前で作った.他にem-wとem-extという名前でシンボリックリンクを作っておき,名前によって挙動を変えている.
#!/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 "screen -r -X select \\\`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 $WINDOW >$CLIENT_WINDOW screen -r -X select `cat $SERVER_WINDOW` eval emacsclient $NOWAIT_OPT "$@" $BG_OPT else echo $WINDOW >$SERVER_WINDOW emacs "$@" --eval "$INIT_ELISP" fi
使ってみる
# emacsclientのサーバが起動していないとき. # 開くファイル指定してもOK. $ em # サーバが起動してから. # Emacs開いているscreenのウィンドウへ移動する. $ em filename # 一時的な編集でscreenの元のウィンドウに戻りたいとき. # デフォルトだとC-x#で戻る(C-xjで保存してから戻る). $ em-w filename
残りのem-extはSVN_EDITORとか,外部から利用するときのため.