【トピック】





<2020/10/27 追記>
次の2つの設定に WSL2 の対策を行いました。

<2020/09/27 追記>
X11 and Wayland Applications in WSL

<2020/09/18 追記>
これは残念です。emacs-helm 開発を停止したとのこと。

<2020/09/16 追記>
次の設定に WSL2 の対策を行いました。

<2020/08/27 追記>
Version 1903/1909 用の更新プログラム KB4566116 には、以下の対策が入っているようです。
Addresses an issue with a sleep system call on Glibc-2.31 or later that’s running on a Windows Subsystem for Linux 1 (WSL 1) distribution. 

<2020/08/25 追記>
WSL2 では、UNC パスをマウントしているマウントポイント配下がカレントディレクトリの状態で Windows の exe コマンドを実行するとエラー終了するようです。次の設定にこの対策を行いました。

<2020/08/25 追記>
10) の設定に含まれるポートフォワーディングするコマンドで、次のとおり localhost を 127.0.0.1 に変更しました。(X サーバソフトによって、localhost ではうまく動作しないためです。変更する前のコマンドでは、VcXsrv は OK ですが、MobaXterm の X は NG でした。IPv6 が絡んで発生している問題と思われます。)
setsid ssh.exe -f -N -R 6020:localhost:6000 $USER@localhost &
 ↓
setsid ssh.exe -f -N -R 6020:127.0.0.1:6000 $USER@localhost &

<2020/08/24 追記>
WSL2 の wslpath は、UNC パスをマウントしている Linux のパスを元の UNC パスに正しく変換してくれません(\\wsl$ で始まるパスに変換されてしまいます)。次の設定にこの対策を行いました。

<2020/08/21 追記>
「WSL 2」が「Windows 10 バージョン 1903/1909」でも利用可能に ~Microsoftが旧OSに移植
Edge Release であれば WSL2 上で docker も使えるようです。

<2020/08/08 追記>
Windows 10 ver 2004 の WSL/WSL2 で Emacs を VcXsrv に接続して使っていると、カーソルの移動が異常に遅くなる場合があります。これは、IME に新しい Micorosoft IME が選択されているときに発生することが分かりました。IME に Google 日本語入力や古い Microsoft IME が選択されているときには発生しません。WSL/WSL2 の Emacs では、mozc_emacs_helper.exe を使って Google 日本語入力と連携して日本語入力を行っているため、なかなか気づきませんでした。
(2020/08/23 追記)この現象は MobaXterm の X サーバでは発生しないようです。MobaXterm の ssh で X11 のトンネリングをすると、<2020/07/12 追記> の問題も解決するので、VcXsrv の代わりに MobaXterm を使うのが良いのかもしれません。

<2020/08/06 追記>
WSL2 から VcXsrv へのアクセスを許可する方法として、vcxsrv.exe の起動時に -ac オプションを付ける(Disable access control とする)方法があります。この方法は、以下のサイトで紹介しているようなセキュリティ的な問題が発生するので、避けることをお勧めします。
アクセスをコントロールする方法は、本サイトでも紹介している以下のようなものがあります。
  • xhost.exe でアクセス許可を行う(説明の 10) に設定例あり)
  • xauth.exe でアクセス許可を行う(説明の 10) に設定例あり)
  • ssh.exe の -Y オプション(ForwardX11Trusted)を使う(-X オプション(ForwardX11)の場合、config に XAuthLocation の設定をしてもうまく機能しませんでした。ネットにも同様の報告があります。)
  • ssh.exe でポートフォワーディングをして使う(以下の <2020/07/12 追記> で紹介している方法です)

<2020/08/02 追記>
<2020/07/12 追記> と <2020/07/14 追記> の設定を本ページの 10) の説明に組み入れました。

<2020/07/14 追記>
次のページを作成しました。この下の追記の設定とセットでご利用ください。

