emacsclient の使い方の種類と、便利な使い方
投稿日:
前回の記事からわかるように emacsclient にハマっている。前回も軽く触れている通り、emacsclient、emacs サーバ機能には2通りの使い方があると思う。ちなみに前回は、後者に関しての問題(文字化け)でした。
- 母艦派: 一つの emacs を立ち上げっぱなし
- → `M-x server-start` もしくは、.emacs に`(server-start)` でサーバ化
- → `emacsclient -n filename` でサーバに表示させ、サーバで閲覧編集する
- 認識: 母艦でファイル開くときに、ファイルパスを入力する必要がなくなる!
- 補足: オプション `-n` がないと、母艦で編集終了の操作 `C-x C-#` されるまで、端末に「ちょっと待っててね!」という旨のメッセージが表示され操作できません。
- デーモン派: デーモンとして使う
- `emacs --daemon` でデーモンとして起動
- → emacsclient -c -t で現在の端末にemacs を表示し、閲覧編集する
- 認識: 高速で起動する emacs だ!
emacsclient を便利に使いたいとき
emacsclient を便利に使いたいならこんな感じに成るんでしょうかね。
母艦派
alias を割り当てるだけ(?)
alias e="emacsclient -n"
# alias emacs="emacsclient -n"
# alias vi="emacsclient -n" # これはどうなの。。。
デーモン派
こちらは、既存のコマンド emacs
の置換になるはずなので、少し複雑になります。サーバの立ち上げなどをシームレスに行うための処理が欲しくなりますしね。僕の .zshrc はこんな感じで落ち着きました。
## emacsclient をシームレスに使うための関数
function e(){
echo "[$0] emacsclient -c -t $*";
(emacsclient -c -t $* ||
(echo "[$0] emacs --daemon"; emacs --daemon &&
(echo "[$0] emacsclient -c -t $*"; emacsclient -c -t $*)) ||
(echo "[$0] emacs $*"; emacs $*))
}
# ソケットの場所を環境変数に覚えてもらう
# emacs のバージョンによって少し場所が違うようなので、
# *** "/tmp" を要確認 ***
export USER_ID=`id -u`
export EMACS_TMP_DIR="/tmp/emacs$USER_ID"
export EMACS_SOCK="$EMACS_TMP_DIR/server"
## screen emacsclient をシームレスに使うための関数
function se(){
if which emacsclient &&
(echo "[$0] ls $EMACS_SOCK "; ls $EMACS_SOCK) ||
(echo "[$0] emacs --daemon"; emacs --daemon)
then
echo "[$0] screen -t emacs emacsclient -t -c $*";
screen -t emacs emacsclient -t -c $*
elif which emacs
then
echo "[$0] screen emacs -t -c $*";
screen emacs -t -c $*
fi
}
## $EMACS_TMP_DIR が無いとき
if ! [ -d $EMACS_TMP_DIR ]; then
#(socket 使わないバージョン、毎回emacs--daemonしてる。。。)
function se(){
if which emacsclient
then
echo "[$0] emacs --daemon"
emacs --daemon
echo "[$0] screen -t emacs emacsclient -t -c $*"
screen -t emacs emacsclient -t -c $*
elif which emacs
then
echo "[$0] screen emacs -t -c $*";
screen emacs -t -c $*
fi
}
fi
emacsclient -n -c
がダメなら、emacs --daemon
した後、emacsclient -n -c
しています。screen 使うときはそうもいかないので、デーモンと通信するためのソケットが存在するかどうか確認をするようになっています。コメントにも書いてありますが、バージョンによってソケットの場所と名前がビミョーに違うので、確認したほうが良いかもしれません。
僕はデーモン派なので、母艦派に関する使い方がどう考えても甘いですね。