Midnight Commander 4.8.33 - теперь с поддержкой ksh
Опубликовано 22.02.2025 в OpenBSD
"Тихо и незаметно"© 23-го января (да, я слоупок) вышло очередное обновление консольного файлового менеджера Midnight Commander:
Новость о релизе на официальном сайте
И я немедленно воспламенился этой новостью, потому как среди нововведений заявлены:
-
добавление поддержки вариаций ksh в качестве subshell;
-
добавление возможности выбора сочетаний клавиш в стиле Vim.
Сразу скажу про "сочетания клавиш в стиле vim" - я ожидал увидеть там добавление полноценной модальности, но увы, и рядом ничего похожего. Просто какой-то отбитый вимер завел тикет "ваши дефолтные сочетания клавиш ужасны, они воняют говной и емаксом, вот смотрите лучше, какой я себе mc.keymap запили крутой" - а они взяли да и добавили этот вариант keymap в комплект поставки. Ну потому что если уже есть default и emasc-варианты, то почему не поставлять и vim-вариант? Так вот - он плох, этот вариант, потому что без нормальной полноценной модальности это стрельба себе в ногу (пример будет ниже).
А вот поддержка ksh есть то самое, чего мне в OpenBSD сильно не хватало, ибо в OpenBSD по умолчанию системным шеллом является как раз "вариация ksh" - собственный форк public domain Korn shell. Нет, ну мне, конечно, ничто не мешало в любой момент установить хоть bash, хоть zsh, хоть fish - любой шелл из числа тех, что mc уже умеет запускать как сабшелл, все они доступны в пакетной базе OpenBSD. Но моему сердцу милы принципы "просто - это когда просто устроено" и "меньше кода - меньше уязвимостей", поэтому дефолтный ksh я менять ни на что не хочу, тем более, что я весьма удобно заточил его под свои нужды (подробности можно поискать здесь по тегу "ksh").
И вообще, я использую Midnight Commander не то чтобы на постоянной основе - редко, откровенно говоря, использую (чтоб с комфортом по архивам блуждать да по SFTP много файликов перекидывать в основном) - но устанавливаю абсолютно всегда, что на десктопе, что на сервере. Потому что... потому что впитанные с детства привычки и навыки остаются на всю оставшуюся жизнь - а я таки начинал освоение ПК-мира с MS-DOS и Norton Commander. Ну ладно, вру: на самом деле с IBM PC-DOS (который был полностью совместим с DOS от мелкомягких, но круче - например, там по дефолту шел в базовой системе интерпретатор довольно любопытного языка REXX). И да, не Norton Commander, а вовсе даже Volkov Commander - стремительный и смешных размеров клон классического нортоновского двухпанельника на ассемблере и с некоторыми дополнительными фишками. А потом и вовсе DOS Navigator - где кроме файлового двухпанельника была многозадачность, куча встроенных приложений (я помню табличный процессор, в котором я вел личную бухгалтерию, калькулятор и тетрис - но так-то их было много больше). И да, еще со времен DOS Navigator я наконец-то отвык от сине-белой (выедающей глаза на CRT-мониторах) расцветки и с тех пор исопльзую что-нибудь темнее и спокойнее...
В общем, захотелось мне в связи с этой новостью стряхнуть, так сказать, пыль со старины Midnight Commander и со своих персональных навыков в области настройки и использования оного. На всеобъемлющее руководство не претендую, ниже будет, скажем так, моя личная работа над ошибками.
Перво-наперво, нужно обновленную версию установить. В портах OpenBSD (даже и в CURRENT) mc лежит всё еще версии 4.8.31, не торопятся майнтейнеры порта обновляться. Ну да и фиг бы с ними, никто же не мешает попробовать собрать новую версию руками? Поехали (не забудем только прежде doas pkg_delete mc
сделать для удаления имеющейся версии):
git clone https://github.com/MidnightCommander/mc.git
В скачанных сорцах находится файл INSTALL, описывающий необходимые зависимости - лично мне пришлось доустановить gettext и libtool, а всё прочее и так было в наличии (в портах OpenBSD всё доступно). Ну а дальше, в принципе, можно обойтись даже банальным (подробнее см. тот же файл INSTALL и README):
./autogen.sh && ./configure && make && doas make install
Тут, правда, есть один нюанс, специфичный для OpenBSD - как следует из ./configure.ac
, если оказывается, что присутствующая в системе утилита file
не поддерживает ключ -z
типа для возможности анализа сжатых файлов, то при конфигурировании будет выбрана опция "не использовать file вообще". Почему - для меня загадка (это даже не единственная проверяемая опция file, но вот отсутствие поддержки остальных почему-то воспринимается адекватно, и только отсутствие -z
трактуется как "не использовать file" - ну вот чем оно может быть так критично?). Я пытался в ./configure.ac
эту проверку выпилить, но оно потом при компиляции все равно падает - похоже, вызов file -z
там прямо захардкожен где-то.
В общем, это не трагедия нифига - утилита file используется для определения типов файлов, и для поддержки действий в зависимости от типа файла нужно будет лишь поправить ~/.config/mc/mc.ext.ini
, заменяя в нужных случаях что-нибудь вроде:
[jpeg]
Type=^JPEG
Include=image
на что-нибудь типа:
[jpeg]
Regex=\\.(jpg|jpeg)$
RegexIgnoreCase=true
Include=image
ну или даже просто на Shell=.jpg
(вообще, синтаксис этого файла довольно всратый, но примеры и описание достаточно наглядны). Потому что вот это самое "Type=" определяется с использованием утилиты file. В общем, правим там, где нам нужно - и получаем адекватную обработку файлов разных типов через xgd-open (или поиск вменяемых альтернатив, для чего у mc любопытные скрипты напилены). И вот этим, кстати - использованием xdg-open по умолчанию и вменяемостью альтернатив - mc выгодно отличается от тоже двухпанельного файлового мендежера vifm, где дефолты совершенно безумные и нужна долгая-долгая обработка напильником... Кстати, если редактировать файл расширений через F9-Commands-Edit extension file...
, то файл будет перечитываться при сохранении без необходимости перезапуска mc.
Но продолжим. Мы собрались, установились, запустились - и радостно топчем Ctrl+o. О да, в отличие от прошлой версии, в 4.8.33 корректно открывается сабшелл ksh. Мне, правда, показалось удобным иметь в приглашении шелла какой-нибудь наглядный признак, показывающий, что мы находимся в сабшелле внутри mc, и я отредактировал правила настройки приглашения в ~/.kshrc
следующим образом:
# colored promt that looks near to Monokai Classic theme
_PID=$$
_XTERM_TITLE='\[\033]0;\u@\w:\w\007\]'
_PS1_CLEAR='\[\033[0m\]'
_PS1_YELLOW='\[\033[38;5;221m\]' # E6DB74
_PS1_BLUE='\[\033[38;5;81m\]' # 66D9EF
_PS1_GREEN='\[\033[38;5;148m\]' # A6E22E
_PS1_RED='\[\033[38;5;197m\]' # F92672
_PS1_PURPLE='\[\033[38;5;141m\]' # AE81FF
_PS1_WHITE='\[\033[38;5;255m\]' # F8F8F2
case "$(id -u)" in
0) _PS1_COLOR="$_PS1_RED" ;;
*) _PS1_COLOR="$_PS1_GREEN" ;;
esac
if [ -z "$MC_SID" ]; then
PS1="$_XTERM_TITLE$_PS1_YELLOW\t$_PS1_CLEAR $_PS1_BLUE\w $_PS1_COLOR\$$_PS1_CLEAR "
else
PS1="$_XTERM_TITLE$_PS1_YELLOW\t$_PS1_CLEAR $_PS1_BLUE\w $_PS1_COLOR\$$_PS1_CLEAR $_PS1_PURPLE[mc]$_PS1_CLEAR "
fi
Так, теперь поднастроим немного сам mc. Прежде всего, я убрал командную строку под панельками, потому как мне и удобнее, и привычнее пользоваться полноценным шеллом (теперь доступным!), открываемым по Ctrl+o, а не этим недоразумением, где даже автокомплит реализован весьма неудобно. Если вдруг понадобится ее включить (и снова выключить), то легко запомнить довольно мнемоничное сочетание клавиш "F9,o,l,p,o"
А главное, если убрать командную строку под панельками, мы чудесным образом сможем перемещаться без тыкания стрелочек "вниз-вниз-вниз...", а просто начав набирать имя нужного каталога/файла, если вдруг набрал что-то не то - просто Esc. Офигенно удобно и быстро, почему я не делал этого раньше? Кстати, это та причина, по которой я счел новоявленную "vim-раскладку в mc" отстоем - там перемещаться предполагается традиционным "h-j-k-l", что лишает смысла способ перемещения просто вводя имя. Не, ну если уж очень хочется - то можно не убирать командную строку и просто каждый раз нажимать Alt+s для начала "перемещения по вводу", но мне вот не хочется.
Далее: в меню Options - Panel options находим и включаем "Lynx-like motion" - это позволяет возвращаться в родительский каталог по стрелке влево (вместо Ctrl+PgUp или что там по дефолту), и переходть в каталог под курсором по стрелке вправо (ну хотя тут Enter привычнее же). Кстати, если по Alt+t переключить панель в многостолбцовый режим, то там стрелки влево-вправо будут работать как обычно, ожидаемо.
Что еще я приучаю себя запомнить? "Quick cd" для быстрого перехода в известную локацию, когда проще ввести путь, чем шествовать по цепочке подкаталогов. Там, кстати, автодополнение вполне рабочее - по Alt-Tab, еще иногда удобно воспользоваться историей переходов (Alt+Shift+H). Ну и, разумеется, настроить закладки (Ctrl+\) для всех часто используемых каталогов, локальных и удаленных. Так перемещение будет еще стремительнее.
Что мне еще требуется часто? Скажем, сортировать содержимое каталога по времени модификации. Тут заклинание тоже довольно мнемоничное: F9,l,s,m
(в голове звучит "menu-left-sort-mod" ну или "...-right-...", если панель правая).
Далее: в Options - Configuration я всегда снимаю чекбокс "Use internal edit", чтобы вместо безблагодатного mcedit использовался твой любимый текствой редактор из переменной окружения EDITOR. А вот "Use internal view" я оставляю - потому что дефолтный вьюер mc имеет крайне ценный режим редактирования просматриваемого файла в шестнадцатеричном виде: нажимаем F3 для просмотра файла, потом F4 для перехода в Hex-режим, и F2 для редактирования (доступен поиск и переходы). Я понимаю, что есть и другие шестнадцатеричные редакторы, и, возможно, даже более удобные, но мне нравится вот этот вариант.
Что еще я сравнительно часто делаю в mc? Создание нового текстового файла: Shift+F4, вводим имя и сразу открывается редактор. А Alt+Shift+E выдает список недавно редактировавшихся файлов, тоже бывает очень удобно, когда правишь одни и те же конфиги часто.
Ну, понятно, всякое там Ctrl+x,q
для быстрого просмотра, Ctrl+x,i
для просмотра информации о файле (я так привык права на файлы смотреть, например, хотя и знаю про альтернативы). Alt+i
еще (мнемотехника: "идентично") - делает текущую панель копией второй.
Перечисленное выше, еще раз, не руководство пользователя и не шпаргалка по хоткеям (их и так полно в интернетах) - это приемы, которыми лично я ускоряю работу в mc. Ускоряю то, что я в силу много-много-многолетних привычек делал недостаточно эффективно.
В общем, юноши и девушки, активнее овладевайте друг другом! Ой, то есть, я хотел сказать: юниксоиды, активнее овладевайте традиционными инструментами, проверенными годами и поколениями. Не консолью же единой, ага.