世界を動かす技術を、日本語で。

Plwm – Prologで書かれたX11ウィンドウマネージャー

概要

plwm は、 Prolog で書かれた動的タイル型X11ウィンドウマネージャ。 高いカスタマイズ性軽快な動作、論理プログラミングの学習にも最適。 SWI-Prolog を基盤とし、さまざまなレイアウトや外部バー、多画面対応などをサポート。 設定はPrologで記述、柔軟なワークスペース管理やキーバインドが特徴。 導入や設定方法、基本操作、カスタマイズ例 などを簡潔に解説。

plwmとは何か

  • plwm は、 Prolog で実装された X11用動的タイル型ウィンドウマネージャ
    • 高品質なコードとドキュメンテーション
    • 強力かつ簡単なカスタマイズ
    • タイル型WMユーザーの主要ニーズをカバー
    • 小規模・シンプル・拡張性重視
    • SWI-Prolog を使用

主な特徴

  • ハッキング容易性 :Prologによる論理プログラミング入門に最適
  • 宣言的設定 :設定ファイルもPrologソース、専用フォーマットのような扱いやすさ
  • 多様なレイアウト :monocle、スタック、グリッド、左右/上下/中央マスター、nrows(N)・ncols(N)など
  • フローティングウィンドウ :マウスで移動・リサイズ可能
  • 外部バー対応 :polybar, lemonbarなど
  • EWMH準拠 :一部進行中
  • 軽量高速 :10-15MB程度のメモリ使用量
  • 動的ワークスペース管理 :作成・リネーム・再インデックス・削除が即時可能
  • 多画面対応、ギャップ、dmenu/rofi連携、ルール、フック、アニメーション、FIFOコマンド等

インストール

  • 依存パッケージ :xorg(libx11-dev, libxft-dev, libxrandr-dev)、SWI-Prolog
  • Ubuntu 22.04例
    • sudo apt install xorg-dev swi-prolog
  • ビルド・インストール
    • make && sudo make install
    • デフォルトインストール先:/usr/local/bin/(Makefileで変更可)

最小限の環境構築

  • ~/.xinitrc の末尾にexec plwmを追加
  • ttyでstartx 実行で起動
  • 自動起動例(~/.bash_profile等)
    • if [ -z "$DISPLAY" -a $(tty) = "/dev/tty1" ]; then
        exec startx
      fi
      

ディスプレイマネージャでの利用

  • /usr/share/xsessions/plwm.desktop を作成
    • [Desktop Entry]
      • Name=plwm
      • Comment=This session logs you into plwm
      • Exec=plwm
      • Icon=plwmのロゴパス
      • Type=Application

基本操作・挙動

  • コマンドラインオプションplwm -hで一覧表示
  • 全ウィンドウ自動管理 :新規ウィンドウは自動でスタックに追加、レイアウトに応じ自動配置・サイズ調整
  • マスタースタック型レイアウト :nmaster数(デフォルト1)がマスター領域に割り当て
    • 例:lmaster, nmaster=1, mfact=2/3
      • スタック最上位ウィンドウが左2/3、残りが右1/3

この方式の利点

  • 宣言的ウィンドウ管理 :配置方法を指示するだけで自動調整
  • ウィンドウの増減時も自動再配置
  • レイアウト・nmaster・mfactの組み合わせで多彩な配置を実現
  • 画面スペースを常時100%活用(ギャップ有りなら99%)

デフォルトキーバインド一覧

