EXWM
概要
EXWM(Emacs X Window Manager)は、ウィンドウマネージャの1つ。Emacs下でX Windowの管理ができる。つまり、Emacsでブラウザを開く…など、あらゆる操作が可能になり、各アプリケーションウィンドウを1つのbufferとして扱える。
- Repository
- ch11ng/exwm: Emacs X Window Manager
- Wiki
- Home · ch11ng/exwm Wiki
Memo
起動時微妙にフルスクリーンにならないことがある
たまにEmacsのモードラインの下に、微妙に黒いゾーンができる。
最初に (toggle-frame-fullscreen) してから (exwm-init) するとよい。
アプリケーション起動
S-& でウィンドウが立ち上がるコマンドを実行する。
- blueman-manager
- bluetooth管理
- google-chrome
- Chrome
- nemo
- Linux Mintのファイルマネージャ
X Windowとは
X は最初からネットワークを意識してデザインされており、“クライアント - サーバ”モデルを採用しています。 X では、“X サーバ”はキーボードやモニター、マウスが接続されたコンピュータ上で動きます。このサーバはディスプレイの表示を管理したり、キーボード、マウスなどからの入力を処理したりします。各 X アプリケーション (XTerm や Netscape など) は “クライアント”になります。クライアントは“この座標にウィンドウを描いてください”といったメッセージをサーバへ送り、サーバは“ユーザが OK ボタンを押しました”といったようなメッセージを送り返します。
Code
再起動のコード
- 新しいEmacsを起動してから、現在のemacsをkill
- 起動中のプロセスIDを取り、emacsclientだったときは親プロセスをkillする
- 終了する前にhookを実行する
https://github.com/kd-collective/exwm/blob/10bd12234e896d35a2c4eafabc62a31126d23bf3/exwm.el#L126-L153
(defun exwm-restart ()
  "Restart EXWM."
  (interactive)
  (exwm--log)
  (when (exwm--confirm-kill-emacs "[EXWM] Restart? " 'no-check)
    (let* ((attr (process-attributes (emacs-pid)))
           (args (cdr (assq 'args attr)))
           (ppid (cdr (assq 'ppid attr)))
           (pargs (cdr (assq 'args (process-attributes ppid)))))
      (cond
       ((= ppid 1)
        ;; The parent is the init process.  This probably means this
        ;; instance is an emacsclient.  Anyway, start a control instance
        ;; to manage the subsequent ones.
        (call-process (car command-line-args))
        (kill-emacs))
       ((string= args pargs)
        ;; This is a subordinate instance.  Return a magic number to
        ;; inform the parent (control instance) to start another one.
        (kill-emacs ?R))
       (t
        ;; This is the control instance.  Keep starting subordinate
        ;; instances until told to exit.
        ;; Run `server-force-stop' if it exists.
        (run-hooks 'kill-emacs-hook)
        (with-temp-buffer
          (while (= ?R (shell-command-on-region (point) (point) args))))
        (kill-emacs))))))
Tasks
マルチディスプレイに対応する
設定が必要。
(require 'exwm-randr) (setq exwm-randr-workspace-output-plist '(1 "eDP-1")) (add-hook 'exwm-randr-screen-change-hook (lambda () (start-process-shell-command "xrandr" nil "xrandr --output DP-1 --right-of HDMI-1 --auto"))) (exwm-randr-enable) (exwm-enable)
- 微妙に入りきってない
- 左右分割しないと使い物にならない
など、かなり厳しそうな雰囲気。
TODO Chromeに切り替えたときフォーカスしない
qutebrowserやFirefoxでは起きないのでChromeの問題の可能性が高い。
TODO ブラウザが個別に開く設定にし、各バッファ選択から直に移動できるようにする
どこかSystem Craftersの動画で紹介されていたはずだ。
Archives
DONE chromeバッファなどでpersp移動ができなくて不便
いちいちEmacsバッファに移ってからキーを打たないと反応しなかった。 define-keyでmodeに定義してやると共通のキーバインドで使用できるようになった。 こういうのちょっとめんどい。
(global-set-key (kbd "C-M-<right>") 'persp-next) ;; 従来 (global-set-key (kbd "C-M-<left>") 'persp-prev) ;; 従来 (define-key exwm-mode-map (kbd "C-M-<right>") 'persp-next) ;; 加える (define-key exwm-mode-map (kbd "C-M-<left>") 'persp-prev) ;; 加える
DONE Setting EXWM
単に (start-process-shell-command) を使ってコマンドを実行すればいい。
(start-process-shell-command "compton" nil "compton -b --config $HOME/dotfiles/.config/compton/compton.conf")
CLOSED:
- background
- transparent background
- polybar