Mark i3 Windows and Navigate Marks
Here's how to mark or label a window and focus on that window by mark name.
What is usual and obvious in much i3 documentation and blogging is how to navigate directionally (focus the window to the top, left, etc). Most i3/configs include examples for these bindings. But there is a fabled way of navigating to pre-existing windows using i3 marks, jumping to exactly what you want. What are i3 marks, and how is this done?
i3 Marks
A mark is a label that you can put on a window. It's a way to identify what's in the window.
To mark a window, use the mark
command (or i3-msg mark
command if outside of the i3 context).
To see a mark, look in the top-right corner of the window title bar. It will be a small, gray, lowercase letter, surrounded in square brackets. Note that you must not have hidden window title bars to see this, obviously(?).
To move focus or jump to a window, you must target it. You can do that with the a selector like [con_mark=myMarkName]
and then use the focus
command.
Script i3 Marks with Dmenu
If you're in i3, there's a good chance you're also using dmenu
. Here's a great method for marking windows using dmenu, this gem from i3-wm-scripts.
First, make a script to mark your windows, in a file called imark
:
#!/bin/sh -ue
name="$(i3-msg -t get_marks | tr -d '[],' | sed -e 's/""/\n/g' | tr -d '"' | dmenu -p mark)"
exec i3-msg mark "$name"
Here's the breakdown:
i3-msg -t get_marks
- get all the marks i3 knows about;-t
sends an ipc message, of whichget_marks
is onetr -d '[],
-tr
for "translate";-d
for deleting all characters listed: brackets and commas, sinceget_marks
returns an array or quoted stringssed -e 's/""/\n/g'
- replaces double quotes between tags with newlinestr -d '"'
- remove final quotes and beginning and enddmenu -p mark
- show dmenu with prompt of "mark", allowing input, listing all the existing marksexec i3-msg mark "$name"
- tell i3 to mark the window with the name entered in dmenu
Next, a script to jump to a mark, called igo
:
#!/bin/sh -ue
name="$(i3-msg -t get_marks | tr -d '[],' | sed -e 's/""/\n/g' | tr -d '"' | dmenu -p focus)"
i3-msg "[con_mark=$name] focus"
- Same dmenu buildup as above
i3-msg "[con_mark=$name] focus"
- tell i3 to focus the window with the mark selected from dmenu
Launch with dmenu
Once you have the two scripts set up, you can launch with dmenu really easily. You can launch anything that's inthe $PATH. Active dmenu and type either imark
or igo
Launch with i3
But since these are i3 control scripts that we've set up, it would make a whole lot of sense to let i3 control the launching of the scripts, which we can do in ~/.config/i3/config
bindings:
bindsym $mod+m exec imark
bindsym $mod+g exec igo
Sooo slick!
Any other i3 mark tips? We need more of this.