<2020/07/12 追記>
WSL2 の Emacs を Windows の VcXsrv と接続して使っている場合、PC をスリープした後に TCP の接続が正常に復帰しない問題が確認されています。この問題について次の issue が上げられており、その中に WSL -> Windows 方向の接続の場合のみ発生すると書かれています。
The following problem only happens when TCP connections are made from WSL2 to Windows. When connections are made from Windows to WSL2, they are restored after sleep mode as expected.
そうであれば、ssh の -R オプションを使って Windows 側から WSL2 へ ssh のコネクションを張り、WSL2 上に VcXsrv へ接続するポートを開設して接続すればこの問題は発生しないのではないかと考えました。具体的には WSL2 で次のようなコマンドを実行することとなります。
$ ssh.exe -R 6020:127.0.0.1:6000 $USER@localhost
実際には、公開鍵認証方式と Windows の ssh-agent サービスの機能を使ってパスワードやパスフレーズの入力なくコマンドを実行できるようにし(やり方は <2020/07/14 追記> に記載)、次のようなスクリプトを ~/.bash_profile に仕込んでバックグラウンドで自動実行できるようにします。
if uname -v | grep -v -q 'Microsoft'; then
    if ! service ssh status > /dev/null 2>&1; then
        sudo service ssh start
        # sudo でパスワード入力の不要設定をしていない場合は、上記の代わりに次のコマンドを使う
        # wsl.exe -d "$WSL_DISTRO_NAME" -u root service ssh start
    fi

    if ! ss -lt4 | grep -q '127.0.0.1:6020'; then
        setsid ssh.exe -f -N -R 6020:127.0.0.1:6000 $USER@localhost &
        # sshd の接続ポートを 22番以外としている場合は、上記の代わりに次のようなコマンドを使う
        # setsid ssh.exe -p 10022 -f -N -R 6020:127.0.0.1:6000 $USER@localhost &
    fi
fi
これで WSL2 側の TCP 6020 番ポートが、Windows 側の TCP 6000 番ポートに接続されます。WSL2 側の DISPLAY 環境変数は :20 とすることで、6020 番ポートと接続するようになります。
$ export DISPLAY=:20
なお、上記のポートフォワーディングを使う方法以外に、ssh の -Y オプションを使う方法もあります。(-X オプションではうまく動かないようです。)ssh でログインしている間のみ利用可能な方法となりますが、こちらの方法を試してみたい場合には次のページを参考としてみてください。(Windows 側で DISPLAY 変数の設定が必要なことや \dev\tty ファイルの作成が必要なことなど、接続するための幾つかのコツが書かれています。)

<2019/07/16 追記>
ssh-agent-wsl を利用すると、Windows 側の ssh-agent を WSL から利用できるようです。
次の設定を ~/.bash_profile に追加するのが良いと思います。
eval $(<ssh-agent-wsl コマンドを置いた Windows のパス>/ssh-agent-wsl -a ~/.ssh/ssh-agent-wsl.sock -r)
ssh-add で登録した秘密鍵が保持されパスフレーズの入力が不要となるため、次の設定で紹介している wslemacs-start.exe との相性が良くなります。
(2020/07/10 追記)同じ開発者から新しいプロジェクトがリリースされていました。
使ってみましたが、wsl-ssh-agent はまだ WSL2 で利用できないようですので、ssh-aget-wsl を使い続けることにしました。

<2020/05/31 追記>
以下の情報を参考とし、10) の設定に xauth を使った設定方法を追記しました。WSL2 で利用する場合は xhost を使う方法で問題ないと判断し、そちらの設定方法を有効としています。また、DISPLAY 環境変数の設定方法も見直ししています。
(2020/08/02 追記)<2020/07/12 追記>、<2020/07/14 追記> の方法に変更しました。

<2020/05/06 追記>
本設定を WSL2 で動かすために、次の対策を行いました。
  • 10) の説明箇所で、vcxsrv.exe へのアクセスを許可するために、xhost の設定を追加しました。⇒ (2020/05/31 追記)xauth を使う設定方法を追記しました。
  • 10) の説明箇所で、.bashrc 内の DISPLAY 環境変数の設定方法を変更しました。⇒ (2020/05/31 追記)DISPLAY 環境変数の設定方法を見直しました。
  • 21) の説明箇所で、「Windowsパス と UNCパス を使えるようにするための設定(WSL 設定編)」の見直しを行いました。
  • 22) の説明箇所で、「WSL の emacsclient を Windows から利用するための設定」の見直しを行いました。⇒ (2020/05/31 追記)emacsclientw.exe 内の DISPLAY を指定するパラメータの設定方法を見直しました。

<2020/05/05 追記>
現在、WSL 用に Ubuntu-20.04 がリリースされていますが、これはまだ WSL1 にはインストールしない方が良いようです。WSL2 であれば問題ないと思います。

