mc я давно уже собираю без редактора. их просмотрщик меня тоже изрядно выбешивает. поэтому встроенный просмотр тоже отключаю нафиг.
а что взамен? взамен православный less. кстати, ляцкий гугл на запрос “less” выдает хренову тучу ссылок на css-ное гивно. o tempora, o mores.
но чтобы less-ом можно было нормально пользоваться, нужно его малость приготовить. первое – это пара патчиков.
небольшое улучшение строки статуса (фон на всю ширину экрана):
--- less-458/command.c.orig 2013-04-04 19:55:05.000000000 +0300 +++ less-458/command.c 2013-11-02 12:04:09.159274439 +0200 @@ -741,14 +741,17 @@ if (is_filtering()) putstr("& "); if (p == NULL || *p == '\0') + { putchr(':'); + clear_eol(); + } else { at_enter(AT_STANDOUT); putstr(p); + clear_eol(); at_exit(); } - clear_eol(); } /*
этот патчик позволяет получить такую статусную строку, которая не вызывает у меня тошнотворных позывов. настройка строки делается через переменную $LESS, куда, впрочем, загоняются и прочие дефолтные аргументы.
собственно моя переменная содержит следующее:
LESS="-cRSx4M~#1PMФайл\: ?f%F:stdin. | Строка\: %lt-%lB?L/%L. ?PB(%PB\%) .| Страница\: %d?L/%D."
следующий патчик – избавление от зомби в случае использования $LESSOPEN
--- less-458/main.c.orig 2013-04-04 19:55:05.000000000 +0300 +++ less-458/main.c 2014-05-28 14:00:04.586513424 +0300 @@ -17,6 +17,10 @@ #include <windows.h> #endif +#ifndef WIN32 +#include <signal.h> +#endif + public char * every_first_cmd = NULL; public int new_file; public int is_tty; @@ -106,6 +110,13 @@ GetConsoleTitle(consoleTitle, sizeof(consoleTitle)/sizeof(char)); #endif /* WIN32 */ +#ifndef WIN32 + /* + * Ignore SIGCHLD for avoid zombies when LESSOPEN is used + */ + signal(SIGCHLD, SIG_IGN); +#endif /* WIN32 */ + /* * Process command line arguments and LESS environment arguments. * Command line arguments override environment arguments.
$LESSOPEN вообще мощная штука, и позволяет настроить фильтрацию отображаемого содержимого как нужно пользователю. в данном случае мне. а мне нужна подсветка синтаксиса для кода, просмотр содержимого архивов, метаданных для всякой лабудени типа музычки, видео и прочих картинок, ну и по мелочам там, типа дампа символов из бинарей и т.д.
для этого делается простенький скриптик lesspipe.sh
#! /bin/bash [[ -z $1 ]] && exit filename="$1" mime=$(mimetype -Lb "$filename") # determine compression case $mime in application/x-gzip) CAT="gzip -dc" ;; application/x-bzip*) CAT="bzip2 -dc" ;; application/x-xz) CAT="xz -dc" ;; *) CAT="cat" ;; esac # set highlight output type [[ $(tput colors) -eq 256 ]] && fmt="xterm256" || fmt="ansi" # show file content case $mime in audio/*|video/*) echo "$filename" gst-discoverer "$filename" | tail -n +3 ;; image/*) if [[ $mime == image/vnd.djvu ]]; then djvused -e print-pure-txt "$filename" elif [[ $mime == image/x-xpmi ]]; then highlight --force -S c -O $fmt -s ${HIGHLIGHT_THEME:-xoria256} "$filename" 2> /dev/null else exiv2 print "$1" || gm identify -verbose "$1" fi ;; text/*) [[ $mime == text/html && "$filename" == *.php* ]] && mime="text/x-php" case $mime in text/html) w3m -dump "$filename" ;; text/troff) groff -T utf8 -mandoc -rLL="$(($(stty size | cut -d' ' -f2) - 2))n" "$filename" ;; text/rtf) catdoc "$filename" ;; *) highlight --force -O $fmt -s ${HIGHLIGHT_THEME:-xoria256} "$filename" 2> /dev/null ;; esac ;; application/x-ipkg) ipkg -P "$filename" ;; application/x-tar|application/x-compressed-tar) echo "${filename}:" tar -avtf "$filename" ;; application/zip|application/x-zip) unzip -v "$filename" ;; application/x-rar) unrar l "$filename" ;; application/pdf) pdftotext -q "$filename" - ;; application/x-font-*) fc-query "$filename" ;; application/postscript) ps2ascii "$filename" ;; application/x-gettext-translation) msgunfmt "$filename" ;; application/vnd.oasis.opendocument.text) odt2txt "$filename" ;; application/msword|application/vnd.ms-office) catdoc "$filename" ;; application/x-executable|application/x-sharedlib|application/x-object) objdump -xt "$filename" ;; application/x-iso9660-image) xorriso -indev "$filename" -pvd_info 2> /dev/null | sed 's/\-indev //' ;; application/vnd.debian.binary-package) ar p "$filename" control.tar.gz | tar -zx ./control -O echo -e "\nFiles:\n" dfile=$(ar t "$filename" | grep data) case $dfile in data.tar.gz) ar p "$filename" $dfile | tar -zvt ;; data.tar.bz2) ar p "$filename" $dfile | tar -jvt ;; data.tar.xz) ar p "$filename" $dfile | tar -Jvt ;; esac ;; application/octet-stream) if [[ ! -e ~/.hexdump ]]; then echo -e '"%07.7_ax_L[red]\\t\\t" 16/1 "%02x_L[cyan] "\n"\\t\\t" " | " "%_p"\n"\\n"' > ~/.hexdump fi hexdump -f ~/.hexdump -Lalways -v "$filename" ;; *) $CAT "$filename" ;; esac
в скрипте используется mimetype из perl-ового File::MimeInfo, который, в отличие от file работает с xdg-шной базой mime, и дает более релевантную информацию о типе файла. для подсветки я использую highlight, остальное, в принципе, тривиально.
скрипт пихается в /куда/нибудь (в моем случае – /usr/share/misc) и прописывается в переменной $LESSOPEN
LESSOPEN="| /usr/share/misc/lesspipe.sh '%s'"
далее убирается галка “использовать внутренний просмотр” в настройках mc и можно жить с F3. к тому-же, встроенный просмотр при этом все еще доступен по Shift+F3.
ну и последний штришок – настройка клавиш.
делается скармливанием соответственного кода команде lesskey
мой вариант (заточенный под urxvt)
#command \e\e quit ^[[7~ goto-line ^[[8~ goto-end ^[[19~ toggle-option N\n ^[OQ toggle-option S\n
добавляет Esc для выхода, небольшая коррекция Home/End для навигации, F2 для переключения режима переноса строк и F8 для переключения режима отображения номеров строк
мне достаточно, если кому надо больше – это в man less
вот, собственно, и все. that’s all, folks