Что: c488826bdb22ecc4d39640881d2ecc00f29ce3c6
Когда: 2023-10-24 17:06:46+03:00
Темы: 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.
Сгенерирован: SGBlog 0.34.0