<2020/05/05 から追記>
Windows 10 Release Preview リングを使い、Windows 10 May 2020 Update のテストを開始しました。以下には、その際に気づいたことを列挙していきます。
  • 既存の WSL1 の Linux ディストリビューションを WSL2 に変換する際、Linux のカーネルを更新するように促されました。( https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
  • 既存の WSL1 の Linux ディストリビューションを WSL2 に変換する際、パソコンの BIOS の機能で仮想化機能を有効にするように促されました。(使っている PC は Windows 10 Home Edition であり、仮想化の機能を使うのは初めての PC となります。)
  • 既存の WSL1 の Linux ディストリビューションを WSL2 に変換してみました。(> wsl --set-version Ubuntu-20.04 2) ※ 上記の追記に記載したとおり、WSL1 に Ubuntu-20.04 のインストールはしない方が良いようです。すでにインストールしていたので、変換しました。
  • 新しいディストリビューションの既定のインストール バージョンを WSL1 から WSL2 にしてみました。(> wsl --set-default-version 2)Linux ディストリビューションを WSL2 に新規にインストールしたい場合には、この設定を行う必要があるようです。
  • Ubuntu-20.04 でインストールされる emacs は、26.3 でした。
  • ホームディレクトリの移行は、一つ下の追記で記載している方法で問題なく対応できました。
  • 移行した WSL2 の Linux ディストリビューションを既定のディストリビューションにしました。(> wsl -s Ubuntu-20.04)
  • WSL2 の Emacs から VcXsrv を使うには、DISPLAY 環境変数の変更と vcxsrv.exe コマンド起動時に -ac オプションの追加が必要でした。( https://qiita.com/ryoi084/items/0dff11134592d0bb895c
 ⇒(2020/08/02 追記)ポートフォワーディングの方法に見直ししたため、アクセス許可が不要となりました。
  • VcXsrv へアクセスするための IPアドレスに変更が入ったので、「WSL の emacsclient を Windows から利用するための設定」の見直しが必要でした。
  • mount の出力様式が変わったので、「Windowsパス と UNCパス を使えるようにするための設定(WSL 設定編)」の見直しが必要でした。
  • mount の type に drvfs が使えなくなると思っていましたが、WSL1 の時と同様に使えました。(/sbin/mount.drvfs があり、/init にシンボリックリンクされています。)ファイル共有サーバもマウントできました。
  • WSL2 で Emacs を起動していると、PC をスリープして復活した後などに Emacs が利用できなくなっている(emacs deamon が反応しない? or 落ちてる?)場合があります。同様の問題を Twitter でつぶやいている方も居るようです。
 ⇒(2020/08/17 追記)回避策を見つけました。<2020/07/12 追記>、<2020/07/14 追記> を参照ください。
  • WSL2 で Emacs on VcXsrv を動かした場合、カーソルの動きが異様に遅くなる場合が報告されているようです。私のところでも発生しましたが、症状が発生する時と発生しない時があります。
 ⇒(2020/08/17 追記)原因が分かりました。<2020/08/08 追記> を参照ください。

<2020/04/28 追記>
新しい Linux ディストリビューションへのホームディレクトリの移行には、以下のバッチファイルをお試しください。バッチファイルですので、コマンドプロンプトからの起動となります。(変数の設定値は適宜変更してご利用ください。)
set home_dir=user
set src_distro=Ubuntu-18.04
set dst_distro=Ubuntu-20.04

wsl -d %dst_distro% -u root bash -c "mv /home/%home_dir% /home/%home_dir%.orig"
wsl -d %src_distro% -u root bash -c "(cd /home; tar cvf - %home_dir%)" | wsl -d %dst_distro% -u root bash -c "(cd /home; tar xvf -)"

<2020/03/13 追記>
21) で紹介している次の設定に Windows 10 1903 頃から発生するようになった不具合の対策方法について追記しました。

<2019/04/22 追記>
WSL から Windows の exe コマンドを管理者権限で実行するコマンド winsudo を公開しました。お試しください。
なお、このコマンドを利用する際は、【お知らせ】<2019/03/04 追記> に記載した「exec > /dev/tty」の設定を解除する必要があります。解除時に利用できる exe コマンドを実行するためのコマンド win も併せて公開していますので、お試しください。

<2019/04/19 追記>
WSL で Emacs を使っている理由の大きな一つに、次の設定をすることにより Emacs の Dired で Windows ショートカットのハンドリングができることがあります。Windows ショートカットは Windows のデスクトップ環境で頻繁に使われており、ファイルシステムに依存していない一般ファイルであることから可搬性も高く(どこにでも移動や複写ができる)、Emacs の Dired で使えると非常に便利です。是非お試しください。
ディレクトリの Windows ショートカットがある場合、shell の cd コマンドでその Windows ショートカットを辿ることはできません。そのために、次の設定と組み合わせた利用をお勧めします。この設定は tramp の接続先でも動作します。
以上の設定は、すべて本ページで紹介しているものとなります。

【お知らせ】


<2019/11/13 追記>
Windows 10 1903 以降で動作する説明に見直しました。(古いバージョンで必要となっていた説明を削除しました。)

<2019/09/20 追記>
Xサーバを利用する際に「全角/半角」キーリピート問題が発生する場合には、次のページを参考に対応してください。(私は US キーボードを使っているため、この問題には遭遇していません。)

<2019/08/09 追記>
13) に「<フレームの高さを補正する設定>」の説明を追加しました。WSL Emacs on VcXsrv でフレームを開く際、高さが低く作成される状況が改善されます。

