EXWM

出自 ArchWiki

EXWM 是一个基于 Emacs窗口管理器

安装

确保您已安装 emacs。您还需要 xorg-xinit

在 Emacs 中安装 EXWM:M-x package-install RET exwm RET

编辑 xinitrc 并添加

exec emacs

在您的 emacs 初始化文件中,添加

(require 'exwm)
(require 'exwm-config)
(exwm-config-example)

以使用默认设置。如果您想使用自己的设置,请使用 (exwm-enable) 代替 (exwm-config-example) (并且您不需要 (require 'exwm-config))。

也可以在服务器模式下启动 emacs,并从命令行启动 EXWM。请参阅 https://github.com/ch11ng/exwm/issues/284

配置

EXWM 是一个完整的 X 窗口管理器,因此 Emacs 管理 X 窗口,例如您的浏览器、vlc 等。您可以使用所有常用的 Emacs 窗口命令来控制窗口位置。在 X 窗口(即不是“普通”Emacs 缓冲区)中,某些命令会被 EXWM 捕获,而不会传递给程序。这些键存储在 exwm-input-prefix-keys 中。或者,您可以通过自定义 exwm-input-global-keys 来设置全局命令。如果您更愿意在 elisp 中设置 exwm-input-global-keys 而不是使用自定义功能,请注意您可能需要重启 EXWM(并在启用 exwm 之前设置 exwm-input-global-keys)。或者,您可以尝试使用来自 "or emacs" 博客cset 宏,它应该可以用于重新定义 exwm-input-global-keys 而无需重启 EXWM。要使用 s-& 作为键盘快捷键来启动程序(例如 firefox),您可以这样做

(setq exwm-input-global-keys `(,(kbd "s-&") .
                               (lambda (command)
                                 (interactive (list (read-shell-command "$ ")))
                                 (start-process-shell-command command nil command))))

多显示器

EXWM 可以通过(可选的)exwm-randr 软件包处理多显示器。您需要安装 xrandr 并在调用 (exwm-enable) 之前在您的 emacs 配置文件中启用 exwm-randr。您需要将 “DP-1” 和 “DP-2” 的值调整为您计算机使用的值;在命令行中不带参数调用 xrandr 以查看可用的输出。

(require 'exwm-randr)
(setq exwm-randr-workspace-output-plist '(1 "DP-1"))
(add-hook 'exwm-randr-screen-change-hook
          (lambda ()
            (start-process-shell-command
             "xrandr" nil "xrandr --output DP-1 --right-of DP-2 --auto")))
(exwm-randr-enable)

系统托盘

EXWM 支持系统托盘,但默认情况下未启用。要启用它,请在您的 dotemacs 文件中的 (exwm-enable) 之前放置以下内容

(require 'exwm-systemtray)
(exwm-systemtray-mode 1)

您可能需要在之后调整高度;可以使用 exwm-systemtray-height 变量调整高度。

在 LXDE 中嵌入

EXWM 可以代替 openbox 使用,让您仍然可以使用 LXDE 会话管理工具。

在执行此操作之前,请确保您已设置好 emacs 的初始化文件以运行 EXWM(请参阅上文)

lxsession 使用在 ~/.config/lxsession/LXDE/desktop.conf 中定义的窗口管理器(默认为 Openbox)。如果此文件不存在,它会在 /etc/xdg/lxsession/LXDE/desktop.conf 中搜索。

将任一文件中的 openbox-lxde 替换为 emacs

[Session]
window_manager=emacs

lxsession-logout

您可以在 emacs 中创建以下函数,以便从 LXDE 会话中干净地注销、关机或重启

(defun exwm-logout ()
  (interactive)
  (recentf-save-list)
  (save-some-buffers)
  (start-process-shell-command "logout" nil "lxsession-logout"))

这会将您的 recentf 历史记录存储到磁盘,提示您保存、丢弃或比较未保存缓冲区中的更改,然后启动注销管理器。您可以将此函数绑定到 emacs 中的任何键。

故障排除

Firefox 中的屏幕撕裂

您可能会在某些程序(尤其是 Firefox)中遇到屏幕撕裂。您可以尝试

  • 在首选项 > 高级 > 使用平滑滚动中关闭平滑滚动。
  • 安装(并激活)Compton 或另一个合成管理器:Xorg#合成

令人困惑的缓冲区名称

您可能会看到缓冲区名称被命名为“*EXWM*”。这使得在缓冲区之间切换时感到困惑。.EXWM 允许缓冲区自行命名。要允许缓冲区自行命名,请将以下内容放入您的 dotemacs 中。

;; Make buffer name more meaningful
(add-hook 'exwm-update-class-hook
          (lambda ()
          (exwm-workspace-rename-buffer exwm-class-name)))

参见