| キー操作 | アクション | 説明 | |----------|-----------|------| | super + j | shift_focus(down) | 次のウィンドウへフォーカス移動 | | super + k | shift_focus(up) | 前のウィンドウへフォーカス移動 | | super + shift + j | move_focused(down) | フォーカスウィンドウを次と入れ替え | | super + shift + k | move_focused(up) | フォーカスウィンドウを前と入れ替え | | super + Return | focused_to_top | フォーカスウィンドウをスタック最上位へ | | super + q | close_focused | フォーカスウィンドウを閉じる | | super + shift + space | toggle_floating | フローティング/タイル切替 | | super + f | toggle_fullscreen | フルスクリーン切替 | | super + shift + q | quit | plwmを終了 | | super + i | change_nmaster(+1) | マスター数を増やす | | super + d | change_nmaster(-1) | マスター数を減らす | | super + h | change_mfact(-0.05) | マスター領域を縮小 | | super + l | change_mfact(+0.05) | マスター領域を拡大 | | super + shift + f | layout:set_layout(floating) | フローティングレイアウトへ | | super + shift + m | layout:set_layout(monocle) | モノクルレイアウトへ | | super + shift + s | layout:set_layout(stack) | スタックレイアウトへ | | super + shift + h | layout:set_layout(hstack) | 水平スタックへ | | super + shift + g | layout:set_layout(grid) | グリッドレイアウトへ | | super + shift + l | layout:set_layout(lmaster) | 左マスターレイアウトへ | | super + shift + r | layout:set_layout(rmaster) | 右マスターへ | | super + shift + t | layout:set_layout(tmaster) | 上マスターへ | | super + shift + b | layout:set_layout(bmaster) | 下マスターへ | | super + shift + c | layout:set_layout(cmaster) | 中央マスターへ | | super + Tab | toggle_workspace | 直前ワークスペースに切替 | | super + shift + Tab | toggle_hide_empty_workspaces | 空ワークスペース非表示切替 | | super + 1...9 | switch_workspace('1'...‘9’) | 指定ワークスペースに移動 | | super + p/n | switch_workspace(prev/next) | 前/次ワークスペースに移動 | | super + shift + 1...9 | move_focused_to_workspace('1'...‘9’) | フォーカスウィンドウを指定ワークスペースへ移動 | | super + shift + p/n | move_focused_to_workspace(prev/next) | フォーカスウィンドウを前/次ワークスペースへ移動 | | super + ,/. | switch_monitor(prev/next) | 前/次モニターへ切替 | | super + shift + ,/. | move_focused_to_monitor(prev/next) | フォーカスウィンドウを前/次モニターへ移動 |

  • Tips
    • change_nmaster/1, change_mfact/1は絶対値指定も可能(+/-なしで値指定)
    • switch_workspace/1, move_focused_to_workspace/1はprev_nonempty, next_nonemptyも指定可
    • nrows(N), ncols(N)レイアウトも利用可能(例:super + shift + "T" -> layout:set_layout(ncols(3)))
    • 複数アクションをカンマ区切りで一括バインド可能

設定方法

  • config.pl を編集し、make && sudo make installで再ビルド
  • 起動時の設定ファイル読み込み順
    • $XDG_CONFIG_HOME/plwm/config.pl
    • $HOME/.config/plwm/config.pl
    • /etc/plwm/config.pl
  • -cフラグ で任意パス指定可能
  • モジュール名はruntime_config!
  • make mkconfigでsrc/config.plからランタイム用設定生成
  • -Cフラグ で設定ファイルのバリデーション可
  • 主な設定項目例
    • default_nmaster:初期マスター数
    • default_mfact:マスター領域比率(0.05~0.95)
    • default_layout:デフォルトレイアウト
    • attach_bottom:新規ウィンドウを下に追加
    • border_width/border_color:枠線幅・色
    • snap_threshold:ドラッグ時吸着閾値
    • outer_gaps/inner_gaps:外周・内部ギャップ
    • workspaces:ワークスペース名リスト
    • starting_workspace:起動時ワークスペース
    • hide_empty_workspaces:空ワークスペース非表示
    • ws_format/occupied:バー表示フォーマット
    • layout_default_overrides:モニタ・ワークスペース別上書き設定
    • bar_class/bar_placement:外部バー関連
    • fifo_enabled/fifo_path:FIFOコマンド関連
    • menucmd:メニューコマンド
    • animation_enabled:アニメーション有無

