開いているすべてのアプリウィンドウを特定の画面に配置する方法を探しています。各ウィンドウの一部が表示されるように「カスケード」したいと思います。いずれかのウィンドウをクリックすると、別のウィンドウに簡単に戻ることができます。つまり、あるウィンドウが別のウィンドウの後ろで失われることはありません。
アイデアは次のとおりです。
これには、画面のX軸とY軸上の各ウィンドウの再配置と、各ウィンドウのサイズ変更の両方が含まれます。同じサイズになります。
更新:
Hammerspoonソリューションを試したところ、以下のエラーが発生しました。それは私のすべてのウィンドウを外部モニターからMacBookに移動しました、そしてそれは実際にはカスケードしませんでした。
ミッションコントロールを除いて、これをネイティブに行う方法はわかりません。
Hammerspoon は低レベルの自動化ツールで、少し不器用な場合でも、この種の作業に最適です。これは、ウィンドウの配置など、多くのOSレベルの操作を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のように新しいツールの学習に関与したくない場合は、上記の手順に従って、あなたが望むものへのキーバインディング。
[ウィンドウ]メニューから、[オプション]を押しながら、[前面に配置]をクリックします。これにより、図に示すようにすべてのウィンドウがカスケードされ、必要な処理が正確に実行されます。
それらをアルファベット順にソートします。
私は自分で同じものを探していて、自分の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