<2019/07/26 追記>
Windows 10 1903 にバージョンアップしたところ、次の問題が発生しています。
  • DrvFs のフォルダに WSL から利用する exe コマンドを格納し、そのフォルダのシンボリックリンクを WSl の PATH に登録している場合、PATH を検索した exe コマンドの実行ができない。
似たような問題として次の issue が登録されています。
新しいビルドでは直っているようですが、Windows 10 1903 を利用している場合は、DrvFs のフォルダへの実際のパス(シンボリックリンクではないパス)を PATH に登録するようにしてください。

<2019/05/17 追記>
Ubuntu-18.04 on WSL にインストールした Emacs(ver 26.2)で、https 通信ができない問題が発生しています。当方の環境では、eww での https サイトとの通信や melpa 等の package サイトとの https 通信が出来ません。proxy サーバを介すことで回避できることが分かりましたので、proxy を使っていない環境(自宅など)では WSL に squid をインストールすることで対処しています。この件について問題の対策方法等の情報があれば、管理者宛の問い合わせフォームで教えていただければと思います。
(2019/07/16 追記)次のページに Emacs on Windows で発生する関連した情報があるとの連絡をいただきました。
Note: There are some problems using the https location with Emacs on Windows. There is currently no known easy fix for this. You can still use MELPA by using the non-SSL location by replacing https with http. 

<2019/03/04 追記>
Windows 10 1809 にアップデートしたところ、Emacs の shell-mode で exe コマンドを実行できなくなりました。(実行すると、プロンプトが帰ってこなくなります。)次のページで同様の問題が報告されています。
回避策として、以下の方法があるようです。
  • ipconfig.exe | cat のように、パイプで cat につなげる
  • ipconfig.exe > /dev/tty のように、/dev/tty にリダイレクトする
  • 次の設定をする。(.bashrc に設定することで shell 起動時に有効にできます。ただし、【トピック】<2019/04/22 追記> に記載したとおり、不都合が発生するコマンドもありますので、ご留意ください。)
$ exec > /dev/tty

<2019/03/13 追記>
本設定で利用している Xサーバ VcXsrv について、次のページに不具合情報が報告されています。コピペ時の「」の欠落などは注意が必要と思いました。内容を確認してみてください。

<2018/06/20 追記>
Emacs-26系で popwin を有効にしていると、dired-find-file や find-file で開いたファイルやディレクトリが other-window で開く現象が発生するようです。私は popwin を使わないことで解決としました。
(2019/08/18 追記)次のページに関連する情報がありました。

【本題】


Windows Subsystem for Linux で Emacs を使うための設定です。

※ 以下では、WSL で Emacs を使うために推奨される設定のみを紹介しています。Emacs を使うための基本的な設定は別途必要です。

  • mozc_emacs_helper.exe で Windows 側の Google 日本語入力と連携可能。ユーザ辞書も一元管理!
  • tramp で Linux サーバや Docker とも連携可能。VcXsrv を使っているので、X クライアントソフトも起動できる!
  • eww でブラウザとしても利用可能。英語ページは google-translate で瞬時に翻訳!
  • twitter も利用可能。アイコンも表示できるので、投稿者の識別が容易!

