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 编写的,非程序员可能难以调整设置。 有关详细的 HOWTO 和示例配置,请参考以下资源
- xmonad wiki
- xmonad 配置存档
- xmonad FAQ
- Arch Linux 论坛帖子
最好的方法是将您的更改和自定义项仅放在 ~/.xmonad/xmonad.hs
中,并将其编写为从内置的 def 函数中获取任何未设置的参数。
这可以通过编写如下的 xmonad.hs
来实现
import XMonad main = xmonad def { terminal = "urxvt" , modMask = mod4Mask , borderWidth = 3 }
这只是覆盖了默认终端和 borderWidth,同时将所有其他设置保留为默认值(从 XConfig 值 def 继承)。
随着事情变得越来越复杂,可以通过函数名在 main 函数内部调用配置选项,并将这些选项分别定义在 ~/.xmonad/xmonad.hs
的各自部分中,这将非常方便。 这使得像布局和管理 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
此外,顶层(main、myTerminal、myModMask 等)或 {} 内的顺序在 Haskell 中无关紧要,只要 imports 放在最前面即可。
以下内容摘自 0.9 配置文件模板。 它是您可能希望在其 main 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.hs
,它随 xmonad Haskell 模块一起提供,作为如何覆盖所有内容的示例。 这不应该用作模板配置,而是作为您可以选择在自己的配置中使用的部分的示例。 它位于 /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
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,用户可以使用类似 KDE 的屏幕角与 XMonad。
使用 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 的定义,依此类推。
为 docks/panels/trays 留出空间 (Xmobar, Tint2, Conky, 等)
用 XMonad.Hooks.ManageDocks 中的 avoidStruts 包装您的布局,以实现自动 dock/panel/trayer 间距
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
将 xmobar 与 xmonad 一起使用
xmobar 是一个轻量级且极简的基于文本的状态栏,设计用于与 xmonad 协同工作。 要将 xmobar 与 xmonad 一起使用,除了 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 开始,在 statusBar 函数中有一个新的 XMonad.Hooks.DynamicLog 函数。 它允许您使用自己的配置来
- 用于执行状态栏的命令
- 确定写入状态栏内容的 PP
- 用于切换状态栏间隙的按键绑定
以下是如何使用它的示例
~/.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 意外终止或关闭时启动 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
Skype 的 IM 布局
为了为较新版本的 skype 创建 IM 布局,可以使用以下代码
xmonad.hs
myIMLayout = withIM (1%7) skype Grid where skype = And (ClassName "Skype") (Role "")
示例配置
以下是一些来自 xmonad 用户的示例配置。 欢迎添加您自己的链接。
- brisbin33 :: 简单、有用、可读 :: 配置 屏幕截图
- jelly :: 带有提示符、不同布局、带 xmobar 的 twinview 的配置 :: xmonad.hs
- MrElendig :: 简单配置,带有 xmobar :: xmonad.hs, .xmobarrc, 屏幕截图。
- thayer :: 最小化的鼠标友好型配置,非常适合上网本 :: 配置 屏幕截图
- vicfryzel :: 美观且可用的 xmonad 配置,以及 xmobar 配置、xinitrc、dmenu 和其他使 xmonad 更易用的脚本。 :: git 仓库, 屏幕截图。
- vogt :: 在官方 Xmonad/Config archive 中查看 adamvo 的配置和许多其他配置
- 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#灰色窗口、应用程序无法随 WM 调整大小、菜单立即关闭。
gvim 或终端底部有空白
请参阅 Vim#gVim 窗口底部有空白 以获得使该区域与背景颜色匹配的解决方案。
您还可以配置 xmonad 以尊重尺寸提示,但这会留下间隙。 请参阅 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-control-center 中切换显示设置的功能,只需执行
dconf write /org/gnome/settings-daemon/plugins/xrandr/active false
作为您的用户,禁用抓取 Super+p
的 xrandr 插件。
Chrome/Chromium 不显示定义的窗口边框颜色
默认情况下,Chromium 和 Chrome 浏览器窗口不会具有定义的边框颜色,而是模糊的透明边框。 这个问题已经存在很长时间,但很容易修复。 在浏览器选项中激活“使用系统标题栏和边框”应立即修复它。
VirtualBox 中聚焦边框的问题
Virtualbox 的已知问题(Ticket #6479)可能会导致聚焦窗口边框出现问题。 通过安装像 xcompmgr 这样的合成管理器可以找到解决方案,它可以覆盖 vboxvideo 的不正确行为。
Steam 游戏(Half-Life、Left 4 Dead,…)和 xmonad
xmonad 和基于 Source 引擎的游戏(如 Half-Life)似乎存在一些问题。 如果它们无法启动或卡在黑屏上,一种解决方法是在窗口模式下启动它们。 为此,右键单击 Steam 库中的游戏并选择属性,单击启动选项并输入 [3]
-windowed
另一种解决方案是使用 manage hook 浮动游戏窗口。 例如,以下行可用于 Half-Life
className =? "hl_linux" --> doFloat
这也可以通过使 xmonad 注意 EWMH 提示并包含其全屏 hook 来解决 [4]
main = xmonad $ ewmh def{ handleEventHook = handleEventHook def <+> fullscreenEventHook }
这还有一些其他影响,并使其行为更类似于其他 WM 中的全屏应用程序。
LibreOffice - 主窗口和对话框之间的焦点闪烁
LibreOffice UI 默认使用桌面环境之外的 gtk 引擎。 这可能会导致某些 xmonad 配置出现问题,从而导致焦点在 LibreOffice 主窗口和任何打开的 LibreOffice 对话框窗口之间快速闪烁。 有效地锁定应用程序。 在这种情况下,可以设置 环境变量 SAL_USE_VCLPLUGIN
以显式强制 LibreOffice 使用另一个 UI 主题,如 LibreOffice#主题 中所述。 例如
$ export SAL_USE_VCLPLUGIN=gen lowriter
使用通用 (QT) UI。
IntelliJ IDEA 和 xmonad
对话框窗口
IntelliJ IDEA 对平铺窗口管理器提供了更好的支持。但仍然存在一些恼人的问题,其中一些问题有简单的解决方案。
- 如果鼠标指针移出Find In Files对话框窗口边界,该窗口会立即关闭。这种情况仅在Find In Files对话框窗口中发生,在Navigate to…对话框中不会重现。Find In Files的行为是预期的,假设 xmonad 的默认 “焦点跟随鼠标” 逻辑。当 Find In Files 窗口在所有系统中失去焦点时,它都会关闭。
- 解决方案:您可以通过“固定”弹出窗口来更改此行为——在右上角有一个相应的按钮 [5]。
- 当查看 Git 提交之间更改的文件时(使用Changes Between aaaa and local version bbbb对话框),包含文件级别差异的窗口会在对话框窗口之后打开。
- 解决方案:未知
xmonad 可执行文件位于 ~/.xmonad/
中。升级 xmonad 后,旧的可执行文件可能仍然存在,在这种情况下需要将其删除,xmonad 才能编译新的可执行文件。或者使用 xmonad --recompile
。
可以通过将如下 pacman hook 添加到 /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:引导式游览
- dzen - 通用消息和通知程序
- dmenu - 用于快速启动程序的动态 X 菜单
- 平铺窗口管理器比较 - Arch wiki 文章,概述了主流平铺窗口管理器
- 分享您的 xmonad 桌面!
- xmonad 黑客讨论帖
- xmonad-log-applet - 用于 GNOME、MATE 或 Xfce 面板的小程序。