【トピック】



【お知らせ】


<2022/10/14 追記>
本ページの設定を多少変更すると WSLg で動かすこともできます。WSLg ではキーボードの設定がうまく行われない場合があるようですので、その場合は以下のどちらかの行の設定を行ってください。
setxkbmap -layout us
setxkbmap -layout jp

<2022/10/14 追記>
X11 サーバを GWSL とするように、全体的な見直しを行いました。

<2022/04/19 追記>
2021年の補完UI事情とEmacs28に標準添付されるfido-vertical-modeについて

<2022/01/04 追記>
興味深いコマンドを2つ紹介します。

<2021/12/10 追記>
<2019/04/22 追記> で winsudo というコマンドを紹介しておりますが、gsudo というコマンドがあるようです。まだ使ってみてはおりませんが、紹介します。

<2021/09/17 追記>
WSL2 で WSLg と GWSL を利用する場合の比較をしてみました。GWSL は VcXsrv を利用しているので、GWSL に記載してある内容は VcXsrv を利用する場合にも当てはまります。
<GWSL>
・新しい Microsoft IME を選択しているとカーソルのレスポンスが悪くなる(古いMicrosoft IME や Google日本語入力ではこの問題は発生しません)
・Emacs 起動時にウインドウが小さく表示される問題が発生する( 13) に回避対策の記載があります)
・DISPLAY 環境変数を独自に設定する必要がある( :0 では動きません)

<WSLg>
・カーソルが遅くなる問題が発生しない
・Emacs 起動時にウインドウが小さく表示される問題が発生しない
・DISPLAY 環境変数が :0 で動作する
・Windows 10 では動作しない
 ⇒ (2022/11/18 追記)Windows 10 21H1 以降では、パッチ KB5020030 をインストールし、Microsoft Store版 WSLv1.0.0 をインストールすると動作するようです。
・Emacs を最大化しても完全な最大化とならない(下部の最大化がならない部分から背景が見えてしまいます)
 ⇒ (2022/11/18 追記)Microsoft Store版 WSLv1.0.0 では改善していることを確認しました。
・ウインドウ枠が独自のため、アクティブなウインドウの状況が分かりづらい(Windows でアクティブウインドウのタイトルバーの色を変える設定にしていても、WSLg のウインドウは対象になりません)
・Windows のウィンドウの操作作法が利用できない(画面の上画面外へのドラックで画面の最大化がされるなどの操作が使えません)
現時点では、後半の2つの問題を許容できないことから、GWSL を選択して利用しています。

<2021/08/09 追記>
X Window のキーリピートの速度を変更するには、以下のようなコマンドで対応できます。なお、<2020/08/08 追記> に記載しているとおり、VcXsrv は 新しい Microsoft IME と相性が良くありません。VcXsrv を利用する場合は、IME に Google 日本語入力や古い Microsoft IME を選択するようにしてください。
$ xset r rate 400 40

<2021/06/25 追記>
Emacs の設定は、leaf.el を使うのが人気のようです。お試しください。

<2021/06/17 追記>
本ページでは、補完 UI として helm を紹介していますが、主流は変わりつつあるようです。以下が参考となりますので紹介させていただきます。

<2021/02/05 追記>
本ページの内容は WSL2 でも動作します。DrvFs や VolFs の記載がある場合には、Windows 側のファイルシステム、WSL2 側のファイルシステムと読み替えてください。

<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 サーバでは発生しないようです。

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

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

<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/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 -)"

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

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

<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/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(GWSL の中でも利用)について、次のページに不具合情報が報告されています。コピペ時の「–」の欠落などは注意が必要と思いました。内容を確認してみてください。
(2021/09/17 追記)「–」の欠落の問題は、VcXsrv の最新のバージョンでは発生しないようです。

【本題】


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

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

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

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

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

2) Microsoft Store から GWSL(X11 サーバアプリ)をインストールする。

3) Windows Subsystem for Linux を有効にし、Microsoft Store から Ubuntu-22.04 をインストールした後、コンソールを起動する。