1) Windows 10 1903 以降をインストールする。

また、アクティブウインドウのタイトルバーの色を変更するための次の設定を有効にする。(オプション)
※ 設定すると、マルチディスプレイ使用時にアクティブウインドウの確認がし易くなります。

2) 次のサイトから X Window サーバソフトの VcXsrv をダウンロードし、インストールする。
※ Emacs-26系で発生するダブルバッファの問題を回避するため、1.20.1.2 以降をインストールしてください。

3) Windows Subsystem for Linux を有効にし、ストアから Ubuntu 18.04 LTS をインストールした後、コンソールを起動する。(WSL2 の場合、Ubuntu-20.04 のインストールも可能です。)

4) WSL に複数の Linux のディストリビューションをインストールしている場合は、コマンドプロンプトで次のコマンドを実行し、Ubuntu-18.04 ディストリビューションをデフォルトにしておく。(Windows 側から、bash.exe や wsl.exe を実行した際に使われる WSL ディストリビューションとなる。)
> wslconfig /l
> wslconfig /s Ubuntu-18.04
最近は、同じことが wsl コマンドでも行えます。
> wsl -l
> wsl -s Ubuntu-18.04

5) インターネットにプロキシを介して接続している場合は、.bashrc に http_proxy 等の環境変数を設定し、コンソールを再起動する。

6) 必要であれば sudo をパスワード無しで利用できるように設定する。

次のコマンドを実行し、
$ sudo -s
# EDITOR=vi visudo
最終行に次の行を追加する。(<username> の部分は WSL の利用ユーザに変更する。)
<username>	ALL=(root) NOPASSWD: ALL
※ wsl のユーザは sudo グループに所属しているため、%sudo の行以降に設定を追加する必要があるようです。
※ /etc/sudoers.d ディレクトリ配下にファイルを置く方法もあります。この方法を採る場合は、sudo -s で root になってから作業を行うと、visudo -c でエラーが発生した場合に対処できると思います。

7) Ubuntu のアップデートおよび設定を行う。
$ sudo -E apt update
$ sudo -E apt upgrade
※ プロキシが必要な環境下では、apt や add-apt-repository 実行時の sudo に -E オプションを付けて http* 環境変数を引き継ぐようにしてください。
また、locale を変更する。
$ sudo -E apt install language-pack-ja language-pack-gnome-ja
$ sudo update-locale LANG=ja_JP.UTF-8
必要であれば、日本語マニュアルをインストールする。
$ sudo -E apt install manpages-ja manpages-ja-dev
さらに、タイムゾーンを JST にする。
$ sudo dpkg-reconfigure tzdata

8) Emacs 等をインストールする。
$ sudo -E add-apt-repository ppa:kelleyk/emacs
$ sudo -E apt update
$ sudo -E apt install emacs26 emacs26-el
$ sudo -E apt install cmigemo
※ Emacs-25系がインストールされている場合、emacs25-common と emacs26-common がコンフリクトするため emacs25-common を予め削除しておいてください。
※ Ubuntu-20.04 では、標準で(ppa:kelleyk/emacs を利用しなくても)emacs-26.3 がインストールされます。
$ sudo -E apt install emacs emacs-el
$ sudo -E apt install cmigemo

9) Emacs 起動時のエラーを少なくするために次のコマンドを実行する。
Emacs-26系では、この設定は不要と思われます。もし、gconf2 のエラーや machine-id ファイルが無いというエラーが出る場合には設定してみてください。
$ sudo -E apt install gconf2
$ sudo dbus-uuidgen --ensure

10) ログイン時の設定を行う。

WSL2 を使う場合、<2020/07/12 追記> に記載した PC を休止した際に発生すると思われる問題が発生する。この対策が必要な場合、ssh のポートフォワーディングを利用可能とするために次の設定を行う。

