跳转至内容

xmonad

来自 ArchWiki

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 大量配置转储,缺少 hc 模板 (在 Talk:Xmonad 中讨论)

xmonad 是一个用于 X 的平铺 窗口管理器。窗口被自动排列以平铺屏幕,无间隙或重叠,最大限度地利用屏幕空间。窗口管理器功能可通过键盘访问:鼠标是可选的。

xmonad 使用 Haskell 编写、配置和扩展。自定义布局算法、键位绑定和其他扩展可以由用户在配置文件中编写。

布局动态应用,并且每个工作区可以使用不同的布局。完全支持 Xinerama,允许窗口在多个物理屏幕上平铺。

安装

安装提供了一个非常基础配置的 xmonad 包,最好也安装 xmonad-contrib 以获得更有用的桌面配置以及额外的平铺算法、配置、脚本等。

或者,安装开发版本 xmonad-gitAUR,它有一些额外的依赖;同样地,安装 xmonad-contrib-gitAUR

注意 升级 xmonad 后,请记住运行 xmonad --recompile,否则下次启动时可能会遇到查找共享库的问题。要自动化此过程,请参阅 #Problems with finding shared libraries after update

启动

使用 xinit 运行 xmonad

或者,在您选择的 显示管理器 的会话菜单中选择 Xmonad

确保您已安装 Xterm 包,或者已在配置中更改了终端模拟器。否则,您将无法在 xmonad 中执行任何操作。

注意 默认情况下,xmonad 不设置 X 光标,因此通常显示“十字”光标。要设置预期的左指针,请参阅 Cursor themes#Change X shaped default cursor

配置

创建 ~/.xmonad 目录和 ~/.xmonad/xmonad.hs 文件,并按如下方式进行编辑。

在对 ~/.xmonad/xmonad.hs 进行更改后,使用 Mod+q 快捷键重新编译以使其生效。

提示 xmonad 的默认配置非常可用,只需完全不运行 xmonad.hs 即可实现。

由于 xmonad 配置文件是用 Haskell 编写的,非程序员可能会在调整设置时遇到困难。有关详细的 HOWTO 和示例配置,我们参考以下资源:

最佳方法是仅将您的更改和自定义放在 ~/.xmonad/xmonad.hs 中,并这样编写,以便任何未设置的参数都从内置的 def 函数中获取。

这可以通过编写一个如下的 xmonad.hs 来实现

import XMonad

main = xmonad def
    { terminal    = "urxvt"
    , modMask     = mod4Mask
    , borderWidth = 3
    }

这仅仅是覆盖了默认的终端和边框宽度,而将所有其他设置保留为默认值(从 XConfig 值 def 继承)。

随着事情变得越来越复杂,将配置选项按函数名在 main 函数中调用可能会很有用,并在 ~/.xmonad/xmonad.hs 的各自部分单独定义它们。这使得布局和管理钩子等大型自定义更易于可视化和维护。

上面的简单 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 块中定义的 most common functions 的一个示例。

{
  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。默认情况下,ModAlt 键。要每次都确认退出,

xmonad.hs
...
import XMonad.Prompt.ConfirmPrompt
...

myKeys :: [(String, X ())]
myKeys = 
    ...
    ("M-S-q", confirmPrompt defaultXPConfig "exit" $ io exitSuccess)
    ...

技巧与提示

X-Selection-Paste

通过键盘快捷键 X-Selection-Paste 可以进一步支持 xmonad 的以键盘为中心的操作。

此外,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]
  • 这些错误在实践中通常非常罕见,但仍然存在。
提示 要了解更多信息,请参阅 [2]

键盘快捷键

默认键盘快捷键在 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 的定义,依此类推。

为 dock/panel/tray (Xmobar, Tint2, Conky, etc) 腾出空间

将您的布局包装在 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 的候选。

注意: 请利用提供的单独文章 (在 Talk:Xmonad 中讨论)

xmobar 是一个轻量级、极简的文本式面板,专为与 xmonad 配合使用而设计。要将 xmobar 与 xmonad 一起使用,除了 xmonad 包外,您还需要两个包。这些包是 xmonad-contribxmobar,或者您可以使用 xmobar-gitAUR

在这里,我们将从 xmonad 内部启动 xmobar,它会在您重新加载 xmonad 时重新加载 xmobar。

