Featured image of post 「EXWM」をお洒落にカスタマイズする

「EXWM」をお洒落にカスタマイズする

この記事はEmacs Advent Calendar 2023の24日目の記事です。

利用する環境はNixOS 23.05です。以前EXWMについての記事を書いていたのですが、Windows環境ではNixOSのWSL2イメージが安定してきたこともあって、WSL環境に乗り替えました。

なので今はLinux Desktop環境およびEXWMは利用していないのですが、備忘のためにも設定した内容を残しておこうと思います。

NixOS on WSL(2) [maintainer=@nzbr] . Contribute to nix-community/NixOS-WSL development by creating an account on GitHub.
GitHub - nix-community/NixOS-WSL: NixOS on WSL(2) [maintainer=@nzbr]

なお、EXWMの導入とNixOS環境でのインストール方法については以前の記事を参照してください。

2010年代に比べるとMacOSを開発環境として利用するメリットは大分薄れてきたように感じる昨今です。 円安もあって非常にお高いので値頃感もな
Emacsをウィンドウマネージャとして使う「EXWM」を導入する
2023年は個人的nixpkgs元年なのですが、nixpkgsを利用していく中で気がついたらNixOSをメイン環境として利用するようになって
NixOS環境に「EXWM」をインストールする

Mini buffer位置の変更

1
(setq exwm-workspace-minibuffer-position 'top)

EXWMではMini bufferがかっこよくオーバーレイするのですが、mode lineが下に貼り付いた表示になっているため、被ってしまって見難いときがあります。 なので、Mini bufferをTop位置に変更しておきます。

exwm-outer-gapsの導入

EXWMはそのままでは全面Emacsなので、背景が見えません。 exwm-outer-gaps を使ってEmacsの端を見せて背景をチラ見せできるようにします。

Provide (useless) gaps to exwm. . Contribute to lucasgruss/exwm-outer-gaps development by creating an account on GitHub.
GitHub - lucasgruss/exwm-outer-gaps: Provide (useless) gaps to exwm.

NixOSのconfiguration.nixで導入するために、 fetchFromGitHub を使ったexwm-outer-gaps.nixファイルを作って利用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{ config, lib, pkgs, ... }:

with lib;

let
  exwm-emacs = ((pkgs.emacsPackagesFor pkgs.emacs).emacsWithPackages (epkgs: [
    epkgs.exwm
    epkgs.xelb
    (pkgs.callPackage ./exwm-outer-gaps.nix {
      inherit (pkgs) fetchFromGitHub;
      inherit (epkgs) trivialBuild exwm;
    })
  ]));
in
{...}

init.elに (require 'exwm-outer-gaps) を記述し、スクリーンサイズ設定の後で適用されるように exwm-randr-screen-change-hook の中で (exwm-outer-gaps-mode +1) を実行するようにします。

必要に応じて、ギャップの大きさなどを変更できますが、ここではデフォルトのまま使っています。

fehによる背景の変更

EXWMではWindowを透かさないと背景は見えないのですが、上記のexwm-outer-gapsでチラ見せしたりすることでお洒落に背景を使うことができます。

EXWMでの背景設定は feh コマンドを使って行います。 xrandr によるスクリーンサイズ設定の前に背景を指定すると画像サイズが変わってしまっうので、スクリーンサイズ調整後に設定するようにします。

1
2
3
4
5
6
7
8
(add-hook 'exwm-randr-screen-change-hook
  (lambda ()
    (start-process-shell-command
      "xrandr" nil "xrandr --output Virtual-1 --mode 1920x1200")
    (when (executable-find "feh")
      (start-process-shell-command
        "Wallpaper" nil "feh --no-fehbg --bg-fill /path/to/bg.jpg"))
  ))

picomの導入

EXWMはcomposite処理をしないので、Windowにシャドウや透過を指定するためにはCompositorの導入が必要です。 ここでは picom を利用します。

A lightweight compositor for X11. Contribute to yshui/picom development by creating an account on GitHub.
GitHub - yshui/picom: A lightweight compositor for X11

nixpkgs/picom.nix at master · NixOS/nixpkgs · GitHub のように、Nixpkgsにはpicomのconfigが含まれているので、 configuration.nix で設定します。 蛇足ですが、このときpicomはserviceとして起動し ~/.config/picom を参照しないようです。

シャドウや透過をいい感じにする

EXWMではシャドウや透過効果はWindow毎に付与されるため、そのままだとmode lineごと透けてしまいます。

例えば、VivaldiにフォーカスしているとEmacsが背後になり、結果mode lineが透けたり、 シャドウがVivaldi部分にだけかかるので、Emacsとの間に階層があるような見え方になってしまいます。

これだと格好悪いので、Emacsだけを排除して効果をつけることでそういった違和感を減らしてみます。

picomの設定で shadowExclude を指定します。 man picom で調べると、WM_CLASSに2つの名前が入っているので、それをclass_gやclass_iで指定できればよさそうです。

ここに指定するためのプロパティは xprop コマンドで調べます。 xpropで対象のWindowをクリックするとX Window System上のプロパティが確認できます。

1
2
3
4
5
6
7
services.picom = {
  enable = true;
  shadow = true;
  shadowExclude = [
    "class_g != 'Emacs' && _NET_WM_NAME:s != 'EXWM minibuffer container'"
  ];
};

ついでにMini bufferを表示したときにシャドウをつけて見やすくしてみました。 Mini bufferは _NET_WM_NAME(UTF8_STRING) しかプロパティをもってなかったので、これをそのまま指定しています。

スクリーンショットのサポート

スクリーンショットの撮影は maim コマンドを利用します。 maimにはX Compositerが必要ですが、ここでは上記で導入したpicomがあるので問題ありません。

あとはスクリーンショットコマンドを設定します。ここではF6でフルスクリーンキャプチャをするようにしています。

1
2
3
4
5
(defun my/screenshot ()
  (interactive)
  (start-process-shell-command
   "screenshot" nil "maim ~/Pictures $(date +%s).png"))
(global-set-key [f6] 'my/screenshot)

まとめ

最近は使えていませんがEXWM自体はとてもよかったのでおすすめです。 こういったデスクトップカスタムは、はまると永遠とやってしまうので沼ですね^^;

ちなみに英語ではこういったカスタマイズを ricing と言うようです。 他にはredditで unixporn のキーワードでデスクトップのカスタム例が出ているのでいい刺激になったります。

それではみなさん、メリークリスマス!

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