WSLでemacsclientをGUIで使えるようにする(その1)


前回(といっても2年以上前)で、WSL上のEmacs環境は構築できたんですが、その後いろいろと変えたところもあるので、そこら辺をまとめてみます。

やりたいこと

Emacsをサーバーで動かして、emacsclientをGUIで起動できるようにする。

Emacsのインストール

まずは環境構築ということで、Emacsのインストールから。

以前は野良ビルドしてました。この理由は、UbuntuのパッケージのEmacsは基本GTK3をリンクしていると、私の環境ではウィンドウがちゃんと開かないため、GTK2でリンクしたものを作りたいというものでした。

ということで今も野良ビルドしてます。最近は、何も考えずに

$ ./confiugre
$ make
$ sudo make install

で普通に動いてます。ちなみに、X ServerをVcsrvからX410というストアアプリへ変更したらGTK3でも問題なくなったのでconfigureにはオプション付けてません。なぜなのかは理由は知りませんが、困っている場合には試す価値はあるんじゃないですかね。今だと4,700円引きですし(笑)。

Emacsをサーバーにする

やり方はこちらを参照。

半分ぐらいはお好みなんでしょうが、個人的にはバックグラウンドで動かすということで、ひとまず.bashrcに以下の記述を入れてみました。

.bashrc
# emacs daemon
function emacsdaemon() {
        isAlive2=`ps -ef | grep "emacs --daemon" | grep -v grep | grep -v srvchk | wc -l`
                if [ $isAlive2 = 0 ]; then
                cd > /dev/null 2>&1
                rm -f ~/tmp/emacs/*
                emacs --daemon > /dev/null 2>&1
                fi
        }
emacsdaemon

alias emacstty='emacsclient -t'
alias emacsgui='emacsclient -c'
alias emacskill="emacsclient -e '(kill-emacs)'"
alias emacsrestart="emacsclient -e '(kill-emacs)' && emacsdaemon"

なんかややこしいことをしてますが、ターミナル(wslttyを使ってます)を起動したときに自動的に起動するような形をとるために、psで起動チェックした上でサーバーを起動するということをやってます。あとは、server socketがゾンビ化してしまうことがままあるようなので、起動時に消しておくということもやってます。

目的達成したけど…。

これでターミナル上からemacsclientを起動するのは問題なく動きます。emacs側の設定はソケットファイルの指定しておくとよい感じです。

init.el
(setq server-socket-dir "~/tmp/emacs")

ただ問題というか願望がいくつかありまして…

  1. ターミナルを起動しないとサーバーが起動しない
  2. Windowsのデスクトップから起動したい
  3. GUIで起動した場合のフォントセットやフレームのサイズが反映されない

ということで、この辺の対策を考えてみます。

Windows起動時にサーバーを起動させる

これはまあバッチファイルですわね。

emacsdaemon.bat
@echo off
bash.exe -c "/usr/local/bin/emacs --daemon"

これをスタートアップに入れとけば良し。起動時にウィンドウが開くのがいやならショートカットのプロパティを最小化で起動するようにしておけばいいですね。まあ初回だけなので私はウィンドウを開いてますが。

Windowsのデスクトップから起動する

これもバッチファイルなんですが、コマンドプロンプトのウィンドウが開かないようにするために一工夫が必要。この辺りを参考に以下のようなファイルを作成します。

emacs.vbs
Set ws = CreateObject("Wscript.Shell")
ws.run "powershell -NoProfile -ExecutionPolicy Unrestricted .\launch.ps1",0,false
launch.ps1
bash.exe -lc "exec emacsclient -c -s ~/tmp/emacs/server --display=localhost:0.0"

emacs.vbsのショートカットをデスクトップに作成して、アイコンをEmacsにすればサーバーさえ起動していれば一瞬でフレームが開くようになりました。

あとはフレームとフォントセットですが、長くなったので次回へ。