speg03の雑記帳

主に未来の自分のために試したことなどを記録しています

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とか,外部から利用するときのため.