В этой заметке расскажу, как в Linux с помощью универсального лаунчера rofi настроить удобный поиск, копирование и вставку длинных shell команд из заранее подготовленного списка.
🖐️Эй!
Подписывайтесь на наш телеграм @r4ven_me📱, чтобы не пропустить новые публикации на сайте😉. А если есть вопросы или желание пообщаться по тематике — заглядывайте в Вороний чат @r4ven_me_chat🧐.
📝 rofi - это универсальная и быстрая утилита для Linux, которая служит в первую очередь как запускатель/лаунчер приложений и переключатель окон, но также может использоваться для выполнения команд, поиска SSH-хостов и многого другого.
Небольшое демо
Короткое gif демо итогового результата:

Работает всё очень просто. Вызов меню rofi, затем поиск нужной команды:

После нажатия Enter команда копируется в буфер обмена и вставляется (но не выполняется) в текущее окно терминала. После чего её можно выполнить или отредактировать и выполнить:

Тут имитируется нажатие Ctrl+Shift+v. Можно настроить любое действие, вызываемое через оболочку.
Я нахожу подобный способ весьма удобным в работе. Часто приходится повторно использовать те или иные команды во время работы в терминале. И лезть за ними в заметки/гугл/нейронке - занимает время.
Ранее я уже реализовывал подобное, но на уровне оболочки: Пишем функцию быстрого доступа к сложным командам для Zsh и Bash
Или Tmux+fzf (смотрите инструкцию под спойлером в начале).
Установка rofi
☝️ Пример настройки из статьи выполнялся в среде дистрибутива LMDE7 (Debian 13).
Перед настройкой необходимо установить сам rofi:
sudo apt update && sudo apt install rofiДополнительно установите утилиты для работы с буфером обмена и отправки действий нажатия клавиш для вашего графического стека.
Для X11:
sudo apt install xclip xdotoolДля Wayland:
sudo apt install wl-copy wtypeСоздание конфига
Теперь создаём директорию конфигурации rofi и в ней основной конфиг:
mkdir -p ~/.config/rofi
vim ~/.config/rofi/config.rasiНаполняем его:
/* rofi -dump-config > ~/.config/rofi/config.rasi */
configuration {
line-margin: 10;
display-ssh: "";
display-run: "";
display-drun: "Launch app:";
display-window: "";
display-combi: "";
show-icons: true;
kb-row-up: "Up,Control+p";
kb-row-down: "Down,Control+n";
kb-row-left: "Control+Page_Up";
kb-row-right: "Control+Page_Down";
timeout {
action: "kb-cancel";
delay: 0;
}
filebrowser {
directories-first: true;
sorting-method: "name";
}
show-icons: true;
scroll-method: 1;
}
@theme "~/.config/rofi/nord.rasi"Рядом создаём конфиг темы (в палитре Nord):
vim ~/.config/rofi/nord.rasi/* https://github.com/lr-tech/rofi-themes-collection */
* {
bg0: #2E3440F2;
bg1: #3B4252;
bg2: #4C566A80;
bg3: #88C0D0F2;
fg0: #D8DEE9;
fg1: #ECEFF4;
fg2: #D8DEE9;
fg3: #4C566A;
}
* {
/* font: "Hack Nerd Font Mono 13";*/
background-color: transparent;
text-color: @fg0;
margin: 0px;
padding: 0px;
spacing: 0px;
}
window {
location: north;
y-offset: calc(50% - 176px);
/* width: 480;*/
width: 15%;
border: 2px;
border-color: @bg3;
border-radius: 24px;
background-color: @bg0;
}
mainbox {
padding: 12px;
}
inputbar {
background-color: @bg1;
border-color: @bg3;
border: 2px;
border-radius: 16px;
padding: 8px 16px;
spacing: 8px;
children: [ prompt, entry ];
}
prompt {
text-color: @fg2;
}
entry {
placeholder: "Search";
placeholder-color: @fg3;
}
message {
margin: 12px 0 0;
border-radius: 16px;
border-color: @bg2;
background-color: @bg2;
}
textbox {
padding: 8px 24px;
}
listview {
margin: 12px 0 0;
lines: 15;
columns: 1;
fixed-height: false;
scrollbar: true;
}
scrollbar {
width: 4px ;
border: 2;
handle-color: @fg0;
handle-width: 8px ;
padding: 2;
}
element {
padding: 2px 8px;
spacing: 8px;
border-radius: 16px;
orientation: horizontal;
}
element normal active {
text-color: @bg3;
}
element alternate active {
text-color: @bg3;
}
element selected normal, element selected active {
background-color: @bg3;
}
element-icon {
size: 1em;
vertical-align: 0.5;
}
element-text {
text-color: inherit;
}
element selected {
text-color: @bg1;
}Для справки: в качестве Powerline шрифта я использую Hack Nerd Font Mono.
Как установить смотрите под спойлером.
Спойлер
Мои читатели знают, что я предпочитаю шрифт Hack ☝️. Вот простой пример, как его можно установить:
📝 Примечание
Обратите вниманием, что для выполнения команд потребуются права sudo. Либо установите шрифты только для текущего пользователя в директории ~/.local/share/fonts.
# создаем директорию шрифта
sudo mkdir /usr/share/fonts/Hack
# скачиваем архив со шрифтами
curl -fsSLO \
$(curl -s https://api.github.com/repos/ryanoasis/nerd-fonts/releases/latest \
| grep browser_download_url \
| grep 'Hack.zip' \
| cut -d '"' -f 4)
# распаковываем архив, коприруем шрифты в систем
sudo unzip ./Hack.zip -d /usr/share/fonts/Hack/ && rm -f ./Hack.zipПодготовка списка команд
Теперь необходимо создать файл со списком наших команд, доступ к которым мы будем получать через rofi:
vim ~/.config/rofi/commands.listФормат файла следующий:
[описание команды] сама_командаПример команд:
# Process Management
[ps: top 5 cpu processes] ps --sort=-%cpu -eo user,pid,ppid,state,comm | head -n6
[ps: top 5 mem processes] ps --sort=-%mem -eo user,pid,ppid,state,comm | head -n6
[ps: process tree] ps -axf -eo user,pid,ppid,state,comm
[ps: zombie parents] ps -eo user,pid,ppid,state,comm | awk 'NR==1 || $4=="Z"'
[pstree: tree hierarchy] pstree -p -t -n -C age
[vmstat: cpu utilization] vmstat 1 2 | tail -1 | awk '{print 100 - $15 "%"}'
[df: show mount points >80%] df -h | awk '$5 ~ /^8[0-9]%/ {print $6}'
[du: show top20 usage] du -x --block-size=1 / 2> /dev/null | sort -rn | head -n 20 | numfmt --to=iecМожете взять мою коллекцию команд в качестве базы:
curl -fsSL --output ~/.config/rofi/commands.list \
https://raw.githubusercontent.com/r4ven-me/rofi/main/commands.listСоздание скрипта запуска
Далее нам нужно создать скрипт, который будет брать команды из файла и передавать их rofi:
vim ~/.config/rofi/cmd.shНаполняем:
#!/usr/bin/env bash
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd -P)
COMMANDS_FILE="${SCRIPT_DIR}/commands.list"
cmd=$(
rofi \
-dmenu \
-theme-str '* { font: "Hack Nerd Font Mono 13"; }' \
-theme-str 'window { width: 40%; }' \
-theme-str 'listview { lines: 25; }' \
-p " Insert command:" < "$COMMANDS_FILE" | \
sed 's/^\[[^]]*] *//') && \
if [ -n "$WAYLAND_DISPLAY" ]; then
# Wayland
printf "%s" "$cmd" | wl-copy
wtype -M ctrl -M shift v
else
# X11
printf "%s" "$cmd" | xclip -selection clipboard
# xdotool key --delay 0 "ctrl+shift+v"
xdotool key --delay 0 --clearmodifiers "ctrl+shift+v"
fiСуть скрипта: он позволяет выбрать команду из списка через rofi и затем вставить её в активное окно, имитируя нажатие Ctrl+Shift+V. Действие с выбранной командой вы можете настроить по своему усмотрению.
Описание логики работы скрипта
SCRIPT_DIRопределяет директорию, где находится сам скрипт;COMMANDS_FILEуказывает на файлcommands.list(предполагается, что он лежит рядом со скриптом), который содержит список команд для выбора;- Запускает
rofiв режимеdmenu(меню выбора); - Настраивает внешний вид
rofi(шрифт, ширина окна, количество строк); - В качестве входных данных для
rofiиспользуется содержимое файлаCOMMANDS_FILE; - Пользователь выбирает команду из предложенного списка;
sed 's/^\[[^]]*] *//'удаляет любые префиксы типа[tag]из выбранной строки перед сохранением её в переменнуюcmd;if [ -n "$WAYLAND_DISPLAY" ]; then ... else ... fiпроверяет, используется ли графический сервер Wayland (переменная$WAYLAND_DISPLAYустановлена) или X11: это необходимо для использования правильных утилит для работы с буфером обмена и имитации нажатий клавиш;- Если обнаружен Wayland:
printf "%s" "$cmd" | wl-copyкопирует выбранную команду ($cmd) в буфер обмена Wayland;wtype -M ctrl -M shift vимитирует нажатие комбинации клавишCtrl+Shift+V, чтобы вставить содержимое буфера обмена в активное окно;
- Если обнаружен X11:
printf "%s" "$cmd" | xclip -selection clipboardкопирует выбранную команду ($cmd) в буфер обмена X11;xdotool key --delay 0 --clearmodifiers "ctrl+shift+v"имитирует нажатие комбинации клавишCtrl+Shift+Vдля вставки содержимого буфера обмена в активное окно. (--clearmodifiersгарантирует, что никакие другие “залипшие” модификаторы не помешают).
Делаем скрипт исполняемым:
chmod +x ~/.config/rofi/cmd.shИ пробуем вызвать rofi из консоли:
~/.config/rofi/cmd.shДолжно быть так:

Результат вставки и выполнения:

Все актуальные исходники вы всегда найдёте на моём GitHub:
Бинд клавиши запуска rofi
Для удобства работы с данным инструментом рекомендую забиндить горячую клавишу, например, на F12 для быстрого вызова.
Пример для Cinnamon:




Спасибо, что читаете Вороний блог. Всех благ!


