xmonad
xmonad 是一个用于 X 的平铺式窗口管理器。窗口会自动排列以铺满屏幕,没有间隙或重叠,从而最大化屏幕利用率。窗口管理器的功能可以通过键盘访问:鼠标是可选的。
xmonad 使用 Haskell 编写、配置并具备可扩展性。自定义布局算法、按键绑定和其他扩展可以由用户在配置文件中编写。
布局是动态应用的,每个工作区可以使用不同的布局。完全支持 Xinerama,允许在多个物理屏幕上平铺窗口。
安装
安装 xmonad 软件包,它提供了一个非常基础的配置;理想情况下,还请安装 xmonad-contrib,它能提供更实用的桌面配置以及额外的平铺算法、配置、脚本等。
或者,安装 xmonad-gitAUR(开发版本,包含一些额外的依赖项);同样也可以安装 xmonad-contrib-gitAUR。
xmonad --recompile,否则下次启动时可能会出现无法找到共享库的问题。要自动化此过程,请参阅 #更新后无法找到共享库的问题。启动
使用 xinit 运行 xmonad。
或者,在您选择的显示管理器的会话菜单中选择 Xmonad。
确保安装了 Xterm 软件包,或者在配置中更改了终端模拟器。否则,您将无法在 xmonad 中执行任何操作。
配置
创建 ~/.xmonad 目录和 ~/.xmonad/xmonad.hs 文件,并按如下所述进行编辑。
在对 ~/.xmonad/xmonad.hs 进行更改后,使用 Mod+q 快捷键进行重新编译并使其生效。
xmonad.hs 运行即可获得。由于 xmonad 的配置文件是用 Haskell 编写的,非程序员可能在调整设置时会遇到困难。有关详细指南和配置示例,我们建议参考以下资源:
- xmonad wiki
- xmonad 配置存档
- xmonad 常见问题解答
- Arch Linux 论坛帖子
最好的方法是仅将您的更改和自定义内容放入 ~/.xmonad/xmonad.hs,并编写代码,使任何未设置的参数都从内置的 def 函数中获取。
这可以通过编写如下所示的 xmonad.hs 来实现:
import XMonad
main = xmonad def
{ terminal = "urxvt"
, modMask = mod4Mask
, borderWidth = 3
}
这仅覆盖了默认的终端和 borderWidth,而将所有其他设置保留为其默认值(继承自 XConfig 值 def)。
随着配置变得复杂,将配置选项作为函数名在主函数中调用,并将其分别定义在 ~/.xmonad/xmonad.hs 的各个部分中会更加方便。这使得像布局和管理钩子(manage hooks)这样的大型自定义内容更容易可视化和维护。
上述简单的 xmonad.hs 可以写成这样:
import XMonad
main = do
xmonad $ def
{ terminal = myTerminal
, modMask = myModMask
, borderWidth = myBorderWidth
}
myTerminal = "urxvt"
myModMask = mod4Mask -- Win key or Super_L
myBorderWidth = 3
此外,在 Haskell 中,顶层(main, myTerminal, myModMask 等)或 {} 内部的顺序并不重要,只要导入语句在最前面即可。
以下内容摘自 0.9 配置文件模板。这是一个人可能想在主 do 块中定义的最常用函数示例。
{
terminal = myTerminal,
focusFollowsMouse = myFocusFollowsMouse,
borderWidth = myBorderWidth,
modMask = myModMask,
-- numlockMask deprecated in 0.9.1
-- numlockMask = myNumlockMask,
workspaces = myWorkspaces,
normalBorderColor = myNormalBorderColor,
focusedBorderColor = myFocusedBorderColor,
-- key bindings
keys = myKeys,
mouseBindings = myMouseBindings,
-- hooks, layouts
layoutHook = myLayout,
manageHook = myManageHook,
handleEventHook = myEventHook,
logHook = myLogHook,
startupHook = myStartupHook
}
该软件包本身也包含一个 xmonad.hs,它是随 xmonad Haskell 模块提供的最新官方示例 xmonad.hs,展示了如何覆盖所有内容。这不应被用作模板配置,而应作为您可以选择在自己的配置中使用的部分示例。它位于 /usr/share/ 下的一个取决于架构和版本的目录中(例如 find /usr/share -name xmonad.hs)。
基础桌面配置
在 xmonad-contrib 中有一个更适合一般桌面用途的默认配置。它还有助于解决一些现代程序(如 Chromium)中的问题。
可以这样添加:
import XMonad
import XMonad.Config.Desktop
main = xmonad desktopConfig
{ terminal = "urxvt"
, modMask = mod4Mask
}
退出 xmonad
要结束当前的 xmonad 会话,请按 Mod+Shift+Q。默认情况下,Mod 是 Alt 键。如果每次都需要确认退出,
xmonad.hs
...
import XMonad.Prompt.ConfirmPrompt
...
myKeys :: [(String, X ())]
myKeys =
...
("M-S-q", confirmPrompt defaultXPConfig "exit" $ io exitSuccess)
...
技巧与提示
X-Selection-Paste (X 选择区粘贴)
xmonad 中以键盘为中心的操作可以通过 X-Selection-Paste 的键盘快捷键得到进一步支持。
此外,在 XMonad.Util.Paste 中存在一个 pasteSelection 函数,可以使用如下行绑定到按键:
xmonad.hs
import XMonad.Util.Paste -- Remember to include this line -- X-selection-paste buffer , ((0, xK_Insert), pasteSelection)
现在按 Insert 键即可在活动窗口中粘贴鼠标缓冲区内容。
- 请注意,
pasteSelection使用XMonad.Util.XSelection中的getSelection,因此也继承了其缺陷。 getSelection“在根本实现上是不正确的,并且在其他可能的失败模式中,可能会导致死锁或崩溃”。有关详细信息,请参见 [1]。- 这些错误在实践中通常非常罕见,但仍然存在。
键盘快捷键
默认键盘快捷键列在 xmonad(1) 中。
针对未绑定的按键
如果您将 xmonad 用作独立的窗口管理器,可以编辑 xmonad.hs 来添加未绑定的键盘按键。您只需要找到该按键的 Xf86 名称(例如 XF86PowerDown),并在 /usr/include/X11/XF86keysym.h 中查找它。它会为您提供一个键码(如 0x1008FF2A),您可以将其用在 xmonad.hs 的按键绑定列表中,像这样添加一行:
((0, 0x1008FF2A), spawn "sudo systemctl suspend")
您也可以在 Graphics.X11.ExtraTypes.XF86 模块中搜索 Xf86 按键名称,并使用其 KeySym 常量(如 xF86XK_PowerDown)代替键码,如前例所示。您还需要在 xmonad.hs 中导入该模块,以便使用该常量。请参阅 additionalKeys 函数所使用格式的更详细的多按键示例。
import Graphics.X11.ExtraTypes.XF86 ... myKeys = [ ((0, xF86XK_PowerDown), spawn "sudo systemctl suspend") , ((0, xF86XK_AudioRaiseVolume), spawn "amixer -D pulse sset Master 10%+") , ((0, xF86XK_AudioLowerVolume), spawn "amixer -D pulse sset Master 10%-") , ((0, xF86XK_AudioMute), spawn "amixer -D pulse sset Master toggle") , ((0, xF86XK_MonBrightnessUp), spawn "brightnessctl set +10%") , ((0, xF86XK_MonBrightnessDown), spawn "brightnessctl set 10%-") ... ]
通过鼠标触碰屏幕边缘执行 X () 操作
使用 XMonad.Hooks.ScreenCorners,用户可以在 XMonad 中拥有类似 KDE 的屏幕边角触发功能。
使用 ScreenCorners 切换工作区 (类 KDE 体验)
在 startupHook 中定义一系列操作:
xmonad.hs
...
import XMonad.Hooks.ScreenCorners
...
mystartupHook = do
...
... example ...
addScreenCorners [ (SCLowerLeft, prevWS)
, (SCLowerRight, nextWS)
, (SCUpperLeft, spawnSelected' myAppGrid)
, (SCUpperRight, goToSelected $ mygridConfig' myColorizer)
]
...
然后将 screenCornerEventHook 添加到 handleEventHook 中:
myConfig = def {
...
handleEventHook = ... <+> screenCornerEventHook <+> ...
...
}
最后添加 screenCornerLayoutHook:
...
myLayoutHook = screenCornerLayoutHook $ ......
...
myConfig = def {
...
layoutHook = myLayoutHook
...
}
- 此扩展为 XMonad 添加了类 KDE 的屏幕边角功能。
- 通过将光标移动到屏幕的一个边角,您可以触发 X () 操作,例如 XMonad.Actions.GridSelect.goToSelected 或 XMonad.Actions.CycleWS.nextWS 等。
增加工作区数量
默认情况下,xmonad 使用 9 个工作区。您可以通过更改 workspaces 参数来更改此设置:
xmonad.hs
import XMonad
import XMonad.Util.EZConfig (additionalKeys)
main=do
xmonad $ def
{ ...
, workspaces = myWorkspaces
, ...
} `additionalKeys` myAdditionalKeys
myWorkspaces = ["1","2","3","4","5","6","7","8","9"] ++ (map snd myExtraWorkspaces) -- you can customize the names of the default workspaces by changing the list
myExtraWorkspaces = [(xK_0, "0")] -- list of (key, name)
myAdditionalKeys =
[ -- ... your other hotkeys ...
] ++ [
((myModMask, key), (windows $ W.greedyView ws))
| (key, ws) <- myExtraWorkspaces
] ++ [
((myModMask .|. shiftMask, key), (windows $ W.shift ws))
| (key, ws) <- myExtraWorkspaces
]
检查重复的按键绑定
XMonad.Util.EZConfig 提供了 checkKeymap 函数来检查重复的按键绑定,否则重复项将被静默忽略。
xmonad.hs
main = xmonad $ myConfig
myKeymap = [("S-M-c", kill), ...]
myConfig = def {
...
startupHook = do
return () >> checkKeymap myConfig myKeymap
...other operation you defined here...
...
} `additionalKeysP` myKeymap
- 上例中的
return ()非常重要!否则,您可能会遇到无限相互递归的问题。 return ()引入了足够的惰性以打破死锁:myConfig 的定义依赖于 startupHook 的定义,而 startupHook 又依赖于 myConfig 的定义,依此类推。
为停靠栏/面板/托盘预留空间 (Xmobar, Tint2, Conky 等)
使用 XMonad.Hooks.ManageDocks 中的 avoidStruts 包装您的布局,以实现停靠栏/面板/托盘的自动间距。
import XMonad
import XMonad.Hooks.ManageDocks
main=do
xmonad $ docks def
{ ...
, layoutHook=avoidStruts $ layoutHook def
, manageHook=manageHook def <+> manageDocks
, ...
}
如果您想切换间隙,可以将此操作添加到您的按键绑定中:
,((modMask x, xK_b ), sendMessage ToggleStruts)
为窗口添加标签
通过 XMonad.Actions.TagWindows,用户可以对具有相同标签的窗口进行操作。
xmonad.hs
...
import XMonad.Actions.TagWindows
...
myKeys =
... other key bindings ...
-- Tag
-- , ("M-C-t", withFocused (addTag "abc")) -- add a specific tag "abc"
-- , ("M-C-d", withFocused (delTag "abc")) -- delete the tag "abc" from the focused window
-- , ("M-C-h", withTaggedGlobalP "abc" shiftHere) -- shift windows with tag "abc" here
, ("M-C-a", tagPrompt defaultXPConfig $ withFocused . addTag ) -- prompt for inputs of tag names
, ("M-C-h", tagPrompt defaultXPConfig (`withTaggedGlobalP` shiftHere)) -- shift windows with user defined tags (input) here
, ("M-C-d", tagDelPrompt defaultXPConfig) -- delete a user-defined tag (input)
, ("M-C-t", tagPrompt defaultXPConfig focusUpTaggedGlobal) -- switch between windows in all workspaces with user-defined tags (input)
, ("M-C-f", tagPrompt defaultXPConfig (`withTaggedGlobal` float)) -- float windows with user-defined tags (input)
窗口间等间距的间隙
如果您的目标是在各个窗口和屏幕之间拥有大小相等的间隙,以下代码将无法按预期工作:
layoutHook = spacing 10 $ Tall 1 (3/100) (1/2) ||| Full
这使得每个窗口在每个方向上都有自己的间距。如果您有两个并排的窗口,中间的间距将叠加,从而产生一个比所需大两倍的间隙。
一种变通方法是分别指定屏幕间距和窗口间距,但仅对屏幕使用顶部和左侧边距,对窗口使用底部和右侧边距。为此,请将上述代码修改为:
layoutHook = spacingRaw False (Border 10 0 10 0) True (Border 0 10 0 10) True $ Tall 1 (3/100) (1/2) ||| Full
在 xmonad 中使用 xmobar
xmobar 是一个轻量级的极简文本栏,旨在与 xmonad 配合使用。要在 xmonad 中使用 xmobar,除了 xmonad 软件包外,您还需要两个软件包。这些软件包是 xmonad-contrib 和 xmobar,或者您可以使用 xmobar-gitAUR。
在这里,我们将从 xmonad 内部启动 xmobar,这样每当您重新加载 xmonad 时,它也会重新加载 xmobar。
在您喜欢的编辑器中打开 ~/.xmonad/xmonad.hs,并选择以下两种选项之一:
快速、灵活性较低的方法
通用导入
import XMonad import XMonad.Hooks.DynamicLog
xmobar 操作会启动 xmobar 并返回一个修改后的配置,其中包含 #更高可配置性 中描述的所有选项。
main = xmonad =<< xmobar def { modMask = mod4Mask {- or any other configurations here ... -}}
更高可配置性
从 xmonad(-contrib) 0.9 开始,在 XMonad.Hooks.DynamicLog 中有一个新的 statusBar 函数。它允许您使用自己的配置来设置:
- 用于执行状态栏的命令
- 确定写入栏中内容的 PP(Printer/Pretty-printer)
- 用于切换状态栏间隙的按键绑定
以下是如何使用它的示例:
~/.xmonad/xmonad.hs
-- Imports.
import XMonad
import XMonad.Hooks.DynamicLog
-- The main function.
main = xmonad =<< statusBar myBar myPP toggleStrutsKey myConfig
-- Command to launch the bar.
myBar = "xmobar"
-- Custom PP, configure it as you like. It determines what is being written to the bar.
myPP = xmobarPP { ppCurrent = xmobarColor "#429942" "" . wrap "<" ">" }
-- Key binding to toggle the gap for the bar.
toggleStrutsKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)
-- Main configuration, override the defaults to your liking.
myConfig = def { modMask = mod4Mask }
验证 XMobar 配置
模板和默认的 xmobarrc 包含此内容。
最后,打开 ~/.xmobarrc 并确保模板中有 StdinReader 并运行插件。例如:
~/.xmobarrc
Config { ...
, commands = [ Run StdinReader, .... ]
...
, template = " %StdinReader% ... "
}
现在,您所要做的就是启动或重启 xmonad。
使用外部脚本控制 xmonad
这里有几种方法:
- 使用以下 xmonad 扩展:XMonad.Hooks.ServerMode。
- 使用 xdotool 或类似程序模拟按键事件。请参阅此 Ubuntu 论坛帖子。以下命令将模拟按键
Super+n:
xdotool key Super+n
- wmctrl - 如果您配置了 desktopConfig 或 EwmhDesktops,这是一个非常易于使用且标准的工具。
在 xmonad 中启动另一个窗口管理器
如果您使用的是 xmonad-gitAUR,从 2011 年 1 月起,您可以从 xmonad 内部重启到另一个窗口管理器。您只需要编写一个小脚本,并向您的 ~/.xmonad/xmonad.hs 添加一些内容。这是脚本:
~/bin/obtoxmd
#!/bin/sh openbox xmonad
这是您需要添加到 ~/.xmonad/xmonad.hs 中的修改:
~/.xmonad/xmonad.hs
import XMonad
--You need to add this import
import XMonad.Util.Replace
main do
-- And this "replace"
replace
xmonad $ def
{
--Add the usual here
}
您还需要添加以下按键绑定:
~/xmonad/xmonad.hs
--Add a keybinding as follows: ((modm .|. shiftMask, xK_o ), restart "/home/abijr/bin/obtoxmd" True)
只需记住在之前或之后添加逗号,并将路径更改为您实际的脚本路径。现在只需 Mod+q(重启 xmonad 以刷新配置),然后按下 Mod+Shift+o,您应该就可以运行 Openbox,并且窗口与在 xmonad 中打开的一样。要返回 xmonad,您只需退出 Openbox。这是一个使用此设置的 adamvo 的 ~/.xmonad/xmonad.hs 链接:Adamvo's xmonad.hs
KDE 与 xmonad
xmonad wiki 提供了关于如何在 KDE 中运行 xmonad 的说明。
设置一个全局 KDE 键盘快捷键来启动 xmonad 也是一个好主意,以防它被意外杀死或关闭。
禁用 plasmashell
您可能想要禁用 plasmashell(KDE5 中负责桌面背景、任务栏、托盘等的组件)。
cp /etc/xdg/autostart/plasmashell.desktop ~/.config/autostart/
然后编辑 ~/.config/autostart/plasmashell.desktop 并将 Exec=plasmashell 替换为 Exec=。结果如下所示:
~/.config/autostart/plasmashell.desktop
[Desktop Entry] Exec= Name=Plasma Desktop Workspace ... # more stuff
配置示例
以下是一些来自其他 xmonad 用户的配置示例。欢迎添加您自己的链接。
- brisbin33 :: 简单、有用、易读 :: 配置 截图
- jelly :: 带有提示符、不同布局、双屏 xmobar 的配置 :: xmonad.hs
- MrElendig :: 简单的配置,带有 xmobar :: xmonad.hs, .xmobarrc, 截图。
- thayer :: 极简的鼠标友好型配置,非常适合上网本 :: 配置 截图
- vicfryzel :: 美观且实用的 xmonad 配置,以及 xmobar 配置、xinitrc、dmenu 和其他使 xmonad 更实用的脚本。 :: git 仓库, 截图。
- vogt :: 查看 adamvo 的配置以及官方 Xmonad/Config 存档 中的许多其他配置
- wulax :: 在 Xfce 中使用 xmonad 的示例。 :: xmonad.hs, 截图。
- alex-courtis :: 简洁的 xmonad、xmobar、媒体按键、截图、j4/dmenu;字体根据显示器报告的 DPI 进行渲染 :: xmonad.hs, 截图。
- TobbeBob123 :: TobbeBob123 的配置,可以通过简单的按键绑定 (
Mod4+s) 查看所有按键绑定。如果您想要一个带有主题和图片中所有内容的完整 Xmonad,可以运行名为 TobbeOS 的脚本。 :: TobbeOS。 Xmonad 仓库, 截图。 - AzureOrange :: 使用 stack 构建的 xmonad 分离式配置(间隙、布局、暂存区、窗口管理和窗口吞噬等),带有 xmobar、trayer 和 dmenu。 :: xmonad.hs 截图
故障排除
Xfce 4 与 xmonad
在 ~/.xmonad/xmonad.hs 中导入 XMonad.Config.Xfce 后,使用 xfceConfig 代替 def,例如调整上述最小配置:
import XMonad
import XMonad.Config.Xfce
main = xmonad xfceConfig
{ terminal = "urxvt"
, modMask = mod4Mask
}
还要在 设置 > 会话和启动 > 应用程序自启动 中添加一个运行 xmonad --replace 的条目。
缺少 xmonad-x86_64-linux
xmonad 应该会自动创建 xmonad-X86_64-linux 文件(在 ~/.xmonad/ 中)。如果不是这种情况,请从 xmonad wiki 获取配置文件或创建您自己的。将 .hs 和所有其他文件放入 ~/.xmonad/,然后从该目录运行此命令:
$ xmonad --recompile
现在您应该可以看到该文件了。
Java 应用程序的问题
如果您遇到问题,例如 Java 应用程序窗口无法调整大小,或菜单在点击后立即关闭,请参阅 Java#Gray window, applications not resizing with WM, menus immediately closing。
gvim 或终端底部的空白区域
请参阅 Vim#Empty space at the bottom of gVim windows 获取使该区域匹配背景颜色的解决方案。
您也可以将 xmonad 配置为尊重大小提示(size hints),但这会留下间隙。请参阅 Xmonad.Layout.LayoutHints 的文档。
Chromium/Chrome 无法全屏
如果 Chrome 在按下 F11 时无法全屏,您可以使用 xmonad-contrib 软件包中的 XMonad.Hooks.EwmhDesktops 扩展。只需将 import 语句添加到您的 ~/.xmonad/xmonad.hs 中:
import XMonad.Hooks.EwmhDesktops
然后将 ewmhFullscreen . ewmh 添加到适当的位置;例如:
...
main = xmonad $ ewmhFullscreen . ewmh $ def
...
重新编译/重启 xmonad 后,Chromium 现在应该可以按预期响应 F11(全屏)了。
多点触控 / touchegg
Touchégg 向窗口管理器轮询 _NET_CLIENT_LIST(以便获取它应该监听鼠标事件的窗口列表)。默认情况下,xmonad 不提供此属性。要启用此功能,请使用 xmonad-contrib 软件包中的 XMonad.Hooks.EwmhDesktops 扩展。
azerty 键盘布局的快捷键问题
使用 azerty 键盘布局的用户可能会遇到某些按键绑定的问题。使用 XMonad.Config.Azerty 模块将解决此问题。
GNOME 3 的 mod4+p 更改了显示配置而不是启动 dmenu
如果您不需要在 gnome-control-center 中切换显示设置的功能,只需以您的用户身份执行:
dconf write /org/gnome/settings-daemon/plugins/xrandr/active false
以禁用抢占 Super+p 的 xrandr 插件。
Chrome/Chromium 不显示定义的窗口边框颜色
Chromium 和 Chrome 浏览器窗口默认不会具有定义的边框颜色,而是显示为模糊的透明边框。这个问题已经存在很长一段时间了,但很容易修复。在浏览器选项中激活 `Use system title bar and borders` 应该能立即解决它。
VirtualBox 中焦点边框的问题
Virtualbox 的一个已知问题(Ticket #6479)可能导致焦点窗口边框出现问题。一个解决方案是安装一个合成管理器(compositing manager),如 xcompmgr,它可以覆盖 vboxvideo 的错误行为。
Steam 游戏 (Half-Life, Left 4 Dead 等) 与 xmonad
xmonad 与像 Half-Life 这样的 Source 引擎游戏似乎存在一些问题。如果它们无法启动或卡在黑屏上,一种变通方法是以窗口模式启动它们。为此,在 Steam 库中右键单击游戏并选择属性,点击启动选项并输入 [3]
-windowed
另一种解决方案是使用 manage hook 将游戏窗口设为浮动。例如,以下行可用于 Half-Life:
className =? "hl_linux" --> doFloat
这也可以通过让 xmonad 注意 EWMH 提示并包含其全屏钩子来解决 [4]
main = xmonad $ ewmh def{ handleEventHook =
handleEventHook def <+> fullscreenEventHook }
这还有一些其他影响,使它的行为更像其他窗口管理器中的全屏应用程序。
LibreOffice - 焦点在主窗口和对话框之间闪烁
LibreOffice UI 在桌面环境之外默认使用 gtk 引擎。这可能会导致某些 xmonad 配置出现问题,导致焦点在 LibreOffice 主窗口和任何打开的 LibreOffice 对话框窗口之间快速闪烁,从而有效地锁定应用程序。在这种情况下,可以设置环境变量 SAL_USE_VCLPLUGIN 以显式强制 LibreOffice 使用其他 UI 主题,如 LibreOffice#Theme 中所述。例如:
$ export SAL_USE_VCLPLUGIN=gen lowriter
以使用常规 (QT) UI。
IntelliJ IDEA 与 xmonad
对话框窗口
IntelliJ IDEA 已经获得了对平铺窗口管理器更好的支持。但仍然存在一些令人烦恼的问题,其中一些有简单的解决方案。
- 如果鼠标指针移动到对话框窗口边界之外,在文件中查找 (Find In Files) 对话框窗口会立即关闭。这种情况仅发生在 在文件中查找 对话框窗口中,并且在 导航到… (Navigate to…) 对话框中无法复现。在文件中查找 的行为是预期的,假设 xmonad 使用默认的“焦点跟随鼠标 (focus follows mouse)”逻辑。在文件中查找 窗口在所有系统上失去焦点时都会关闭。
- 解决方案:您可以通过“固定 (pinning)”弹出窗口来更改它——右上角有一个对应的按钮 [5]。
- 当查看 Git 提交之间的更改文件时(使用 Changes Between aaaa and local version bbbb 对话框),带有文件级差异的窗口会在对话框窗口后面打开。
- 解决方案:未知
更新后无法找到共享库的问题
xmonad 可执行文件位于 ~/.xmonad/ 中。升级 xmonad 后,旧的可执行文件可能会保留,在这种情况下需要将其删除,以便 xmonad 编译新的可执行文件。或者使用 xmonad --recompile。
可以通过将如下的 pacman 钩子添加到 /etc/pacman.d/hooks/xmonad.hook(您可能需要先创建 hooks 目录)来自动化重新编译:
[Trigger] Operation = Upgrade Type = Package Target = xmonad [Action] Description = Recompiling xmonad... When = PostTransaction Exec = /usr/bin/sudo -u YOUR_USERNAME /usr/bin/xmonad --recompile
其中 YOUR_USERNAME 是您运行 xmonad 的用户名。
如果 xmonad --recompile 根本找不到任何模块(包括 XMonad 本身),请尝试重新生成软件包数据库缓存:
# ghc-pkg recache
损坏/缺失的 XMonad.Prompt 和窗口装饰
XMonad 默认使用字体 -misc-fixed-*-*-*-*-10-*-*-*-*-*-*-* [6]。如果缺少此字体,这些窗口将根本无法渲染。最简单的修复方法是安装 xorg-fonts-misc。
参见
- xmonad - xmonad 官方网站
- xmonad.hs - 模板 xmonad.hs
- xmonad: a guided tour (xmonad 导览)
- dzen - 通用消息和通知程序
- dmenu - 用于快速启动程序的动态 X 菜单
- Comparison of tiling window managers (平铺窗口管理器比较) - Arch wiki 文章,概述了主流平铺窗口管理器
- 分享您的 xmonad 桌面!
- xmonad hacking 线程
- xmonad-log-applet - 适用于 GNOME、MATE 或 Xfce 面板的小程序。