EDIT: It seems that this is not the correct way to set this up anymore. For the new way of doing this check this gist comment:
https://gist.github.com/programus/d3bf9c6b8f9b7648891d1f59b665b35e#gistcomment-4730779
I ❤️ my terminal
As a programmer I spend a good chunk of my working day in a terminal and have up until recently used iTerm2 for MacOS. It is pretty nice, but I also use tmux (if you haven't heard about it, check it out immediately). Using tmux I have no need for all the extra crap that is bundled into iTerm2 like tabs, panes, keyboard shortcuts, paste history, as this is handled by tmux in a standard manner everywhere I use a terminal. One feature that I really liked though, was support for a Guake-style terminal (also called HUD or Quake style named after the game), you know the one that slides over the active window from the top of the screen.
I have had my eye on Alacritty for a while. It seems to tick every box that I'm looking for in a good terminal emulator. It's minimal with no extra bells and whistles and it's really fast (no surprise, it's written in Rust). I tested it a few years ago, and it looked promising, but was way to buggy back then. A few days ago I had a really frustrating day with iTerm2, so I decided to give Alacritty another try, and wow, what a difference. Alacritty feels stable as a rock, and the performance is off the charts. The only thing that was missing was the sweet Guake-style terminal that I had gotten used to with iTerm2, I'm totally dependent on being able to bring up a terminal on any screen with a keyboard shortcut. After some research, I found the perfect solution using a combination of the Alacritty config and hammerspoon.
I have had my eye on Alacritty for a while. It seems to tick every box that I'm looking for in a good terminal emulator. It's minimal with no extra bells and whistles and it's really fast (no surprise, it's written in Rust). I tested it a few years ago, and it looked promising, but was way to buggy back then. A few days ago I had a really frustrating day with iTerm2, so I decided to give Alacritty another try, and wow, what a difference. Alacritty feels stable as a rock, and the performance is off the charts. The only thing that was missing was the sweet Guake-style terminal that I had gotten used to with iTerm2, I'm totally dependent on being able to bring up a terminal on any screen with a keyboard shortcut. After some research, I found the perfect solution using a combination of the Alacritty config and hammerspoon.
Ok, enough already, show me how!
I have to admit that my solution was heavily inspired by this amazing gist with a few minor tweaks. A longer discussion on other options in this issue as well: https://github.com/alacritty/alacritty/issues/862
Step 1: Install the dependencies (I use Homebrew):
brew install alacritty hammerspoon
Step 2: Configure Alacritty
~/.config/alacritty.yml:
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 }Step 3: Configure Hammerspoon
First, install this: https://github.com/asmagill/hs._asm.undocumented.spaces
~/.hammerspoon/init.lua:
-- https://github.com/asmagill/hs._asm.undocumented.spaces
local spaces = require "hs.spaces"
local screen = require "hs.screen"
-- Switch alacritty
hs.hotkey.bind({'alt','shift','ctrl'}, 'j', function ()
local APP_NAME = 'Alacritty'
function moveWindow(alacritty, space)
-- move to main space
local win = nil
while win == nil do
win = alacritty:mainWindow()
end
print("win = ", win)
print("space = ", space)
print("win:screen() = ", win:screen())
local fullScreen = not win:isStandard()
if fullScreen then
hs.eventtap.keyStroke('cmd', 'return', 0, alacritty)
end
winFrame = win:frame()
scrFrame = screen.mainScreen():frame()
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())
spaces.moveWindowToSpace(win, 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.activeSpaceOnScreen()
print("activeSpace() = ", space)
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)
appWatcher:stop()
end
end)
print('start watcher')
appWatcher:start()
end
if alacritty ~= nil then
moveWindow(alacritty, space)
end
end
end)
-- Hide alacritty if not in focus
-- hs.window.filter.default:subscribe(hs.window.filter.windowFocused, function(window, appName)
-- local alacritty = hs.application.get('Alacritty')
-- print(alacritty)
-- if alacritty ~= nil then
-- print('hiding alacritty')
-- alacritty:hide()
-- end
-- end)Step 4: Take it for a spin using the shortcut from Hammerspoon 🎉
You should now have a blazing fast terminal right at your fingertips that you can show and hide on any screen or space, even if apps are in fullscreen. You're welcome 😎
NB: If you want the terminal to fill the screen, you just configured a shortcut for this Command-Enter.