One day I realized that I really missed the keybindings from the command-line
when I was using the run dialog. In particular, I missed Ctrl
+r
,
Ctrl
+p
, and Bash's advanced tab completion. I started out to build a run
dialog with better bindings, but ended up just using bash itself.
In other words, it's like a terminal that you can launch with a single
keystroke, and that disappears as soon as you press Enter
.
I have this bound to Ctrl
+Alt
+r
.
Spawning a terminal
The funnest part of the project was figuring out how to control an interactive
bash process. For most projects it's sufficient to feed the commands to a
shell via system
, but in this case I had to pass all keystrokes through.
The ruby standard library has an excellent tool for this, PTY
. PTY
spawns
a pseudo terminal (as opposed to an actual terminal), and gives you an IO
object for input, another for output, and a final one for errors:
term_read, term_write, term_err = PTY.spawn "bash --login"
The rest of the project consisted of translating keystrokes from GTK into the
sequences that a terminal would expect, and translating the output from the
terminal into modifications to a Gtk::TextView
.
The source code is available on github.