Rofi Selectors
Posted on May 9, 2020
rofi is perfect for creating interactive scripts, which I like to call rofi selectors. Here are some examples:
Connecting to bluetooth devices
cat <<DEVICES | rofi -width 30 -dmenu -i -p "Devices" \
| awk '{printf $1}' \
| xargs bluetoothctl connect \
# List of devices to connect
00:16:94:2F:AC:18 Sennheiser Headphone
01:16:94:2F:AC:18 Anker Headphone
DEVICES
First rofi
displays the MAC addresses and names of the bluetooth headphones
that I use, then awk
parses the appropriate field (the MAC address in this
case), and xargs
call the appropriate command (bluetoothctl
in this case)
to connect to that headphone. I use heredocs so that I can add
the list of devices at the end of the command. Note the trick of adding a \
after the last command so that the comment # List of devices
is parsed as
part of the command rather than part of the heredoc.
I have stored this file as ~/bin/bt-connect
. To use it for the first time, I
call rofi -show run
(which is mapped to MOD+p
in my setup) and type
/home/username/bin/bt-connect
. From then onwards, rofi
remembers the
previously typed command and I can simply do MDO+p
and then type
bt-connect
, and select the appropriate headphone. No more fiddling around
with blueman-applet
!
Accessing frequently used information
I often have to fill forms where I need to know the project ids for the
different projects that I am working on. So, I have created a command
~/bin/project-ids
as follows
cat <<PROJECTS | rofi -width 20 -dmenu -i -p "Project" \
| awk '{printf $1}' \
| xclip -selection clipboard \
# List of Projects
123456 Project 1
123456 Project 2
123456 Project 3
PROJECTS
The basic structure of the command is the same as before. Display the list of
options (project-id and project-name) using rofi
, parse the appropriate
field using awk
, but in this case, I copy the parsed field to the clipboard.
This way I can simply paste it in the form where I need it.
Parsing dynamic information
Again, I need to fill forms with student ids. I have an XML file which
contains details of students, including student ids. It is easy to use rofi
selectors for this situation. I have written a script (written in
crystal, but it can be written in your favorite language), which
simply outputs the list of student-ids and names, and then I pass the output
to rofi
.
/path-to-script/student-id
| rofi -width 40 -dmenu -i -p "Name" \
| awk '{printf $1}' \
| xclip -selection clipboard
Copying passwords
I use pass as a password manager. pass
stores the passwords as
encrypted files insider ~/.password-store
. The next selector reads the
website/usernames for which a password is available, selects the username
using rofi
and passes the result to pass -c
, which copies the password to
clipboard for 45 sec.
cd $HOME/.password-store && fd -t f \
| sed 's/\.gpg$//' \
| rofi -width 30 -dmenu -i -p "pass" \
| xargs pass -c
This entry was posted in Efficiency and tagged rofi, heredoc, awk, xargs, xclip.