Featured image of post Emacsをウィンドウマネージャとして使う「EXWM」を導入する

Emacsをウィンドウマネージャとして使う「EXWM」を導入する

2010年代に比べるとMacOSを開発環境として利用するメリットは大分薄れてきたように感じる昨今です。 円安もあって非常にお高いので値頃感もなくなってきているというのもあります。

そんな背景もあり、VMWare Workspaceが非商用利用の個人向けに無料で提供されていることもあり、最近はVMWare上のNixOSをメイン環境として利用しています。

デスクトップ環境として一旦Cinnamonを利用していたのですが、タイル型Window Managerを検討するにあたって、EXWMを導入してみました。

EXWMとは

Emacs X Window ManagerはEmacsをウィンドウマネージャ(WM)として利用するという画期的?なプロジェクトです。

Emacs X Window Manager. Contribute to ch11ng/exwm development by creating an account on GitHub.
GitHub - ch11ng/exwm: Emacs X Window Manager

Linuxのウィンドウマネージャにはi3やXmonadなど色々種類があるのですが、これらと比較してEXWMはEmacsユーザーに対して

  • 操作がEmacsベースなので学習コストが低い
  • EXWM自体がElispで書かれており、configurationもElispで書ける

などのメリットがあります。

こういった点からEmacsユーザーとしては一度は試してみたいウィンドウマネージャでして、今回の導入に至りました。

インストール

Ubuntuなどへの導入については公式Wikiが参考になるかと思います。

(2023/6/9追記) NixOSでは他のディストリビューションと導入方法が異なります。以下の記事でインストール方法を紹介していますので、参考にしてください。

2023年は個人的nixpkgs元年なのですが、nixpkgsを利用していく中で気がついたらNixOSをメイン環境として利用するようになって
NixOS環境に「EXWM」をインストールする

基本的な設定

exwm-config というパッケージが提供されているため、こちらを利用することですぐに使い始めることができます。

1
2
3
(require 'exwm)
(require 'exwm-config)
(exwm-config-example)

exwm-config-example は基本的なキーコンフィグやMenuBarをオフにするなどの設定しつつ (exwm-enable) を内部で実行してくれます。

この関数は内部で ido-mode をenableにしているため、idoを切って利用している人は意図せずenableになってしまうため注意が必要です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
;; Global keybindings.
(unless (get 'exwm-input-global-keys 'saved-value)
  (setq exwm-input-global-keys
        `(
          ;; 's-r': Reset (to line-mode).
          ([?\s-r] . exwm-reset)
          ;; 's-w': Switch workspace.
          ([?\s-w] . exwm-workspace-switch)
          ;; 's-&': Launch application.
          ([?\s-&] . (lambda (command)
                       (interactive (list (read-shell-command "$ ")))
                       (start-process-shell-command command nil command)))
          ;; 's-N': Switch to certain workspace.
          ,@(mapcar (lambda (i)
                      `(,(kbd (format "s-%d" i)) .
                        (lambda ()
                          (interactive)
                          (exwm-workspace-switch-create ,i))))
                    (number-sequence 0 9)))))
;; Line-editing shortcuts
(unless (get 'exwm-input-simulation-keys 'saved-value)
  (setq exwm-input-simulation-keys
        '(([?\C-b] . [left])
          ([?\C-f] . [right])
          ([?\C-p] . [up])
          ([?\C-n] . [down])
          ([?\C-a] . [home])
          ([?\C-e] . [end])
          ([?\M-v] . [prior])
          ([?\C-v] . [next])
          ([?\C-d] . [delete])
          ([?\C-k] . [S-end delete]))))

これは exwm-config-example の内部で設定される初期キーバインディングですが、 Super-& でアプリケーション起動ができます。

ワークスペース数も設定でき、初期値は4です。 Super-[num] で切り替えができるようになっています。

Emacs以外のWindowでは char-modeline-mode があり、Windowのキー操作とEmacs側のキー操作を切り替えることができます。 それぞれ C-c C-kSuper-r が対応しています。

line-mode はそのままGSettingsのEmacs key themeが使えるようなものなので便利ですし、キーバインド自体は自由に設定でき、vimっぽくするなどのカスタムも可能です。

スクリーンサイズ調整

VMWareを使っていることもあって、起動時に認識される画面サイズが実際のディスプレイと異なっていて、 xrandr で設定する必要がありました。

xrandr - ArchWiki

EXWMではOptionalとして xrandr がサポートされています。 まず xrandr コマンドを実行して、出力先と解像度を確認します。(以下は1920x1200に設定した状態での出力例)

1
2
3
4
5
6
7
8
$ xrandr
Screen 0: minimum 320 x 200, current 1920 x 1200, maximum 16384 x 16384
Virtual-1 connected primary 1920x1200+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1920x1200     60.00*+  59.88
   3840x2400     59.97
   3840x2160     59.97
   2880x1800     59.95
   ...

出力先と解像度のサポートを調べたら、 exwm-randr に設定します。

1
2
3
4
5
6
7
(require 'exwm-randr)
(setq exwm-randr-workspace-output-plist '(0 "Virtual-1"))
(add-hook 'exwm-randr-screen-change-hook
          (lambda ()
            (start-process-shell-command
             "xrandr" nil "xrandr --output Virtual-1 --mode 1920x1200")))
(exwm-randr-enable)

公式Wikiの設定をそのまま流用して、 xrandr の実行内容を上記のように変更するだけです。 ここでは、1920x1200としています。

日本語入力

普段Emacs上ではDDSKKを使って日本語入力をしています。EXWMであってもEmacs Bufferでは問題なく利用することができます。 ただし、残念ながらEXWMでEmacs Buffer以外のバッファではSKKを利用することはできませんでした。

EXWMでは exwm-xim としてサポートはしており、 例えば japanese-hiragana などでひらがなをブラウザに入力することなどはできるのですが、これをSKKにすると Shift 入力で日本語入力を開始できませんでした。 理由はわかってないのですが、どうもSKKの変換モードにうまく入ることができないようでした。

開発用途であれば日本語はほとんど不要ですし、Emacs BufferではSKKが使えることもあり、あまり困らないのでそのまま放置しています。 必要な際にはfcitx5-skkなどを導入することになりそうです。

実際使ってみた感想

とりあえず10日ほど使っていますが、思った以上に快適でした。

一度configさえしてしまえば安定してますし、 EXWMはEmacsですので、 Fully keyboard-driven operations とあるとおりしっかりキーボード操作で完結できます。 つまりいつものEmacsの延長でストレスなく操作できます。

色々カスタマイズしながらしばらくはEXWMを使ってみようと思います。

Built with Hugo
テーマ StackJimmy によって設計されています。