For years now, I've used an excellent drop-down terminal emulator called Guake -- a GNOME port of Quake. It supported every feature I needed: Wayland (mostly), tabs, custom shortcuts, custom shell, transparency, and a toggle command (guake -t
) that plays nice w/ custom keybinds in GNOME.
Recently, however, I've found myself wanting something akin to Vim's visual mode in Guake (specifically the ability to copy-paste chunks of output like file names into the command).
While Guake doesn't support this, the screen
command does:
- Press
C-a [
to enter copy mode. - Move the cursor to the text you want to copy and press space.
- Highlight the text you want to copy and press space again to copy the selection and return to normal mode.
- Press
C-a ]
to paste at the cursor.
This is exactly what I wanted. Now, I just need to make screen fish --login
my default shell in Guake. This presented a couple issues.
First, because I am using a GUI-based terminal emulator, I want to use its scroll-back functionality. By default, screen
buffers output and provides its own implementation of scroll-back.
Luckily, this was easy enough to change with a line in my ~/.screenrc
:
termcapinfo xterm*|xs|rxvt|terminal ti@:te@
The next problem was... not so easy to solve.
Guake's preferences dialog.
While Guake allows you to select a custom shell, it does not allow you to specify a custom command. I need to do this because screen
does not register itself as a shell w/ the system.
Sooooo using Guake is out of the question if I want to use my new Franken-screen shell setup.
GNOME Terminator
GNOME Terminator's preferences dialog.
I tried several other shell emulators, but they all had game-breaking issues or missing functionality for me personally. Most notably, I actually got GNOME's Terminator tiling emulator completely set up to my liking. When I tried to replace my keyboard shortcut for Guake, thought, I discovered that there's no CLI flag to "toggle" the current window to make it behave like a drop-down shell.
Tilix
Tilix's Quake mode, Wayland edition.
I also tried Tilix, another tiling emulator. Like Terminator, it had preferences for everything I like to customize in Guake -- it even has a Quake mode that makes it behave as a drop-down shell! Unlike Terminator, it has a CLI flag to show/hide the overhead window.
Unfortunately, Tilix has limited support for Wayland in Quake mode. I was able to get it to work by updating my keyboard shortcut to use the env GDK_BACKEND=x11
environment.
Ah, Wayland, how we love thee.
This too has its own problem. One feature of Guake that I use a lot is the "Open on monitor with cursor" setting. This lets me quickly move Guake between monitors as I'm working.
There is a well-known limitation of Wayland where Wayland apps are restricted from accessing certain information about the displays and other running applications. This prevents Tilix from being able to determine which monitor the active cursor is on.
This problem is not unique to Tilix. I use the excellent Ulauncher tool. On X.org, Ulauncher opens on the monitor where the cursor is. On Wayland, it picks the monitor seemingly at random.
While searching around for this issue, I stumbled upon a comment on an issue in the Tilix GitHub which pointed me to a GNOME extension of all things called DDTerm.
DDTerm
DDTerm and its glorious, glorious preference dialog.
DDTerm is "Another Drop Down Terminal Extension for GNOME Shell" and has managed to be a perfect drop-in replacement for Guake for me. It supports, among other things:
- A custom command to use for new sessions (
screen fish --login
) - A DBus command to toggle a single instance (
gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell/Extensions/ddterm --method com.github.amezin.ddterm.Extension.Toggle
) - Transparency
- Customizable keyboard shortcuts/color theme/fonts
Plus, because it's running in GNOME directly, it can access the compositor to correctly determine the monitor where the mouse lives!
Conclusion
This rabbit hole was probably 2 hours of on-again-off-again tinkering w/ various terminal emulators, but I have landed on:
- Shell: Fish Shell wrapped in GNU Screen
- Emulator: DDTerm
- Custom
.screenrc
to enable literal scrollback - Custom GNOME keybinding to toggle DDTerm