mc, less и все, все, все…

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *