4

Я ищу способ упорядочить все открытые окна приложений на заданном экране. Я хотел бы "каскадировать" их так, чтобы часть каждого окна была видимой, и при щелчке по любому из них я могу легко вернуться к другому окну, что означает, что ни одно окно никогда не теряется за другим.

Вот идея:

Это включает в себя как изменение положения каждого окна по осям X и Y экрана, так и изменение размера каждого окна. быть одинакового размера.

  • Есть ли способ сделать это изначально в Mac OS?
  • Есть ли приложения, которые могут достичь этой функциональности?

Обновить:

Попробовал решение Hammerspoon и получил ошибку ниже. Он переместил все мои окна с внешнего монитора на MacBook, и это не каскадно.

3 ответа3

4

Я не знаю ни одного способа сделать это изначально, кроме управления полетами.

Hammerspoon - это инструмент автоматизации низкого уровня, который отлично подходит для такого рода вещей, хотя и немного неуклюже. Он предоставляет множество операций на уровне операционной системы скриптовому движку 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» и нажмите «Arrange in Front». Это будет делать именно то, что вы хотите, каскадируя все окна, как показано на диаграмме.

Сортирует их в алфавитном порядке.

1

Я просто искал то же самое и придумал собственное решение 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .