[ Content | View menu ]

Комфортная работа в Midnight Commander

Опубликовано 08.09.2011

Многие мои коллеги принципиально игнорируют Midnight Commander, предпочитая работать в командной строке. Мотивируют это целым рядом причин, начиная с «нортон коммандер устарел еще в 1995 году» и заканчивая «я юниксоид с 1970 года и без всяких mc прекрасно управляюсь в консоли». Конечно же, это дело вкуса, и можно (и нужно!) настроить консоль под себя так, чтобы она летала со скоростью мысли: на помощь приходят команда alias, сочетание Ctrl+R, описание команды shopt в builtins(1), пакет bash_completion или его аналоги, ряд мелких хаков, наподобие такого, или альтернатива в виде zsh, в конце концов.

Однако визуалам типа меня удобнее постоянно иметь перед глазами списки файлов и папок, а не помнить, какой файл где находится и что здесь есть еще. Кроме того, пользуясь исключительно командами cd и ls --color, можно легко проглядеть что-нибудь ненужное, типа оставшихся от vim бэкапов в текущем каталоге (если бэкапы нужны, см :help backupdir) или папок с именем из пробела.

Конечно, сначала mc производит немного гнетущее впечатление, но если разобраться и привыкнуть, то может оказаться, что даже с конфигурацией из коробки он очень облегчает жизнь разработчика и системного администратора. Поделюсь собственными хитростями, используемыми каждый день. За кадром осталось еще множество интересных фич, типа кастомной раскраски файлов в панели, смены цветовой схемы на черно-зеленую, сниппетов в редакторе mcedit, настраиваемых VFS, но поскольку я ими не пользуюсь, то ничего про них не скажу. Примеры их настроек и использования можно посмотреть в /etc/mc и в /usr/share/mc.

Сначала полезные мелочи, для многих очевидные.

  • Если до mc по каким-то причинам не доходят коды кнопок Fn, их можно заменить Esc-n. А Alt, иногда перехватываемый панелью меню, успешно заменяется кнопкой Esc
  • Режим просмотра файлов «Full file list» лучше, чем «Short file list». При желании можно добавить туда показ прав на объекты файловой системы, например:
    half type name | size | mtime | mode:3
  • Панели подсказок над и под командной строкой внизу и меню сверху можно отключить в Options — Layout, будет больше пространства для списка файлов. Заодно там можно включить отображение свободного места в текущем разделе — очень полезно для нетбуков с мелкими экранами
  • При навигации по списку файлов сочетание Ctrl+S перекидывает на файл, начинающийся с вводимых символов
  • Alt+Y перекидывает в предыдущую папку. Иногда это бывает полезно при восстановлении после ошибки «The shell is already running the command», за все время существования mc ставшей его визиткой
  • Встроенный редактор ужасен. В ~/.bashrc добавьте строчку export EDITOR=vim, а в пункте меню Options — Configuration снимите галку «Use internal editor». Точно так же можно использовать переменную окружения PAGER=view для просмотра файлов (опция «Use internal view»)
  • Alt+I покажет текущую папку в противоположной панели, а Alt+O — папку под курсором, а если под курсором файл, то родительскую.
  • Начиная с ветки midnight commander 4.7.1, в меню сортировки появилась сортировка по версиям, она работает точно так же, как ls -v, т.е. показывает список 1.2.1, 1.2.2, 1.2.10 именно в этом порядке, а не в алфавитном (1.2.1, 1.2.10, 1.2.2). Сам делал :).
  • Ctrl+X c — просмотр и редактирование прав на файл
  • Ctrl+X d — три варианта сравнения двух каталогов: быстрое (по спискам файлов), по размерам (то же самое, только с учетом размеров), полное (по содержимому файлов)
  • Alt+C — быстрый переход в нужную папку без изменения командной строки. По Esc-Tab показывает список подстановки (в командной строке mc Esc-Tab тоже иногда работает)
  • По Ctrl+\ имеется многоуровневое меню быстрого доступа к папкам, в т.ч. и через FTP и SSH. При желании его можно отредактировать вручную в ~/.mc/hotlist

На данный момент самой полезной фичей для меня является пользовательское меню. Про него я уже писал пару раз (1, 2), сейчас расскажу более подробно.

Я поддерживаю несколько сайтов под mod_perl, и после изменений в коде startup.pl необходимо перезапускать процесс apache, свой для каждого сайта. Каждый сайт находится в /home/sites/sitename, а конфиг apache для этих сайтов — в /usr/local/apache/conf/httpd-sitename.conf.

