You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XMonad中实现同一快捷键切换创建/关闭居中浮动终端窗口

在XMonad中实现“创建/关闭中心浮动终端”的快捷键方案

你可以通过自定义窗口属性标记+查找匹配窗口的方式实现需求,这也是最可靠的方案,避免误操作其他终端窗口。以下是具体实现:

实现步骤

1. 导入必要模块

确保你的XMonad配置文件中导入这些依赖模块:

import XMonad.Util.WindowProperties (findWindow, Property(..))
import XMonad.Util.Run (spawnAndDo)
import Data.List (intercalate)
import XMonad (X, gets, windowset, killWindow)
import XMonad.StackSet (screenRect, screenDetail, current, RationalRect(..), Rectangle(..))
import Graphics.X11.Xlib.Extras (setTextProperty)

2. 修改runInCenterTerm函数

更新原函数,添加“先查后动”的逻辑:存在标记窗口则关闭,否则创建并标记:

runInCenterTerm :: String -> String -> X ()
runInCenterTerm t cmd = do
  -- 查找带有自定义标记的中心终端窗口
  mTargetWin <- findWindow (Property "CENTER_TERM" "1")
  case mTargetWin of
    Just win -> killWindow win  -- 存在则关闭目标窗口
    Nothing -> do               -- 不存在则创建新终端并标记
      screenRect <- fmap (screenRect . screenDetail . current) (gets windowset)
      spawnAndDo (\newWin -> do
                    doRectFloat (adjustRect screenRect) newWin
                    -- 给新窗口添加自定义属性标记
                    setTextProperty newWin "1" "CENTER_TERM")
                 $ intercalate " " [t, cmd]
  where
    adjustRect (Rectangle sx sy sw sh) = RationalRect x y w h
      where
        w = min (1200 / fromIntegral sw) 1
        h = min (600 / fromIntegral sh) 1
        x = (1 - w) / 2
        y = (1 - h) / 2

逻辑说明

  • 自定义属性标记:通过setTextProperty给新创建的浮动终端添加CENTER_TERM=1的X窗口属性,作为唯一识别标记,避免和其他终端混淆。
  • 窗口查找:每次触发快捷键时,先用findWindow查找带有该标记的窗口,确保只操作我们创建的中心浮动终端。
  • 分支处理:找到窗口则调用killWindow关闭;没找到则执行原有的创建逻辑,同时给新窗口打上标记。

内容的提问来源于stack exchange,提问作者Roberto Huelga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:45:32