トップ «前の日記(2011 年 5 月 19 日 (木)) 最新 次の日記(2011 年 6 月 1 日 (水))»
編集 RSS

ワタタツの日記


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

としたらうまく行った。なんで?

本日のツッコミ(全1件) [ツッコミを入れる]
かつら (2011 年 5 月 23 日 (月) 14:19)

ちっともツッコミを入れられません^^;


トップ «前の日記(2011 年 5 月 19 日 (木)) 最新 次の日記(2011 年 6 月 1 日 (水))»
Copyright © 2021 KITADAI, Yukinori. All rights reserved.