Когда мне надоело вручную писать /usr/local/apache/bin/apachectl-sitename restart после каждого изменения, в ~/.mc/menu добавились строчки:

s Restart apache for sitename
   sudo /usr/local/apache/bin/apachectl-sitename restart

Первая строка задаёт быструю клавишу и название пункта меню, а все за ней следующее — команду, в которой можно использовать ряд макро-подстановок:

  • %f — имя файла под курсором, %x — расширение, %b — имя файла без расширения
  • %d — каталог в активной панели, %D — каталог в неактивной панели
  • %t — выбранные файлы в активной панели, %T — в неактивной

и т.д.

Потом появилось еще пять подобных пунктов, для каждого сайта. В конце концов, мне надоело выбирать стрелками нужную команду или искать в длинном списке, какая буква соответствует соответствует нужному пункту. Внимательно перечитав справку, появляющуюся при нажатии F1 в меню F2, добавил еще по строчке к каждому определению пункта меню:

+= d /home/sites/sitename | f httpd-sitename.conf
s Restart apache for sitename
   sudo /usr/local/apache/bin/apachectl-sitename restart

Первый символ «=» означает начало условия, при котором пункт меню становится активным по умолчанию (при вызове меню курсор уже стоит на этом пункте, так что остаётся только нажать Enter); если перед ним стоит +, то пункт появляется в меню только при выполнении этого условия. Следующий символ — тип условия, например:

  • f шаблон — имя файла соответствует шаблону (если в начале файла меню не указана опция shell_patterns=0, то под шаблоном имеется в виду шелл-шаблон, в противном случае — регулярное выражение)
  • d шаблон — текущий каталог соответствует шаблону
  • t type — то, что под курсором, имеет тип:
    • n не является директорией
    • r обычный файл
    • d каталог
    • l ссылка
    • c последовательное устройство
    • b блочное устройство
    • f FIFO
    • s сокет
    • x исполняемый файл
    • t отмеченный файл

    Различные типы можно комбинировать, например, t rdl означает файл, каталог или ссылку

  • остальные тесты можно подсмотреть в упомянутой справке

Условия можно комбинировать и объединять, например:

# если находимся в папке /home/sites/sitename и под курсором — файл .sql, показать этот пункт меню
+= d /home/sites/site_name & f *.sql
S import sql-file to database sitedb
   mysql sitedb < %f

Таким образом, приведенный ранее кусок означает «если находимся в каталоге сайта или стоим на конфигурационном файле apache для него, показать команду перезапуска сервера и встать на нее курсором».

Остальное — дело фантазии и техники. Достаточно подумать о том, какие рутинные действия выполняются достаточно часто, и просто автоматизировать их.

«
»

3 комментария

Write a comment - TrackBack - RSS Comments

  1. Comment by Dr.AKULAvich:

    Отличные рецепты. Про самописное меню и не подозревал, буду знать на будущее :-)
    Добавлю ссылку в пост о клавиатурных сочетаниях mc.

    А почему ты стороннюю кнопку для твиттера используешь?

    09.09.2011 @ 12:02
  2. Comment by bappoy:

    > Добавлю ссылку в пост о клавиатурных сочетаниях mc.
    Спасибо.

    > а почему ты стороннюю кнопку для твиттера используешь?
    нет ни желания снова разбираться в плагинах вордпресс, ни времени написать что-то своё :(

    09.09.2011 @ 12:55
  3. Comment by Alexey Korepov:

    Я смотрю Вы имеете очень хороший опыт работы с mc, может подскажете тогда как можно решить вот такие проблемы:

    1. В Ubuntu если загрузиться в консоли (без Xorg) то почему-то не работают некоторые хоткеи, например Shift+F5, Shift+F6 – они срабатывают как будто я просто нажал F5 или F6.

    Причем Ctrl+O и комбинации вида Shift+стрелка_вверх работают нормально (т.е. кнопка Shift работают(

    2. Если открыть редактирование файла через mcedit (кнопкой F4), то комбинация Ctrl+O работает (отображает содержимое консоли на экране) но не дает ввести команду. В режиме просмотра файла (кнопкой F3) все работает нормально. Эту проблему можно как-то победить?

    Сменить на vim просьба не предлагать, я из тех людей для которых vim имеет 2 режима работы :)

    03.12.2013 @ 21:59
Write comment

Я не робот.