-
-
Save programus/d3bf9c6b8f9b7648891d1f59b665b35e to your computer and use it in GitHub Desktop.
window: | |
# Window dimensions (changes require restart) | |
# | |
# Number of lines/columns (not pixels) in the terminal. The number of columns | |
# must be at least `2`, while using a value of `0` for columns and lines will | |
# fall back to the window manager's recommended size. | |
dimensions: | |
columns: 500 | |
lines: 30 | |
# Window position (changes require restart) | |
# | |
# Specified in number of pixels. | |
# If the position is not set, the window manager will handle the placement. | |
position: | |
x: 0 | |
y: 0 | |
# Window padding (changes require restart) | |
# | |
# Blank space added around the window in pixels. This padding is scaled | |
# by DPI and the specified value is always added at both opposing sides. | |
#padding: | |
# x: 0 | |
# y: 0 | |
# Spread additional padding evenly around the terminal content. | |
#dynamic_padding: false | |
# Window decorations | |
# | |
# Values for `decorations`: | |
# - full: Borders and title bar | |
# - none: Neither borders nor title bar | |
# | |
# Values for `decorations` (macOS only): | |
# - transparent: Title bar, transparent background and title bar buttons | |
# - buttonless: Title bar, transparent background and no title bar buttons | |
decorations: none | |
key_bindings: | |
- { key: Return, mods: Command, action: ToggleSimpleFullscreen } |
local spaces = require('hs._asm.undocumented.spaces') -- https://github.com/asmagill/hs._asm.undocumented.spaces | |
-- Switch alacritty | |
hs.hotkey.bind({'alt'}, 'space', function () | |
local APP_NAME = 'Alacritty' | |
function moveWindow(alacritty, space, mainScreen) | |
-- move to main space | |
local win = nil | |
while win == nil do | |
win = alacritty:mainWindow() | |
end | |
print(win) | |
print(space) | |
print(win:screen()) | |
print(mainScreen) | |
local fullScreen = not win:isStandard() | |
if fullScreen then | |
hs.eventtap.keyStroke('cmd', 'return', 0, alacritty) | |
end | |
winFrame = win:frame() | |
scrFrame = mainScreen:fullFrame() | |
print(winFrame) | |
print(scrFrame) | |
winFrame.w = scrFrame.w | |
winFrame.y = scrFrame.y | |
winFrame.x = scrFrame.x | |
print(winFrame) | |
win:setFrame(winFrame, 0) | |
print(win:frame()) | |
win:spacesMoveTo(space) | |
if fullScreen then | |
hs.eventtap.keyStroke('cmd', 'return', 0, alacritty) | |
end | |
win:focus() | |
end | |
local alacritty = hs.application.get(APP_NAME) | |
if alacritty ~= nil and alacritty:isFrontmost() then | |
alacritty:hide() | |
else | |
local space = spaces.activeSpace() | |
local mainScreen = hs.screen.find(spaces.mainScreenUUID()) | |
if alacritty == nil and hs.application.launchOrFocus(APP_NAME) then | |
local appWatcher = nil | |
print('create app watcher') | |
appWatcher = hs.application.watcher.new(function(name, event, app) | |
print(name) | |
print(event) | |
if event == hs.application.watcher.launched and name == APP_NAME then | |
app:hide() | |
moveWindow(app, space, mainScreen) | |
appWatcher:stop() | |
end | |
end) | |
print('start watcher') | |
appWatcher:start() | |
end | |
if alacritty ~= nil then | |
moveWindow(alacritty, space, mainScreen) | |
end | |
end | |
end) |
Any idea how to make alacritty always show up on the primary screen in a multimonitor setup? It seems that
spaces.activeSpace()
returns the currently focused space and not the primary one (contrary to what the documents say it should return). Basically I always want my term to show up on my external monitor. Thanks!
@Tylerc230 My first hacky suggestion would be something like:
- Find the UUID of your laptop display (
print("mainScreen:", spaces.mainScreenUUID())
when opening terminal on that screen should output the uuid in the Hammerspoon console) - Find all screenUUIDs (
spaces.layout()
or similar) - If connected to external-display, show terminal on any UUID not equal to your laptop screen uuid
- If no connected external display show on laptop display
Good luck and give me a shout if you can't get it working, my lua skills are weak, but I can try to help if you get stuck 😀
Here's what I came up with (thanks for the help!):
local function visiblePrimarySpace()
local primaryScreen = hs.screen.primaryScreen()
local primaryScreenSpaces = spaces.layout()[primaryScreen:getUUID()]
local visibleSpaces = spaces.query(spaces.masks.currentSpaces)
for _, ps in pairs(primaryScreenSpaces) do
for _, vs in pairs(visibleSpaces) do
if ps == vs then
return ps
end
end
end
end
Cool, looks good 👍
Great configuration thanks!
I have one issue though, but i don't know how to fix it.
When have a full-screen app open and press the hotkey, it opens over the full-screen app as expected but immidiately takes me to the desktop (while alacritty is still over that full-screen app).
Any suggestions on fixing this?
Now hammerspoon replaces "https://github.com/asmagill/hs._asm.undocumented.spaces" to "https://github.com/asmagill/hs._asm.spaces", Could we add a new script?
Thanks
I have rewrite this script to use latest hs.spaces
module, and replace get app_name
to get bundle id
to avoid mismatching with browser title and I works fine with hammerspoon Version 0.9.100(6815):
check my fork for details: https://gist.github.com/truebit/31396bb2f48c75285d724c9e9e037bcd
And here is the Kitty implementation: https://gist.github.com/truebit/d79b8018666d65e95970f208d8f5d149
Any idea how to make alacritty always show up on the primary screen in a multimonitor setup? It seems that
spaces.activeSpace()
returns the currently focused space and not the primary one (contrary to what the documents say it should return). Basically I always want my term to show up on my external monitor. Thanks!