层叠所有打开的应用窗口

层叠所有打开的应用窗口

我正在寻找一种方法来在给定的屏幕上排列所有打开的应用程序窗口。我想“层叠”它们,以便每个窗口的一部分都可见,并且当单击其中任何一个窗口时,我可以轻松单击返回到另一个窗口,这意味着任何一个窗口都不会丢失在另一个窗口后面。

想法如下:

在此处输入图片描述

这涉及在屏幕的 X 和 Y 轴上重新定位每个窗口以及调整每个窗口的大小。使其具有相同的大小。

  • 有没有办法在 Mac OS 中本地执行此操作?
  • 有没有什么应用程序可以实现这个功能?

更新:

尝试了 Hammerspoon 解决方案,但出现以下错误。它确实将我的所有窗口从外接显示器移到了 MacBook,但并没有真正级联。

在此处输入图片描述

答案1

除了任务控制之外,我不知道还有什么方法可以在本地执行此操作。

锤子勺是一个低级自动化工具,虽然有点笨拙,但非常适合这类事情。它将许多操作系统级别的操作暴露给 Lua 脚本引擎,包括窗口定位等。

要在 Hammerspoon 中实现此功能,您可以执行以下操作:

function cascadeWindows()
    local windows = hs.window.allWindows()
    local screen = windows[1]:screen():frame()

    local xMargin, yMargin = screen.w/5, screen.h/5  -- This is equal to the gap between the edge of the topleft window and the edge of the screen.
    local layout = {}
    for i, win in ipairs(windows) do
        local winPos = {
            win:application(),
            win:title(),
            win:screen(),
            nil, hs.geometry.rect(
            (i-1)*(xMargin/(#windows-1)), -- x
            (i-1)*(yMargin/(#windows-1)), -- y, you might end up having to add some number here
            screen.w - xMargin,           -- w
            screen.h - yMargin            -- h
            ), nil
        }
        layout[#layout+1] = winPos
    end
    hs.layout.apply(layout)
end
hs.hotkey.bind({'cmd','alt','ctrl'}, 'space', cascadeWindows)

此代码已进行过粗略测试,但应该可以作为起点。要安装,请先安装 Hammerspoon,然后将此代码放入您的~/.hammerspoon/init.lua文件中。您可以在以下文档中找到有关此处具体发生情况的更多信息hs.layout.apply,并且更普遍地出现在 Hammerspoon 纪录片中。

如果您不了解 Lua 并且不想学习 Lua(它快速又简单!),或者不想深入学习像 Hammerspoon 这样新工具,那么您可以按照上述说明将键绑定更改为您想要的任何内容。

答案2

有一个本机解决方案,它不需要任何第三方工具或运行任何脚本。

在窗口菜单中,按住 Option 并单击排列在前面。这将完全按照您的要求执行操作,将所有窗口层叠起来,如图表所示。它会按字母顺序对它们进行排序。

请注意,如果窗口与屏幕大小相同,此方法似乎不起作用。请先调整几个窗口的大小来尝试。

答案3

我自己也在寻找同样的东西并想出了自己的 Hammerspoon 解决方案:

hs.hotkey.bind({'cmd','alt','ctrl'}, ',', function()
    local windows = hs.window.orderedWindows()
    local screen = windows[1]:screen():frame()
    local nOfSpaces = #windows > 1 and #windows - 1 or 1

    local xMargin = screen.w / 10 -- unused horizontal margin
    local yMargin = 20            -- unused vertical margin
    local spacing = 40            -- the visible margin for each window

    for i, win in ipairs(windows) do
        local offset = (i - 1) * spacing
        local rect = {
            x = xMargin + offset,
            y = screen.y + yMargin + offset,
            w = screen.w - (2 * xMargin) - (nOfSpaces * spacing),
            h = screen.h - (2 * yMargin) - (nOfSpaces * spacing),
        }
        win:setFrame(rect)
    end
end)

到目前为止,我对它非常满意。您可能还对我的其余 Hammerspoon 配置感兴趣:https://github.com/dbmrq/dotfiles/tree/master/home/.hammerspoon

相关内容