そして、~/.bash_profile に次の設定を行う。(上記の ssh ポートフォワーディングの対策を利用するかどうかで、コメント箇所の見直しが必要)
if which tasklist.exe > /dev/null && ! tasklist.exe | grep -F -q 'vcxsrv.exe'; then
    (
        cd '/mnt/c/Program Files/VcXsrv'
        ./vcxsrv.exe :0 -multiwindow -clipboard -noprimary -wgl > /dev/null 2>&1 &

        # WSL2 で ssh によるポートフォワーディングの設定を行わない場合は、次の if ブロックを"有効"にする

        # if uname -v | grep -v -q 'Microsoft'; then
        #     # When using xhost
        #     export DISPLAY=127.0.0.1:0.0
        #     WSLENV=DISPLAY ./xhost.exe + $(ip -4 a show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

        #     # # When using xauth
        #     # display=$(ip route | awk '/^default/ {print $3; exit}'):0.0
        #     # ./xauth.exe generate $display . trusted timeout 0 # trusted にしないと clipboad 連携が機能しない
        #     # ./xauth.exe extract - $display | xauth merge -
        # fi
    )
fi

# WSL2 で ssh によるポートフォワーディングの設定を行わない場合は、次の if ブロックを"無効"にする

if uname -v | grep -v -q 'Microsoft'; then
    if ! service ssh status > /dev/null 2>&1; then
        sudo service ssh start
        # sudo でパスワード入力の不要設定をしていない場合は、上記の代わりに次のコマンドを使う
        # wsl.exe -d "$WSL_DISTRO_NAME" -u root service ssh start
    fi

    if ! ss -lt4 | grep -q '127.0.0.1:6020'; then
        setsid ssh.exe -f -N -R 6020:127.0.0.1:6000 $USER@localhost &
        # sshd の接続ポートを 22番以外としている場合は、上記の代わりに次のようなコマンドを使う
        # setsid ssh.exe -p 10022 -f -N -R 6020:127.0.0.1:6000 $USER@localhost &
    fi
fi

[ -r ~/.bashrc ] && source ~/.bashrc
※ VcXsrv の設定しているオプションの意味は次のページを参照してください。
※ 高DPI環境をご利用の場合は、その対応方法の情報が次のページにあります。
また、~/.bashrc に次の設定を追加する。
if [ "$INSIDE_EMACS" ]; then
    TERM=eterm-color
fi

umask 022

if [ -z "$DISPLAY" ]; then
    if uname -v | grep -q 'Microsoft'; then
        export DISPLAY=:0
    else
        if ss -lt4 | grep -q '127.0.0.1:6020'; then
            export DISPLAY=:20
        else
            # export DISPLAY=$(awk '/^nameserver/ {print $2; exit}' /etc/resolv.conf):0.0
            export DISPLAY=$(ip route | awk '/^default/ {print $3; exit}'):0.0
        fi
    fi
fi

# export NO_AT_BRIDGE=1
export LIBGL_ALWAYS_INDIRECT=1
# export GIGACAGE_ENABLED=no
※ 環境変数の設定は、次のとおりのエラー/ワーニングの発生状況に応じ、適宜設定を変更してください。
  • NO_AT_BRIDGE は、Emacs の起動時に「WARNING **: Couldn't connect to accessibility bus: ...」というワーニングが出力される場合に設定する
  • LIBGL_ALWAYS_INDIRECT は、Emacs の起動時に「libGL error: No matching fbConfigs or visuals found / libGL error: failed to load driver: swrast」というエラーが出力される場合に設定する
  • GIGACAGE_ENABLED は、Emacs の起動時に gigacage に関するエラーが発生する場合に設定する
※ Ubuntu が提供する .bashrc は、最初に次の設定があり、bash がインターラクティブモードで起動したとき以外は以降が実行されないようになっています。.bashrc に設定を追記する場合は、追記する場所にご留意ください。
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

11) 次のサイトから Migu 1M フォントをダウンロードして、ttf ファイルを ~/.local/share/fonts ディレクトリ配下にコピーする。(fonts ディレクトリ配下に、サブディレクトリを作って置いても大丈夫です。)
※ 生成が必要ですが Ricty 系もお勧めです。

本設定では使いませんが、Windows のフォントも WSL で使いたければ次のコマンドを実行する。
$ ln -s /mnt/c/Windows/Fonts ~/.local/share/fonts/windows
最後に次のコマンドを実行する。
$ fc-cache -fv

