<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bappoy&#039;s blog &#187; mc</title>
	<atom:link href="http://bappoy.pp.ru/tag/mc/feed" rel="self" type="application/rss+xml" />
	<link>http://bappoy.pp.ru</link>
	<description>Линуксоид на велосипеде с моторчиком</description>
	<lastBuildDate>Fri, 02 Dec 2011 11:44:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Комфортная работа в Midnight Commander</title>
		<link>http://bappoy.pp.ru/2011/09/08/mc.html</link>
		<comments>http://bappoy.pp.ru/2011/09/08/mc.html#comments</comments>
		<pubDate>Thu, 08 Sep 2011 13:28:49 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[mc]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=1026</guid>
		<description><![CDATA[<p>Многие мои коллеги принципиально игнорируют Midnight Commander, предпочитая работать в командной строке. Мотивируют это целым рядом причин, начиная с &laquo;нортон коммандер устарел еще в 1995 году&raquo; и заканчивая &laquo;я юниксоид с 1970 года и без всяких mc прекрасно управляюсь в консоли&raquo;. Конечно же, это дело вкуса, и можно (и нужно!) настроить консоль под себя так, чтобы она летала со скоростью мысли: на помощь приходят команда alias, сочетание Ctrl+R, описание команды shopt в builtins(1), пакет bash_completion или его аналоги, ряд мелких хаков, наподобие <a href="http://bappoy.pp.ru/2008/11/17/quick-call-ssh.html">такого</a>, или альтернатива в виде zsh, в конце концов.</p>
<p>Однако визуалам типа меня удобнее постоянно иметь перед глазами списки файлов и папок, а не помнить, какой файл где находится и что здесь есть еще. Кроме того, пользуясь исключительно командами <code>cd</code> и <code>ls --color</code>, можно легко проглядеть что-нибудь ненужное, типа оставшихся от vim бэкапов в текущем каталоге (если бэкапы нужны, см <code>:help backupdir</code>) или папок с именем из пробела. </p>
<p>Конечно, сначала mc производит немного гнетущее впечатление, но если разобраться и привыкнуть, то может оказаться, что даже с конфигурацией из коробки он очень облегчает жизнь разработчика и системного администратора. Поделюсь собственными хитростями, используемыми каждый день. За кадром осталось еще множество интересных фич, типа кастомной раскраски файлов в панели, смены цветовой схемы на черно-зеленую, сниппетов в редакторе mcedit, настраиваемых VFS, но поскольку я ими не пользуюсь, то ничего про них не скажу. Примеры их настроек и использования можно посмотреть в /etc/mc и в /usr/share/mc.</p>
<p>Сначала полезные мелочи, для многих очевидные.<br />
<!--more--></p>
<ul>
<li>Если до mc по каким-то причинам не доходят коды кнопок Fn, их можно заменить Esc-n. А Alt, иногда перехватываемый панелью меню, успешно заменяется кнопкой Esc
</li>
<li>Режим просмотра файлов «Full file list» лучше, чем «Short file list». При желании можно добавить туда показ прав на объекты файловой системы, например:
<pre>half type name | size | mtime | mode:3</pre>
</li>
<li>Панели подсказок над и под командной строкой внизу и меню сверху можно отключить в Options — Layout, будет больше пространства для списка файлов. Заодно там можно включить отображение свободного места в текущем разделе — очень полезно для нетбуков с мелкими экранами</li>
<li>При навигации по списку файлов сочетание <b>Ctrl+S</b> перекидывает на файл, начинающийся с вводимых символов</li>
<li><b>Alt+Y</b> перекидывает в предыдущую папку. Иногда это бывает полезно при восстановлении после ошибки «The shell is already running the command», за все время существования mc ставшей его визиткой</li>
<li>Встроенный редактор ужасен. В ~/.bashrc добавьте строчку <code>export EDITOR=vim</code>, а в пункте меню Options — Configuration снимите галку «Use internal editor». Точно так же можно использовать переменную окружения PAGER=view для просмотра файлов (опция «Use internal view»)</li>
<li><b>Alt+I</b> покажет текущую папку в противоположной панели, а <b>Alt+O</b> — папку под курсором, а если под курсором файл, то родительскую.</li>
<li>Начиная с ветки midnight commander 4.7.1, в меню сортировки появилась сортировка по версиям, она работает точно так же, как <code>ls -v</code>, т.е. показывает список 1.2.1, 1.2.2, 1.2.10 именно в этом порядке, а не в алфавитном (1.2.1, 1.2.10, 1.2.2). Сам делал :).</li>
<li><b>Ctrl+X c</b> — просмотр и редактирование прав на файл</li>
<li><b>Ctrl+X d</b> — три варианта сравнения двух каталогов: быстрое (по спискам файлов), по размерам (то же самое, только с учетом размеров), полное (по содержимому файлов)</li>
<li><b>Alt+C</b> — быстрый переход в нужную папку без изменения командной строки. По Esc-Tab показывает список подстановки (в командной строке mc Esc-Tab тоже иногда работает)</li>
<li>По <b>Ctrl+\</b> имеется многоуровневое меню быстрого доступа к папкам, в т.ч. и через FTP и SSH. При желании его можно отредактировать вручную в <b>~/.mc/hotlist</b></li>
</ul>
<p>На данный момент самой полезной фичей для меня является пользовательское меню.  Про него я уже писал пару раз (<a href="http://bappoy.pp.ru/2009/06/18/mc-tricks.html">1</a>, <a href="http://bappoy.pp.ru/2011/06/25/mc-unc-path.html">2</a>), сейчас расскажу более подробно.</p>
<p>Я поддерживаю несколько сайтов под mod_perl, и после изменений в коде startup.pl необходимо перезапускать процесс apache, свой для каждого сайта. Каждый сайт находится в /home/sites/sitename, а конфиг apache для этих сайтов — в /usr/local/apache/conf/httpd-sitename.conf.</p>
<p>Когда мне надоело вручную писать /usr/local/apache/bin/apachectl-sitename restart после каждого изменения, в ~/.mc/menu добавились строчки:</p>
<pre>s Restart apache for sitename
   sudo /usr/local/apache/bin/apachectl-sitename restart</pre>
<p>Первая строка задаёт быструю клавишу и название пункта меню, а все за ней следующее — команду, в которой можно использовать ряд макро-подстановок:</p>
<ul>
<li><b>%f</b> — имя файла под курсором, <b>%x</b> — расширение, <b>%b</b> — имя файла без расширения</li>
<li><b>%d</b> — каталог в активной панели, <b>%D</b> — каталог в неактивной панели
</li>
<li><b>%t</b> — выбранные файлы в активной панели, <b>%T</b> — в неактивной</li>
</ul>
<p>и т.д.</p>
<p>Потом появилось еще пять подобных пунктов, для каждого сайта. В конце концов, мне надоело выбирать стрелками нужную команду или искать в длинном списке, какая буква соответствует соответствует нужному пункту. Внимательно перечитав справку, появляющуюся при нажатии F1 в меню F2, добавил еще по строчке к каждому определению пункта меню:</p>
<pre>+= d /home/sites/sitename | f httpd-sitename.conf
s Restart apache for sitename
   sudo /usr/local/apache/bin/apachectl-sitename restart</pre>
<p>Первый символ &laquo;=&raquo; означает начало условия, при котором пункт меню становится активным по умолчанию (при вызове меню курсор уже стоит на этом пункте, так что остаётся только нажать Enter); если перед ним стоит +, то пункт появляется в меню только при выполнении этого условия. Следующий символ — тип условия, например:</p>
<ul>
<li><b>f шаблон</b> — имя файла соответствует шаблону (если в начале файла меню не указана опция shell_patterns=0, то под шаблоном имеется в виду шелл-шаблон, в противном случае — регулярное выражение)</li>
<li><b>d шаблон</b> — текущий каталог соответствует шаблону</li>
<li><b>t type</b> — то, что под курсором, имеет тип:
<ul>
<li>n не является директорией</li>
<li>r обычный файл</li>
<li>d каталог</li>
<li>l ссылка</li>
<li>c последовательное устройство</li>
<li>b блочное устройство</li>
<li>f FIFO</li>
<li>s сокет</li>
<li>x исполняемый файл</li>
<li>t отмеченный файл</li>
</ul>
<p>Различные типы можно комбинировать, например, <code>t rdl</code> означает файл, каталог или ссылку</li>
<li>остальные тесты можно подсмотреть в упомянутой справке</li>
</ul>
<p>Условия можно комбинировать и объединять, например:</p>
<pre>
# если находимся в папке /home/sites/sitename и под курсором — файл .sql, показать этот пункт меню
+= d /home/sites/site_name &amp; f *.sql
S import sql-file to database sitedb
   mysql sitedb &lt; %f
</pre>
<p>Таким образом, приведенный  ранее кусок означает &laquo;если находимся в каталоге сайта или стоим на конфигурационном файле apache для него, показать команду перезапуска сервера и встать на нее курсором&raquo;. </p>
<p>Остальное — дело фантазии и техники. Достаточно подумать о том, какие рутинные действия выполняются достаточно часто, и просто автоматизировать их.</p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2011/09/08/mc.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Конвертация Unix-style путей в UNC в Midnight Commander</title>
		<link>http://bappoy.pp.ru/2011/06/25/mc-unc-path.html</link>
		<comments>http://bappoy.pp.ru/2011/06/25/mc-unc-path.html#comments</comments>
		<pubDate>Sat, 25 Jun 2011 11:19:14 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[mc]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=970</guid>
		<description><![CDATA[<p>Тестовые релизы нашего продукта мы выкладываем в шару \\fs\testing, а готовые сборки и обновления для клиентов — в \\fs\release. У меня эти шары примонтированы соответственно как /mnt/testing и /mnt/release, и при составлении писем о выпуске релиза приходится вручную менять пути вида /mnt/testing/product/version_major/version_minor на \\fs\testing\product\&#8230; </p>
<p>Однажды мне это надоело и я добавил такую запись в ~/.mc/menu:</p>
<pre>+ d /mnt/
p   Copy path in windows format to clipboard
    pwd|perl -ne 's|^/([^/])|//\1|g; s|/mnt/(products\|testing)|/fs/\1|g; s|/|\\|g;print'|xclip &#038;</pre>
<p>Теперь, если текущий каталог в Midnight Commander начинается на &laquo;/mnt/&raquo;, в меню F2 появляется пункт &laquo;Convert path to windows format&raquo;, при активации которого в буфер обмена помещается &laquo;правильный&raquo; UNC-путь к текущему каталогу.</p>
<p>О том, почему в Windows используются неправильные слэши, можно узнать из <a href="http://habrahabr.ru/blogs/testing/120652/">этой статьи</a>.</p>
<p><em>Заметка из черновиков годовой давности, сейчас выкладываю другие релизы в другие шары :)</em></p>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2011/06/25/mc-unc-path.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Мелкие хитрости midnight commander</title>
		<link>http://bappoy.pp.ru/2009/06/18/mc-tricks.html</link>
		<comments>http://bappoy.pp.ru/2009/06/18/mc-tricks.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 17:12:20 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[diff]]></category>
		<category><![CDATA[mc]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[vimdiff]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/?p=708</guid>
		<description><![CDATA[<p>Из /usr/share/doc/mc/README.Debian:<br />
- если в истории команд mc постоянно присутствуют строки вида <code>cd "`printf "%b" '\0057home'`"</code>, убедитесь, что в переменной окружения <code>HISTCONTROL</code> присутствует ignorespace или ignoreboth, или же эта переменная вообще отсутствует. Подробности в <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=440102">debian bug 440102</a>.<br />
- действие, с незапамятных времен выполнявшееся по кнопкам M-O (в противоположной панели отобразить путь в текущей панели), с 4.6.2-pre1 пор переехало на M-I, а на M-O теперь отображение в другой панели родительского каталога, или каталога, находящегося под курсором. Эргономично, да, но очень непривычно. Кстати, русскоязычная справка, вызываемая по F1, описывает старое поведение. </p>
<hr />
У нас есть несколько папок с однотипными объектами вида 1.1.1.1, 1.1.1.2, &#8230;, 1.1.1.10, 1.1.1.11, &#8230;, 1.4.3.5, 1.4.3.9, 1.4.3.10 &#8230;. Опытные разработчики уже, наверно, догадались, к чему я клоню :) При обычной алфавитно-цифровой сортировке 1.1.1.10 следует после 1.1.1.1, но до 1.1.1.2, что очень неприятно. У GNU-версии ls есть специальная опция -v, которая как раз выводит файлы в порядке возрастания версий. А в mc ничего похожего, увы, нет.</p>
<p>За 10 минут сделал <a href="http://mc.redhat-club.org/cms/forum/viewthread.php?thread_id=146">патч</a>, добавляющий вариант &laquo;сортировать файлы по версии&raquo; в меню выбора режима сортировки. К сожалению, простой правкой конфига тут обойтись не получилось, поэтому пришлось пересобрать пакет mc целиком — еще 40 минут, но оно того стоило :-)</p>
<hr />Мегаполезной фичей вдруг оказалось пользовательское меню, которым я раньше почти никогда не пользовался (наверно, потому, что там ничего полезного не было — ну на кой мне &laquo;распаковать архив&raquo;, если я то же самое сделаю тремя привычными способами). Прочитав раздел справки про mc.menu и добавив в ~/.mc/menu несколько строчек, я сэкономил себе кучу времени, тратившегося на бесконечные  </p>
<pre>vimdiff Alt-A Alt-Enter Tab Alt-A Alt-Enter Enter</pre>
<p>и </p>
<pre>diff -rubB Alt-A  Tab Alt-A Enter</pre>
<p>Этот код добавляет в меню две команды: сравнения двух каталогов и мержа файла в одном каталоге с одноименным файлом в другом каталоге:</p>
<pre>d   Compare directories
    if [ "%d" = "%D" ]; then
      whiptail --msgbox "The two directores must be different" 7 60
      exit 1
    fi
    diff -rubB "%d" "%D" | vim -

# обычный непомеченный файл
+ t r &#038; ! t t
f   Diff &#038; merge file under cursor with the same file in other panel
    if [ "%d" = "%D" ]; then
        # если в противоположной панели открыта та же папка
        whiptail --msgbox "The two directores must be different" 7 60
      exit 1
    fi
    if [ ! -f "%D/%f" ] ; then
       # если в противоположной панели нет файла с таким же именем
        whiptail --msgbox "No copy of %f in %D" 7 60
        exit 1
    fi
    if diff -q "%D/%f" "%d/%f" ; then
       # если файлы не различаются
        whiptail --msgbox "%D/%f and %d/%f are identical" 10 80
        exit 1
    fi
    vimdiff "%d/%s" "%D"</pre>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2009/06/18/mc-tricks.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Страна советов</title>
		<link>http://bappoy.pp.ru/2008/03/28/advice-country.html</link>
		<comments>http://bappoy.pp.ru/2008/03/28/advice-country.html#comments</comments>
		<pubDate>Thu, 27 Mar 2008 21:21:33 +0000</pubDate>
		<dc:creator>bappoy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[mc]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://bappoy.pp.ru/2008/03/28/advice/</guid>
		<description><![CDATA[<p>Иногда при работе в midnight commander появляется сообщение &laquo;The shell is already running the command&raquo;, не дающее выполнить команду в текущем каталоге. Стандартный способ обхода &#8212; Ctrl+O, Ctrl+C, Enter приводит к тому, что mc возвращается в каталог, где была выполнена предыдущая команда, и приходится еще раз переходить в нужный каталог. Проблема обсуждается чуть ли не с самого первого релиза mc, но по каким-то причинам принципиально не может быть решена.</p>
<p>В этом случае помогает выполнение команды &laquo;cd -&raquo; (после Ctrl+O, Ctrl+C, Enter, Ctrl+O), которая меняет каталог на предыдущий (т.е. в котором мы находились до первого Ctrl+O).</p>
<hr />В случае, если при сборке ядра была включена опция &laquo;Kernel .config support&raquo; (CONFIG_IKCONFIG), файл ядрёной конфигурации .config добавляется в бинарник ядра в гзипованном виде. А если дополнительно отметить еще и &laquo;Enable access to .config through /proc/config.gz&raquo; (CONFIG_IKCONFIG_PROC), то этот конфиг доступен через /proc/config.gz.Иногда хочется посмотреть, чем одно ядро отличается от другого в плане конфигурации, но перезагружаться или городить виртуальную машину ради того, чтобы посмотреть /proc/config.gz, не хочется. В таком случае помогут два скрипта, входящих в состав архива с исходными текстами ядра. Первый из них, служебный, называется binoffset и предназначен для определения смещения бинарного фрагмента от начала файла. Второй называется extract-ikconfig и служит непосредственно для поиска и извлечения из бинарника ядра гзипованного конфига. Перед запуском необходимо скомпилировать binoffset:</p>
<blockquote>
<pre lang="bash">cd /usr/src/linux/scripts
gcc -o binoffset binoffset.c</pre>
</blockquote>
<p>После чего можно натравливать extract-iconfig на ядро:</p>
<blockquote>
<pre lang="bash">scripts/extract-ikconfig /path/to/bzImage</pre>
</blockquote>
<hr />Регулярное чтение избранных частей из man bash просветляет и приносит несомненную пользу. Недавно поразил коллегу генератором паролей на основе <code>/usr/share/dict/words</code>:</p>
<blockquote>
<pre lang="bash">#!/bin/bash
passwords_count=3
test $1 &#038;&#038; echo $1 | grep -q ^[0-9]*$ &#038;&#038; passwords_count=$1

words=/usr/share/dict/words
words_count=3
symbols=("," "*" "-" "(" ")" "_" '"' ',' ',')

# prepare words array
declare -a allwords
exec 10< $words
while read LINE <&#038;10; do
    allwords[${#allwords[*]}]=$LINE
done

nwords=${#allwords[@]}

for ((k=0;$k<$passwords_count;k++));
do
    declare -a words_array
    for w in `seq 0 $words_count`; do
        words_array[${#words_array[*]}]=${allwords[$(($nwords*$RANDOM/32767))]}
    done

    passwd=${words_array[0]}
    for ((c=1;$c<${#words_array[@]}-1;c++));
    do
        symbol=${symbols[(($RANDOM*${#symbols[*]}/32767))]}
        passwd="${passwd}${symbol}${words_array[$c]}"
    done
    echo $passwd
    unset passwd
    unset words_array
done</pre>
</pre>
</blockquote>
]]></description>
		<wfw:commentRss>http://bappoy.pp.ru/2008/03/28/advice-country.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