よくある質問・補足

  • plwmの開発状況 :活発にメンテナンス中、EWMH対応など一部進行中
  • 類似プロジェクト :dwm, xmonad, i3など
  • 貢献方法 :GitHubのリポジトリ参照、Issue/PR歓迎
  • スクリーンショットや詳細 :公式ドキュメント・リポジトリ参照

plwmは 論理プログラミングX11ウィンドウ管理 を融合した、 高度なカスタマイズ性軽量さ を両立したユニークな選択肢。 Prolog の知識を活かしたい方や、 自分好みのWMを構築したいユーザー に特におすすめ。

Hackerたちの意見

いいね!dwmに慣れてるなら、これも自然に感じるはず。俺はdwmのタグを作業スペース以上のものとして使ってるけど、作者はそうじゃないから、タグの代わりにワークスペースを実装したんだよね。だから、俺にとってはdwmの代わりにはならないな。

タグは、ピンとくると本当に素晴らしいアイデアなんだけど、使い方に慣れるまで約1年かかったのは認めざるを得ない。

全エルランのHNの最初のページを思い出すな、なんでだろう?

面白い事実:最初のエルランインタープリターはPrologで書かれてたんだよ。

おお、これ試してみなきゃ!ドキュメントもたくさんあるし、すごいね!

いつか誰かがWayland用のウィンドウマネージャーサービスを書いて、コンポジタAPIをプロトコルに置き換えてくれたらいいな。そうすれば、ウィンドウマネージャーをどんな言語でも実装できるようになるし、Waylandやコンポジタのライブラリがなくても大丈夫になるから。

もっといろんなものがAPIじゃなくてプロトコルになればいいのに。

え?Waylandはプロトコルだよ。APIじゃない。

riverを見てみて!今、こんな感じのものを作ってるらしいよ!

ソース見たけど、めっちゃコンパクトで驚いた。

今まで見たことないようなPrologだね。論理用の宣言型言語を、実際のアプリケーションとしてウィンドウ管理にひっくり返すなんて、著者には驚かされるよ。素晴らしい!

コンパクトなだけじゃなくて、コメントもちゃんと書かれてていいね!こういうの大好き!

誰か「チュートリアルProlog」から「実プロジェクトProlog」への移行を説明してくれるチュートリアルとか知ってる人いる?これ、チュートリアルPrologとは全然違うから。Prologは面白そうだけど、自分でおもちゃの例以上のことをやろうとすると、無限再帰や解けない問題にぶつかっちゃうんだよね。

[通報済み]

これが「本物」のPrologに関する最高のリソースの一つだよ:https://www.metalevel.at/prolog 彼のYouTube動画もめちゃくちゃ良いから見てみて。

言語の選択を除けば、plwmに似ているウィンドウマネージャーやインスピレーションを受けたものに興味があるな。

Gentooに必要なライブラリを全部インストールしてコンパイルしたけど、黒い画面にマウスカーソルしか出てこないんだよね。

それがほとんどのタイルウィンドウマネージャーだよ。キー割り当てをチェックしてみて。ターミナルでも開いてみたら?

お前、ratpoison使ったことないでしょ。

これ、めっちゃ印象的だね。プロログに詳しくない俺からの素朴な質問なんだけど、これって実際に論理的なプロログの機能を使ってるの?それともほとんど「関数型」の部分だけ?ざっと見た感じ、注釈付きの述語はほとんどが「det」か「semidet」だし、?引数モードのものはなさそうだから、見た目はほぼ純粋な関数型コードに見えるんだけど。何か大事なこと見落としてる?確かに、プロログは論理機能を使わなくても魅力的な点が多いよね。文法も柔軟だし(プロログの演算子定義機能は、Haskellのそれとは比べ物にならないくらいすごいし)、ホモアイコニシティとかもあるし。でも、少なくとも俺の期待としては、プロログのコードがもっと論理的な機能を使ってほしいな。

どっちに驚くべきか分からないな。誰かがウィンドウマネージャーを書くためにプロログを使ったことか、それとも誰かがプロログを使っていること自体か。