Универсальный поиск и использование CLI-команд через rofi
Приветствую!

В этой заметке расскажу, как в Linux с помощью универсального лаунчера rofi настроить удобный поиск, копирование и вставку длинных shell команд из заранее подготовленного списка.

Небольшое демо

Короткое gif демо итогового результата:

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

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

Тут имитируется нажатие Ctrl+Shift+v. Можно настроить любое действие, вызываемое через оболочку.

Я нахожу подобный способ весьма удобным в работе. Часто приходится повторно использовать те или иные команды во время работы в терминале. И лезть за ними в заметки/гугл/нейронке - занимает время.

Ранее я уже реализовывал подобное, но на уровне оболочки: Пишем функцию быстрого доступа к сложным командам для Zsh и Bash

Или Tmux+fzf (смотрите инструкцию под спойлером в начале).

Установка rofi

Перед настройкой необходимо установить сам rofi:

BASH
sudo apt update && sudo apt install rofi
Нажмите, чтобы развернуть и увидеть больше

Дополнительно установите утилиты для работы с буфером обмена и отправки действий нажатия клавиш для вашего графического стека.

Для X11:

BASH
sudo apt install xclip xdotool
Нажмите, чтобы развернуть и увидеть больше

Для Wayland:

BASH
sudo apt install wl-copy wtype
Нажмите, чтобы развернуть и увидеть больше

Создание конфига

Теперь создаём директорию конфигурации rofi и в ней основной конфиг:

BASH
mkdir -p ~/.config/rofi

vim ~/.config/rofi/config.rasi
Нажмите, чтобы развернуть и увидеть больше

Наполняем его:

BASH
/* 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):

BASH
vim ~/.config/rofi/nord.rasi
Нажмите, чтобы развернуть и увидеть больше
BASH
/* 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.

Как установить смотрите под спойлером.

Подготовка списка команд

Теперь необходимо создать файл со списком наших команд, доступ к которым мы будем получать через rofi:

BASH
vim ~/.config/rofi/commands.list
Нажмите, чтобы развернуть и увидеть больше

Формат файла следующий:

BASH
[описание команды] сама_команда
Нажмите, чтобы развернуть и увидеть больше

Пример команд:

BASH
# 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
Нажмите, чтобы развернуть и увидеть больше

Можете взять мою коллекцию команд в качестве базы:

BASH
curl -fsSL --output ~/.config/rofi/commands.list \
    https://raw.githubusercontent.com/r4ven-me/rofi/main/commands.list
Нажмите, чтобы развернуть и увидеть больше

Создание скрипта запуска

Далее нам нужно создать скрипт, который будет брать команды из файла и передавать их rofi:

BASH
vim ~/.config/rofi/cmd.sh
Нажмите, чтобы развернуть и увидеть больше

Наполняем:

BASH
#!/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. Действие с выбранной командой вы можете настроить по своему усмотрению.

Делаем скрипт исполняемым:

BASH
chmod +x ~/.config/rofi/cmd.sh
Нажмите, чтобы развернуть и увидеть больше

И пробуем вызвать rofi из консоли:

BASH
~/.config/rofi/cmd.sh
Нажмите, чтобы развернуть и увидеть больше

Должно быть так:

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

Все актуальные исходники вы всегда найдёте на моём GitHub:

Бинд клавиши запуска rofi

Для удобства работы с данным инструментом рекомендую забиндить горячую клавишу, например, на F12 для быстрого вызова.

Пример для Cinnamon:

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

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/automation/universalnyy-poisk-i-ispolzovanie-cli-komand-cherez-rofi/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша