Поддержка PCRE в Midnight Commander
Многие наверняка пользуются, а многие другие — знают о существовании такой вещи, как GNU Midnight Commander, он же «mc». Также все, конечно, понимают, что Midnight Commander — преемник «Нортона», известного всем ещё со времён DOS. mc, как и «нортон», имеет встроенный редактор — mcedit, которому я обязан большей частью своего кода (пишу я в нём). :-)
Данная страница содержит описание уже устаревших (вместе с появлением версии mc 4.7.0) патчей для поддержки Perl-совместимых регулярных выражений в Midnight Commander. Для 4.7.0 тоже кое-что есть, но совсем чуть-чуть и только пока.
MC 4.8.0
Свершилось; патч для поддержки Escape-последовательностей в поле замены принят и уже включён в 4.8.0.
Однако, в 4.8.0 зачем-то поменяли поведение выделения мышкой и копирования в буфер обмена:
- При каждом клике мышкой выделение сбрасывается — неудобно, так как если копируешь не с помощью Ctrl-Ins Shift-Ins, а с помощью выделения и просто нажатия F5 — вообще не можешь перейти в новую позицию, ибо позиция сбрасывается. Патч для исправления — то есть, сброса выделения только при перетаскивании мыши (начале нового выделения).
- После нажатия Ctrl-Ins выделение больше не сбрасывается — непривычно, потому что раньше было по-другому, да и непонятно, зачем изменено. Видимо, чтобы быть похожим на гуёвые редакторы. В целом неудобно, потому что приходится делать лишние действия для снятия выделения. Патч для исправления.
Оба патча отправлены в https://www.midnight-commander.org/ticket/2530.
Однако, есть ещё один патч: mc-git20110403-rename-into-same-directory.diff. Если его применить, то при одном и том же каталоге, открытом на обеих панелях, диалог копирования/переименования файла будет по умолчанию подставлять в поле «куда» не путь, а имя файла. Это то, чего мне (а может быть, и не только мне) так не хватало в mc — удобства переименования файлов. Отправил патч в MC Ticket 2529.
О я блин дурак-то, а. Там есть Shift-F5, Shift-F6 для этого.
MC 4.7.0
Внимание! Начиная с версии 4.7.0 (например, её пререлиза) Midnight Commander сам по себе поддерживает Perl-совместимые регулярные выражения и отрефакторенный в лучшую сторону диалог поиска-замены. Единственные на данный момент недостатки:
- mc некорректно работает с символами в кодировке UTF-8.
- вместо библиотеки PCRE по умолчанию используется гномий Glib (в ней, в отличие от PCRE, поддержки UTF-8 вообще нет!).
- нет поддержки C-шных escape-последовательностей в строках замены (а это важная фича, по крайней мере, для меня).
- (не совсем по теме, но) «не показывать это снова» в диалоге проверки кодировки на старте mc отключает проверку кодировки, а надо бы, вообще-то, запоминать выбор пользователя и действовать так в дальнейшем, ибо диалог достаёт.
Для исправления этих недостатков, а также включения сборки Samba-плагина в Debian-версии mc 4.7.0-pre1-3 можно воспользоваться небольшим патчиком mc-4.7.0-pre1-3-minor.patch. Из патча поставлены баг 1881 и баг 1882.
Лирическое отступление
Вы (в особенности если вы — «аналитики ЛОРа» (c)), наверное, скажете, что mc — отстой, а mcedit — отстой вдвойне, что рулит vim, emacs или, не дай бог, nano какое-нибудь. Так вот, на это я сразу отвечу, что они, может, и рулят, но сделаны не людьми для людей, а извращенцами для извращенцев, и без траха-допиливания пользоваться ими невозможно.
Всё-таки удобно, не мучаясь, выходить из редактора по Alt-F4 или F10, переключать кодировки через пункты меню и горячие клавиши, вкладки закрывать по Ctrl-W, не вникать в понятия «буфера», в LISP и прочие радости. Если кто-то не понял, о чём я — напомню, что попадая в vim, сталкиваешься с серьёзным challenge’м, а точнее задачей: выйти из vim’а. Это удаётся не сразу. В конце концов, конечно, понимаешь, что нужно набрать <esc>, :q!, <enter>. Аналогично при необходимости переключить кодировку — конечно, команда <esc>, «:e ++enc=cp1251», <enter> в конце концов будет найдена и, возможно, даже освоена, но … Да, кстати, она к тому же ещё и файл заново открывает.
«Для бедных» есть, конечно, cream (набор макросов для vim’а) — и выглядит, и работает он куда логичнее, но всё-таки то, что он является именно набором макросов, провоцирует кучу весьма неприятных мелких багов: не работают быстрые клавиши в русской раскладке, окно почему-то на весь экран не разворачивается, при каждом запуске кроме того становясь меньше на пару строк, и т. п. И уж конечно, ощущения «гладкости», которое появляется при работе, например, в emEditor-е под виндой, или даже просто в консоли, нет совсем. Про emacs и говорить нечего. Оно расшифровывается как «editing macros» и действительно представляет собой один большой макрос… на Common LISP’е, который, вопреки распространённому мнению, совсем не функциональный язык программирования. В emacs даже есть встроенный психотерапевт… Для тех кто не знает — напомню: это не шутка, а реальная «фича» емакса — в нём есть эмулятор психотерапевта. Сомневаетесь? Введите <alt>-x doctor <enter>. Если хотите — да, меня укусила и заразила винда, но всё равно обычный, нормальный, редактор со вкладочками, менюшками и шорткатами для меня удобнее.
Именно по той причине, что мне хочется иметь простой удобный редактор, я и использую mcedit. Я готов, кстати, высказать и другие требования к текстовому редактору:
- подсветка синтаксиса,
- регулярные выражения,
- вкладки,
- различные кодировки, и желательно:
- возможность выделения вертикального блока.
1) и 5) mcedit умеет и без меня, 3) и 4) решаются использованием Konsole, а вот с 2) в оригинале туговато (до 4.7.0). Будучи Perl-программистом, я испытываю отвращение при одном виде классических регулярных выражений POSIX: не умеют они… можно сказать, ничего. Довольно мистическая опция «выражение scanf» отвращения только добавляет. Поэтому с пунктом 2) миднайту пришлось помогать…
Реализация
…используя библиотеку PCRE, что означает «Perl-Compatible Regular Expressions» — «Perl-совместимые регулярные выражения». Для тех, кто вообще не знаком с регулярными выражениями Perl, советую почитать страницу man 1 perlre, а также поинтересоваться сайтом pcre.ru. Если вкратце, то регулярные выражения — это очень удобный и эффективный инструмент поиска, извлечения и замены информации в тексте.
Сами изменения заключаются в том, что с ними mc в просмотрщике и редакторе вместо POSIX-регэкспов использует PCRE, что больше нету опции «выражение scanf» и необходимости ввода порядка аргументов замены, а при выборе в диалоге замены опции «регулярное выражение» строка замены может включать в себя подстановки $& = $0 = ${&} (вся найденная строка), $1 = ${1} .. $63 = ${63} (захваченные скобочками совпадения), \$ (экранированный в C-стиле символ '$'), а также стандартные escape-последовательности \n, \r, \t, \v, \b, \f и \a. Все эти возможности успешно работают как с однобайтными кодировками, так и с UTF-8, и даже регистронезависимость во втором случае учитывается корректно, относительно всех алфавитов мира сразу. :-)
Итак, на данной странице, кроме описания благородной цели запатчить Midnight Commander для поддержки PCRE, :-) есть и сами патчи — для версий 4.6.1-6 (Debian Etch), 4.6.2~git20080311 (Debian Lenny), и 4.6.2-2 (Debian Sid). Для других дистрибутивов патчей, увы, нет. Связано это, в первую очередь, с тем, что Debian включает в себя вагон и маленькую тележку патчей для mc, дающих возможность нормально работать в UTF-кодировках, исправляющих различные ошибки, и т. д. и т. п. Если вы перенесёте мои патчи под другие версии mc или под другие дистрибутивы GNU/Linux (а может, и не ГНУ, а может, и не Linux) — я буду счастлив выложить на данной странице и их тоже.
Чтобы накатить любой из данных патчей на соответствующую версию mc и собрать бинарный deb-пакет с этой модифицированной версией, нужно выполнить следующие команды:
apt-get source mc cd mc-ВЕРСИЯ debian/rules apply-patches patch -p1 < mc-ВЕРСИЯ-pcre-patched.patch touch debian/stamp-patched touch debian/stamp-pre-build sudo debian/rules binary
То есть, данный патч должен накатываться после всех патчей Debian. Кстати, в последней команде фигурирует не fakeroot, а sudo, по той простой причине, что некоторые версии пакета в процессе сборки чего-то шаманят с CVS, несовместимое с fakeroot.
Файлы
Скачать патчи и готовые пакеты можно по адресу http://vmx.yourcmc.ru/mc-pcre/.
Доработки распространяются под условиями лицензии GNU GPL 2-й или более поздней версии.
Copyright © Виталий Филиппов, 2008—2009.