在您喜欢的编辑器中打开 ~/.xmonad/xmonad.hs,然后选择以下两个选项之一

快速,不够灵活

注意 还有一个 dzen2,您可以在这两种情况下将其替换为 xmobar

通用导入

import XMonad
import XMonad.Hooks.DynamicLog

xmobar 操作会启动 xmobar 并返回一个修改后的配置,其中包含 #More configurable 中描述的所有选项。

main = xmonad =<< xmobar def { modMask = mod4Mask {- or any other configurations here ... -}}

更具可配置性

从 xmonad(-contrib) 0.9 开始,在 XMonad.Hooks.DynamicLog 中有一个新的 statusBar 函数。它允许您使用自己的配置来

  • 执行面板的命令
  • 决定写入面板内容的 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

这里有几种方法,

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
    }

此外,在 Settings > Session and Startup > Application Autostart 中添加一个条目,运行 xmonad --replace

缺少 xmonad-x86_64-linux

xmonad 应该会自动创建 xmonad-X86_64-linux 文件 (在 ~/.xmonad/ 中)。如果不是这样,请从 xmonad wiki 获取一个配置文件,或创建您 自己的。将 .hs 文件和所有其他文件放在 ~/.xmonad/ 中,并从该目录运行此命令

$ xmonad --recompile

现在您应该能看到该文件。

注意 您收到“缺少 xmonad-x86_64-linux”错误消息的一个可能原因是 xmonad-contrib 未安装。

Java 应用程序的问题

如果您遇到问题,例如 Java 应用程序窗口无法调整大小,或菜单在点击后立即关闭,请参阅 Java#Gray window, applications not resizing with WM, menus immediately closing

gvim 或终端底部出现空白

请参阅 Vim#Empty space at the bottom of gVim windows 获取一个使区域与背景色匹配的解决方案。

您也可以配置 xmonad 来尊重大小提示,但这会留下一个间隙。请参阅 Xmonad.Layout.LayoutHints 的文档

Chromium/Chrome 无法全屏

如果按下 F11 时 Chrome 无法全屏,您可以使用 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) 可能导致焦点窗口边框出现问题。通过安装像 xcompmgr 这样的合成管理器可以找到解决方案,它会覆盖 vboxvideo 的错误行为。

Steam 游戏 (Half-Life, Left 4 Dead, …) 和 xmonad

xmonad 和基于 Source 引擎的游戏 (如 Half-Life) 似乎存在一些问题。如果它们无法启动或卡在黑屏,一种变通方法是在窗口模式下启动它们。要做到这一点,右键单击 Steam 库中的游戏,选择属性,点击启动选项,然后输入 [3]

-windowed

另一种解决方案是使用管理钩子来浮动游戏窗口。例如,以下行可用于 Half-Life

 className =? "hl_linux" --> doFloat

通过让 xmonad 注意 EWMH 提示并包含其全屏钩子 [4] 也可以解决这个问题。

  main = xmonad $ ewmh def{ handleEventHook =
           handleEventHook def <+> fullscreenEventHook }

这还有其他一些效果,并使其更类似于其他 WM 中的全屏应用程序。

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 对平铺窗口管理器提供了更好的支持。但仍然存在一些令人讨厌的问题,其中一些有简单的解决方案。

  • 在文件中查找 对话框窗口在鼠标指针移出对话框窗口边界后立即关闭。这仅发生在 在文件中查找 对话框窗口中,并且无法使用 导航至… 对话框重现。在文件中查找 的行为是预期的,假设 xmonad 的默认“焦点跟随鼠标”逻辑。在文件中查找 窗口会在失去焦点时关闭,这在所有系统上都一样。
解决方案:您可以通过“固定”弹出窗口来更改它 — 在右上角有一个相应的按钮 [5]
  • 查看 Git 提交之间的更改文件时 (使用 aaaa 和本地版本 bbbb 之间的更改 对话框),带有文件级别差异的窗口会打开在对话框窗口的后面。
解决方案:未知

更新后查找共享库的问题

xmonad 可执行文件位于 ~/.xmonad/。升级 xmonad 后,旧的可执行文件可能会保留,在这种情况下需要将其删除,xmonad 才能编译新的可执行文件。或者使用 xmonad --recompile

可以通过向 /etc/pacman.d/hooks/xmonad.hook 添加如下 pacman 钩子来自动化重新编译 (您可能需要先创建 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

参见