4) WSL に複数の Linux のディストリビューションをインストールしている場合は、コマンドプロンプトで次のコマンドを実行し、Ubuntu-22.04 ディストリビューションをデフォルトにしておく。(Windows 側から、bash.exe や wsl.exe を実行した際に使われる WSL ディストリビューションとなる。)
> wsl -l
> wsl -s Ubuntu-22.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 apt install emacs emacs-el
$ sudo -E apt install cmigemo
※ Ubuntu-22.04 では emacs-27 がインストールされます。emacs-28 をインストールしたい場合には、以下を実行してください。
$ sudo -E apt remove emacs emacs-el
$ sudo -E apt autoremove
$ sudo -E add-apt-repository ppa:kelleyk/emacs
$ sudo -E apt update
$ sudo -E apt install emacs28 emacs28-el
$ sudo -E apt install cmigemo

9) x11-xserver-utils パッケージをインストールする。
$ sudo -E apt install x11-xserver-utils

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

~/.bash_profile に次の設定を行う。
if which tasklist.exe > /dev/null && ! tasklist.exe | grep -q '^GWSL_vcxsrv'; then
    (
        cmd.exe /c GWSL.exe > /dev/null 2>&1 &
        sleep 3

        if uname -v | grep -q 'Microsoft'; then
            export DISPLAY=:0
        else
            export DISPLAY=$(ip route | awk '/^default/ {print $3; exit}'):0
            xhost + $(ip -4 a show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
        fi

        # access control を enabled にする
        xhost -
    )
fi

[ -r ~/.bashrc ] && source ~/.bashrc

※ 上記の設定は、22) で紹介している次の設定の wslemacs-start.exe を利用することにより、GWSL.exe を自動起動することを想定しています。
※ GWSL の内部から起動されている VcXsrv には、-noprimary オプションを付ける必要があります。VcXsrv のオプションを指定するには、GWSLアイコンの右クリック -> XServer Profiles -> Add A Profile で新しい Custom Profile を作成してください。設定後、メニューに追加された Custom profile を選択して有効とする必要があります。また、GWSL を一度終了し、wslemacs-start.exe を再起動するなどして上記のスクリプトを実行することで、X Window Server のセキュリティの設定が行われるようにしてください。なお、設定するオプションには次の値をお勧めします。
-multiwindow -clipboard -noprimary -wgl
※ VcXsrv のオプションは次のページを参照してください。
※ GWSL のメニューから、DPI Scaling Mode を選択することができます。初期値は「Linux」となっているようですが、私はリモートデスクトップ利用時に DPI の問題が発生したため、「Windows」に変更して利用しています。

※ GWSL に X クライアントから接続できない場合は、次の対応をお試しください。
  • 1. 「コントロールパネル」->「システムとセキュリティ」->「Windows Defender ファイアウォールによる PC の保護」を開き、メニュから「詳細設定」をクリックする
  • 2. 「受信の規則」をクリックし、「GWSL VcXsrv windows xserver」と「GWSL PulseAudio server」の行があれば、全て削除する
  • 3. Windows の GWSL アプリを起動する(既に起動していれば、再起動する)
  • 4. VcXsrv のファイアウォールの通信許可設定ダイアログ画面が開くので、「パブリックネットワーク」のチェックボックスにチェックを入れ、通信を許可する

また、~/.bashrc に次の設定を追加する。
if [ "$INSIDE_EMACS" ]; then
    TERM=eterm-color
fi

umask 022

if uname -v | grep -q 'Microsoft'; then
    export DISPLAY=:0
else
    export DISPLAY=$(ip route | awk '/^default/ {print $3; exit}'):0
fi

unset LIBGL_ALWAYS_INDIRECT
※ LIBGL_ALWAYS_INDIRECT の設定は unset にしました。VcXsrv(GWSL の中で利用)の -wgl オプションとの組み合わせで、mesa の glxgears が動くことを確認しています。(ネットには、VcXsrv のオプションを -nowgl とすべきとの情報が多くありますが、-wgl で動いたので良しとしました。)次のページに関連する情報があります。
※ 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) に「<フレームの高さを補正する設定>」の説明を追加した。


最終更新:2023年01月23日 12:20