tl;dr ラッパースクリプト を作った。
辛い点
いろいろ機能を盛り込むと emacs の立ちあげが重くなるので、立ちあげっぱなしにしたくなる。
そうなると、シェルのカレントディレクトリのファイル開くのに emacs にファイルパス入れるの面倒なので、CLI から既に立ち上がっている emacs に開いてほしい。
そこで server-mode
+ emacsclient の出番。しかし、emacsclient は emacs が立ち上がってないと通信先がいないのでファイル開くのに失敗する。
そのために用意された -a
オプションを使ってこう実行すると:
$ emacsclient -a '' somefile
emacs が daemon モードかつ server-mode
実行して立ち上がる。しかし現在のシェルではなく別窓で開いてほしいとか GUI 使いたいとかの場合は -a
ではダメ。また daemon モードで -n
/--no-wait
を開くと大変わかりづらくなる。
EmacsWiki: Emacs Client の Starting Emacs automatically を参考にしても、デスクトップとして使っている時と ssh ログインした時で GUI にしてほしい時と screen で新たに開いてほしい時が違う、リトライ上限は?、既に別 screen で立ち上がってる emacs で開いてしまう、などがありつらい。
問題点をまとめると:
- emacsclient の emacs 自動立ちあげに不満
- daemon モードに若干不満がある
- ある面で便利なのは分かる
- emacswiki に提示されている簡易自動立ちあげスクリプトには問題がある
- 例えば X で emacs が立ち上がっている状態で ssh ログインして emacsclient を使うと ssh のシェルではなく X の方の emacs で開いてしまう
- 要
server-name
の自動割り当て
- 要
- リトライ上限ほしい
-
init.el
失敗すると延々とリトライし続ける
-
- 例えば X で emacs が立ち上がっている状態で ssh ログインして emacsclient を使うと ssh のシェルではなく X の方の emacs で開いてしまう
書いた
問題点というかワガママを通すため && Python の習作を兼ねて emacsclient ラッパースクリプトを書いた:
emacs と emacsclient にパスが通っているのと Mac の GUI で使う場合は open -a Emacs
が実行可能な状態を前提にしている。
基本的には emacsclient と同じ使い方でいいが、以下の違いがある:
- 対象の emacs が立ち上がってない場合は自動で立ちあげてくれる
-
init.el
の設定は不要- むしろしていると、下記の
server-name
自動命名がうまく動かないかも
- むしろしていると、下記の
-
server-name
は、X か Mac か screen かで自動的に命名してくれる。- screen の時はその screen 毎に命名するので、複数 screen 立ちあげていてもそれぞれで emacs が立ち上がる
- 追加機能として
echo foo | emacsclient -
みたいにすると標準入力から受け取った文字列で新たなバッファを作る
使い方
前述したとおり emacsclient と同じだが、具体的にはこういった使い方をしている:
if which emacsclientw &> /dev/null
then
alias e="emacsclientw --no-wait"
export EDITOR=emacsclientw
fi
こうすると:
$ e somefile
# 現在の環境の名前の emacs が立ち上がってないなら、立ちあげてから emacsclient を実行する
# 立ち上がってるならそのまま emacsclient 実行
$ git commit
# emacsclient を使ってコミットメッセージを編集
みたいなことができるようになる。
まとめ
emacsclient を server-name
自動割り当てして自動で立ちあげてくれるラッパースクリプトを作った。
emacswiki の該当ページも半分も読んでないのでもっといい方法ある人教えてください。