使用hammerspoon和空间模块将窗口移动到新空间

问题描述 投票:0回答:3

我已经从 https://github.com/asmagill/hs._asm.undocumented.spaces 安装了“无证空间”模块。特别是,它提供了一个方法

moveWindowToSpace
,我尝试使用该方法来绑定
cmd+1
,以使用以下方法将当前窗口移动到空间 1:

local spaces = require("hs._asm.undocumented.spaces")
function MoveWindowToSpace(sp)
    local spaceID = spaces.query()[sp]
    spaces.moveWindowToSpace(hs.window.focusedWindow():id(), spaceID)
    spaces.changeToSpace(spaceID)
end
hs.hotkey.bind({"cmd"}, "1",function() MoveWindowToSpace(1) end)

这在某种意义上是有效的,它将窗口移动到一个新的空间,但是,这些空间似乎是伪随机顺序的。

有人知道如何将

spaceID
返回的
spaces.query()
正确映射到实际空间吗?

macos hammerspoon
3个回答
5
投票

由于未记录的空格已移至spaces,新代码如下(某些行可以合并,但我喜欢拆分操作的清晰度):

spaces = require("hs.spaces")
-- move current window to the space sp
function MoveWindowToSpace(sp)
  local win = hs.window.focusedWindow()      -- current window
  local cur_screen = hs.screen.mainScreen()
  local cur_screen_id = cur_screen:getUUID()
  local all_spaces=spaces.allSpaces()
  local spaceID = all_spaces[cur_screen_id][sp]
  spaces.moveWindowToSpace(win:id(), spaceID)
  spaces.gotoSpace(spaceID)              -- follow window to new space
end
hs.hotkey.bind(hyper, '1', function() MoveWindowToSpace(1) end)
hs.hotkey.bind(hyper, '2', function() MoveWindowToSpace(2) end)
hs.hotkey.bind(hyper, '3', function() MoveWindowToSpace(3) end)

4
投票

经过空间模块作者的一些提示后,我想出了以下方法,这似乎可以解决问题。

local spaces = require("hs._asm.undocumented.spaces")
-- move current window to the space sp
function MoveWindowToSpace(sp)
    local win = hs.window.focusedWindow()       -- current window
    local uuid = win:screen():spacesUUID()      -- uuid for current screen
    local spaceID = spaces.layout()[uuid][sp]   -- internal index for sp
    spaces.moveWindowToSpace(win:id(), spaceID) -- move window to new space
    spaces.changeToSpace(spaceID)               -- follow window to new space
end
hs.hotkey.bind(hyper, '1', function() MoveWindowToSpace(1) end)

之前我在 https://github.com/Hammerspoon/hammerspoon/issues/235 使用了代码的变体,它连接到 osx 定义的热键来切换空间,但上面的代码要快得多!


1
投票

对于那些在 2020 年寻找更简单的工作解决方案的人,您可以使用苹果脚本:

function moveWindowOneSpace(direction)
    local keyCode = direction == "left" and 123 or 124

    return hs.osascript.applescript([[
        tell application "System Events" 
            keystroke (key code ]] .. keyCode .. [[ using control down)
        end tell
    ]])
end

我尝试使用此问题中的解决方案,但没有成功。另一方面,苹果脚本很有魅力。

© www.soinside.com 2019 - 2024. All rights reserved.