■ Windows Subsystem for Linux の emacs で利用できる設定


【お知らせ】


<2019/07/16 追記>
wslemacs-start.exe を使うためには、WSLコンソール起動時にインタラクティブな操作が発生しないようにする必要があります。インタラクティブな操作が発生する一つのパターンとして keychain や ssh-add 実行時のパスフレーズの入力があるのですが、これは以下で紹介されている ssh-agent-wsl を利用することで回避できる(OS を再起動しても ssh-add で登録した秘密鍵が保持され、パスフレーズの入力が不要となる)ことが分かりました。お試しください。

<2019/07/16 追記>
emacs をデーモンモードで起動した際、起動した bash のコンソールを維持した場合と終了した場合とで、以下の実行結果が異なることが分かりました。
 (shell-command-to-string "cmd.exe /c echo 'あああ' | nkf -g")
この結果から、emacs を起動した bash を終了すると emacs から exe コマンドを利用する際に不都合が発生することが分かりましたので、wslemacs-start.exe で起動する emacs のオプションを --daemon から --fg-daemon に変更しました。
この対策をした結果の副産物として、タスクトレイに wslemacs-start.exe の emacs アイコンが表示されるようになり、emacs デーモンが起動している状態を確認できるようになりました。

<2019/07/14 追記>
以下の機能の不具合対策を行いました。

<2019/07/14 追記>
デーモンモードで起動した emacs とでも連携して利用できるように見直しました。

【本題】


Windows Subsystem for Linux の emacslient を Windows から利用するための設定です。

1) 以下を参考とし、emacs が VcXsrv を使って起動できるように設定を行う。
上記の 10) の設定(~/.bash_profile から VcXsrv を起動する)は行ってください。以降で説明する wslemacs-start.exe を使う場合に必要な設定となります。

また、21) で紹介している以下の設定は本設定を使う上での 前提条件 となりますので、必ず設定してください。
この設定をすることで、emacs で指定するパスに Windows パスや UNC パスを指定できるようになり、以降で説明する wslclient.exe が利用可能となります。

2) emacs で emacs-server の立上げを行う。これで、WSL 側で emacsclient が利用可能となる。
(require 'server)

(unless (server-running-p)
  (server-start))
※ EDITOR 環境変数の設定をすることにより、git などとも連携が可能となります。
export EDITOR=emacsclient

3) DrvFs ファイルシステム上のフォルダに wslemacs-start.exe、wslemacs-stop.exe、wslclient.exe を配置する。

4) emacs をデーモンモードで起動する。

WSL コンソール起動時(bash 起動時)にインタラクティブな応答(例えば、 keychain や ssh-add 実行時のパスフレーズの入力など)が 無い 使い方をしている場合には、wslemacs-start.exe を実行することで emacs を起動することができます。Windows の Startup フォルダに wslemacs-start.exe そのものかショートカットを置くことで、ログイン時に自動起動させることもできます。wslemacs-start.exe を終了するには、wslemacs-stop.exe が利用できます。
WSL コンソール起動時にインタラクティブな応答がある場合は、WSL コンソールを起動してから emacs --daemon で emacs を起動してください。
emacs を常時立ち上げて利用されている方は、デーモンモードでなく emacs を直接立ち上げることでも構いません。

<2019/07/16 追記> に書きましたが、ssh-agent-wsl を使うと ssh-add で登録した秘密鍵が維持され、パスフレーズの入力を不要とすることができるようです。

5) 以下の方法で wslclient.exe のショートカットを SendTo フォルダに作成する。
これで explorer の右ボタンメニューの「送る」機能で、ファイルやフォルダを wslclient.exe に送る(で開く)ことができるようになります。
wslclient.exe をアプリと結びつけることで、ファイルのダブルクリックによる起動も可能となります。
wslclient.exe は直接ダブルクリックで emacs を開くようにもなっていますので、スタートメニューにピン留めしておくと便利です。

6) Keyhac で以下のような設定を行う(オプション)。

この設定により、クリップボードにコピーした Windows パスや UNC パスをワンキーで emacs で開けるようになります。

※ 「<Windows パス>」の部分は書き換えてお使いください。
※ 「Windows の操作を emacs のキーバインドで行うための設定 (Keyhac版)」に取り込んで使うことお勧めします。
# -*- mode: python; coding: utf-8-with-signature-dos -*-
# http://qiita.com/hshimo/items/2f3f7e070ae75243eb8b

from keyhac import *

def configure(keymap):

    keymap_global = keymap.defineWindowKeymap()

    # emacsclient プログラムを起動するキーを指定する
    emacsclient_key = "C-Period"

    # emacsclient プログラムを指定する
    emacsclient_name = r"<Windows パス>\wslclient.exe"

    # emacsclient プログラムの起動
    def emacsclient():
        clipboard_text = getClipboardText()
        if clipboard_text:
            # 引数となるパスに空白が含まれている場合でも上手く動くように、最初にだけ
            # ダブルコーテーションを一つ入れている
            keymap.ShellExecuteCommand(None, emacsclient_name,
                                       '"' + re.sub("\n|\r", "", clipboard_text.strip()), "")()

    # define_key(keymap_global, emacsclient_key, emacsclient) # fakeymacs に取り込む場合
    keymap_global[emacsclient_key] = emacsclient


<変更履歴>
  • 2018/03/16 このページを作成した。
  • 2018/12/06 clipboard_text からパスを抽出する際、キャリッジリターン(\r)も除去するように対応した。
  • 2019/07/14 デーモンモードで起動した emacs とでも連携して利用できるように見直した。
  • 2019/07/16 wslemacs-start.exe で起動する emacs のオプションを --daemon から --fg-daemon に変更した。