[О блоге] [наверх] [пред] [2023-10-24 17:06:46+03:00] [c488826bdb22ecc4d39640881d2ecc00f29ce3c6]
Темы: [bsd][zsh]

Пробую использовать nnn

https://github.com/jarun/nnn
Почти всё время я перемещаюсь и оперирую файлами просто в zsh. Но
иногда, когда надо или оглядеть какую-нибудь мешанину и/или выборочно из
неё что-то удалить/скопировать/переместить, то запускаю ортодоксальный
файловый менеджер (7efac46178ded122377f4d32485a3ab02d9574ea) Midnight
Commander, ибо подобными (187fbd62f66088016c61da19a36f8f0a7b9a48fb
Volkov Commander, Far Manager (код ещё сидел под Microsoft Windows)) я
пользовался ещё с детства.

На днях надо было попрыгать по ряду директорий с фотографиями и
запускать в них "sxiv -t ." для preview просмотра их содержимого.
Запускать sxiv натравив на все директории -- слишком большой объём,
слишком долго ждать. Но в MC каждый раз приходилось набирать руками этот
sxiv вызов. На n-ый раз я быстро сделал one-line "foo" скрипт, тупо
чтобы меньше набирать пришлось.

Снова задался вопросом: есть ли приемлемая замена MC? Слышал я про
ranger, vifm, nnn и ещё наверное какие-то. ranger сразу отпадает:
написан на Python, значит будет тормозить, а мне надо чтобы всё
мгновенно запускалось. vifm когда-то пробовал, но как-то всё не шибко
было удобно с ходу. Главное что я хочу: progress bar отображающий cp/mv
операции, со скоростью и ETA. Ну и быстрое перемещение между двумя
местами, чтобы из одного в другое быстро что-то перебрасывать --
собственно, две панельки поэтому и удобны в ортодоксальных менеджерах.

nnn при выходе иногда оставляет coredump, с ходу пока не понял почему.
Но компилируется из одного .c файла, занимает мизерное место. С одной
стороны он не ортодоксальный и нет двух панелек -- но есть tab-ы (они их
называют контекстами), между которыми можно быстро прыгать tab-ом или
циферками. Быстрый fuzzy-like поиск и перемещение: "/", вводим часть
имени, если в выборке остался один элемент (и это директория), то сразу
переходим в него. Непривычно, не прощает опечаток, но нажатий клавиш
минимум.

По-умолчанию он использует xdg-open для открытия файлов. XDG ненавижу.
Но достаточно export NNN_OPENER=zsh-mime-open и мои .mailcap/.mime.types
файлы начинают работать как и везде и всякие .jxl сразу же начинают
просматриваться. Хочется мне запускать "sxiv -t ."? Просто добавляю plug
в виде NNN_PLUG='s:!sxiv -t .*' -- нажимая ";s" в nnn, будет запускаться
sxiv команда.

Выделять что-то, переключаться между контекстами и делать
вставку/копирование -- требует минимум нажатий клавиш. Прогресса
никакого нет. Точнее штатная документация говорит что под BSD системами
вы можете самостоятельно отправлять SIGINFO сигнал
(37bc49efafc88667a4bd371133e843ddbc6c0ce3,
b10b27905edfce6ad8054172f508ada4e3ebc09f,
954a5de29f23ee16e037b107e5847fd33799246e) и видеть прогресс копирования.
Но mv прогресс не покажет. Может быть можно написать собственный плагин,
который возьмёт selection и самостоятельно раскидает всё в tar и pv
например? Без проблем! Добавляю "c"-plug: NNN_PLUG='c:!_nnn-cd*' и
создаю _nnn-cd исполняемый файл:

    #!/usr/bin/env zsh
    set -e
    sel=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection}
    [[ -s $sel ]]
    read -d $"\x00" -A tgts < $sel || :
    size=$(du -A -c $tgts)
    size=(${=size})
    size=${size[$#size - 1]}
    for tgt ($tgts) ( cd $tgt:h ; tar cf - $tgt:t ) |
    pv --wait --interval 0.5 --size ${size}k |
    tar xf - --options read_concatenated_archives

В zsh можно сразу же удобно в массив прочитать null-terminated список
файлов selection-а. Натравливаю на всё это du чтобы хотя бы примерно
иметь представление о размере данных. А далее для каждой цели делаю по
tar архиву, чтобы в каждом из них только последний элемент явно
копировался (то бишь "music", а не "home/stargrave/music").

В nnn нельзя просто взять и указать "cd куда-то". Или переходить в ~,
или в /, или в какой-то bookmark и от них уже через "/" отправляться в
нужную директорию. Но ведь plugin может быть просто как-раз cd команда
же. А у меня есть время от времени используемая "cf", которая запускает
bfs и fzf, которыми можно fuzzy выбрать директорию для перехода.
NNN_PLUG='c:!_nnn-cd*;C:!_nnn-cd /*'

    #!/usr/bin/env zsh
    set -e
    [[ -n "$NNN_PIPE" ]]
    autoload ~/.zsh/functions/cf
    cf $1
    print -n -- "0c$PWD" > "$NNN_PIPE"

Последняя строка -- протокол взаимодействия с nnn через pipe. Тут мы ему
говорим чтобы сменил директорию. ";c" запустит интерактивный fzf от
текущей директории, а ";C" -- от корня.

Midnight Commander умеет и прозрачно переходить в архивы. nnn же
использует archivemount утилиту для этого, которая поверх FUSE монтирует
archive. Впервые использовал, но так как она работает через libarchive,
через которые вообще все tar/cpio/whatever в FreeBSD сделаны, то значит
поддерживает всё что нужно сразу же. Действительно -- работает. Во
временной директории nnn из под пользователя она всё монтирует. С
.tar.zst проблем не нашлось.

Когда-то я ещё использовал возможности подключения к FTP или SFTP в MC,
но уже наверное годами ни разу не использовал эти возможности, обходясь
ручным вызовом ftp/sftp ради единичных файлов.

Похоже, что nnn более чем удовлетворителен и годится на замену MC,
который тянет за собой GLib, libssh2 и S-Lang.

    [оставить комментарий]