12) ~/.emacs.d/init.el 等に次のとおりのフォントの設定を行う。
;; デフォルト フォント
(set-face-attribute 'default nil :family "Migu 1M" :height 120)
;; プロポーショナル フォント
(set-face-attribute 'variable-pitch nil :family "Migu 1M" :height 120)
;; 等幅フォント
(set-face-attribute 'fixed-pitch nil :family "Migu 1M" :height 120)
;; ツールチップ表示フォント
(set-face-attribute 'tooltip nil :family "Migu 1M" :height 90)
※ この設定は gnupack の init.el にある設定を転記したものです。

13) さらに ~/.emacs.d/init.el 等に次の設定を行う。

<色の設定>
;; 色を設定する
(add-to-list 'default-frame-alist '(foreground-color . "white"))
(add-to-list 'default-frame-alist '(background-color . "black"))

<フレームの高さを補正する設定>
(defun reset-frame-parameter (frame)
  (sleep-for 0.1)
  (set-frame-parameter frame 'height 32))

(add-hook 'after-make-frame-functions #'reset-frame-parameter)

<coding-system の設定>
(prefer-coding-system 'utf-8-unix)

;; プロセスが出力する文字コードを判定して、process-coding-system の DECODING の設定値を決定する
(setq default-process-coding-system '(undecided-dos . utf-8-unix))
※ 設定値の car を "undecided-dos" にしておくと、Windows コマンドの出力にも柔軟に対応できます。関連して 29) の説明も参照してください。

<shell の設定>
(setq shell-file-name "/bin/bash")
(setq shell-command-switch "-c")
(setq explicit-shell-file-name shell-file-name)

<migemo の設定>
(setq migemo-command "cmigemo")
(setq migemo-options '("-q" "--emacs"))
(setq migemo-dictionary "/usr/share/cmigemo/utf-8/migemo-dict")
(setq migemo-user-dictionary nil)
(setq migemo-regex-dictionary nil)
(setq migemo-coding-system 'utf-8-unix)
(load-library "migemo")
(migemo-init)

14) WSL のコンソールを再起動してから Emacs を起動し、X Window サーバ上に表示することを確認する。

15) 次を参考に emacs-mozc の設定を行う。



※ 以降はオプションです。

20) さらに次の設定を行う。これで、いろいろな操作が helm を通してできるようになる。

21) さらに次の設定を行う。これで、find-file コマンドなどで Windows パスや UNC パスを直接利用可能となる。
※ この設定は、以降の 22) と 23) を使うために必要となります。

22) さらに次の設定を行う。これで、Windows 側から emacsclient が利用可能となる。

23) さらに次の設定を行う。これで、dired で Windows ショートカットがシンボリックリンクのように利用可能となる。

24) さらに次の設定を行う。これで、dired で ディレクトリのシンボリックリンクを実体のパスで開くことができるようになる。
※ (setq-default find-file-visit-truename t) の設定を行っていない場合に意味のある設定となります。

25) さらに次の設定を行う。これで、dired で DrvFs ファイルシステム上に NTFS シンボリックリンクを作成できるようになる。また、Windows ショートカットも作成可能となる。
※ Windows ショートカットはファイルシステムに依存していないリンクファイルですので、ハンドリングが容易です。VolFs の他、tramp の接続先にも複写することができます。私は、DrvFs 上に置くリンクはできるだけショートカットを利用するようにしており、23) の設定をすることで dired から利用しています。

26) さらに次の設定を行う。これで、dired が Windows のファイラーのように利用できるようになる。
※ こちらの設定もお勧めです。
※ 次の設定も行うと、Emacs で表示している URL を Windows のブラウザで開くことができます。
(require 'browse-url)

(setq browse-url-browser-function 'browse-url-generic)
(setq browse-url-generic-program "wslstart"))

(global-set-key (kbd "C-c u") 'browse-url-at-point)

27) さらに次の設定を行う。これで、tramp の高速化が図られ、接続先の shell から Xクライアントが起動できるようになる。上記の「dired を OS と連携して使うための設定」と組み合わせると、xdg-open などを使ってリモートにあるドキュメント等が開けるようになる。(このページの最初の方にある画像の二番目のものは、この機能を使って表示したものです。)

28) さらに次の設定を行う。これで、tramp 接続環境でも動作する shell-pop のような環境を利用できるようになる。

29) さらに次の設定を行う。これで、shell-mode で Windows のコマンドを発行しても、漢字が文字化けしなくなる。

30) さらに次の設定を行う。これで Emacs のバッファの内容を Windows のテキストエディタを通して印刷できるようになる。

31) さらに次の設定を行う。これで Emacs から VSCode でファイルを開けるようになる。

32) さらに次の設定を行う。これで VSCode で開いているファイルを Emacs で開けるようになる。

33) さらに次の「Emacs 全般で利用できる設定」や「説明ページを作るまでもない設定の紹介」の箇所にあるものから必要なものがあれば設定を行う。
お勧めの設定は以下の辺りとなります。

  • 沢山開いているバッファをできるだけ一度に閉じるための設定
(global-set-key (kbd "M-c") (lambda ()
                              (interactive)
                              (desktop-clear)
                              (tramp-cleanup-all-connections)))
  • カレントバッファを一発で閉じるための設定
(global-set-key (kbd "M-k") (lambda ()
                              (interactive)
                              (kill-buffer (buffer-name))))
  • ウィンドウの右端で改行をするかどうかを切り替えるための設定
(global-set-key (kbd "C-c C-<return>") 'toggle-truncate-lines)
  • 横スクロールするための設定(キー設定が逆の感覚の方もいるかも)
(global-set-key (kbd "C-,") 'scroll-left)  ; < のキー
(global-set-key (kbd "C-.") 'scroll-right) ; > のキー
  • C-h を Backspace として使うための設定
(define-key key-translation-map (kbd "C-h") (kbd "<DEL>"))
help の機能は、f1 キーで利用することができます。

34) 最後に次の設定を行う。これで Windows 全体を Emacsキーバインドで操作できるようになる。


<変更履歴>
  • 2017/05/23 このページを作成した。
  • 2017/06/12 Emacs 起動時のエラーを抑制するため、LIBGL_ALWAYS_INDIRECT 環境変数の設定を追加した。
  • 2017/07/04 色の設定を追加した。
  • 2017/08/21 locale の設定を追加しました。
  • 2017/08/21 Emacs-25 のインストールする方法を追記した。
  • 2017/09/04 「w32-symlinks を dired と連携して使うための設定」を見直しバージョン「Windows ショートカットを dired と連携して使うための設定」のリンクに置き換えた。
  • 2017/11/01 オプションの設定に「 WSL で NTFS シンボリックリンクを作成するための設定」を追加した。
  • 2017/11/04 パスの途中に NTFS シンボリックリンクを含むファイルを削除しようとするとフリーズする問題の対策を追加した。
  • 2017/11/06 Emacs を起動するスクリプトを追加し、VcXsrv が起動していない場合は事前に起動するように対応した。
  • 2017/11/11 emacsclient を使うための説明を追記した。
  • 2018/03/09 21) の設定を全面的に見直し、UNCパスの利用にも対応した。
  • 2018/03/14 25) の設定を見直し、Windows ショートカットの作成にも対応した。
  • 2018/03/15 29) に設定を新たに追加した。
  • 2018/03/16 22) の説明の内容を整理した。
  • 2018/03/20 30) の設定を wslstart を使った方法に見直した。
  • 2018/03/21 26) の設定に browse-url を使うための設定を追記した。
  • 2018/03/22 VcXsrv 上に立ち上げた Emacs でリージョンの選択をすると、選択しただけでリージョンの内容が Windows のクリップボードに登録される症状が発生していたのを対策した。
  • 2018/03/22 21) の設定で、コンピュータ名が IPアドレスの UNC パスを mount した際でも正常に動作するように対応した。
  • 2018/03/23 wsl コマンドを使っている設定について、高速化対策を行った。
  • 2018/04/11 10) に日本語キーボードを使う場合に必要そうな設定とそのコメントを追記した。
  • 2018/04/12 33) にお勧めの設定のリンクを追加した。
  • 2018/05/11 8) に tramp 利用時の不具合についての対応策について追記した。
  • 2018/05/11 7) にタイムゾーンを JST にする説明を追加した。
  • 2018/06/19 8) に Emacs-26系で動作させるための説明を追記した。
  • 2018/06/26 11) のフォントを置くディレクトリを、~/.fonts ディレクトリから ~/.local/share/fonts ディレクトリに変更した。
  • 2018/07/30 13) に最低限必要な coding-system の設定を追記した。
  • 2018/08/19 13) に cmigemo の設定を追記した。
  • 2018/11/11 6) に sudo をパスワード無しで利用するための設定の説明を追加した。
  • 2018/11/21 1) にアクティブウインドウのタイトルバーの色を変更するための設定の説明を追加しました。
  • 2019/08/09 13) に「<フレームの高さを補正する設定>」の説明を追加した。


最終更新:2020年10月27日 13:42