OS

Исправление некорректного отображения русских букв в Midnight Commander под Mac OS X

Обновление от 04.01.2010. Версия 4.7.0 из портов уже нормально поддерживает UTF-8, поэтому рекомендую ставить её, причём русские буквы отображаются даже при компиляции с ncurses, что даёт возможность отображать интерфейс “нормально”, а не ASCII-символами:

$ sudo port selfupdate
$ port variants mc
mc has the variants:
   ncurses: use ncurses screen library
     * conflicts with slang2
[+]slang2: use slang2 screen library
     * conflicts with ncurses
   universal: Build for multiple architectures
$ sudo port  install mc +ncurses
$ /opt/local/bin/mc -V
GNU Midnight Commander 4.7.0
Using the ncurses library
With internationalization support
With multiple codepages support

А для интереса можно почитать, как исправлялись русские буквы до 4.7.0.

Я уже давно заметил, что консольный файловый менеджер Midnight Commander неправильно работает с русскими буквами под Mac OS X. Но меня это особо не беспокоило, так как мне он нужен редко и с этой проблемой я могу спокойно смириться. Но сегодня @ex3m_su (очень рекомендую посмотреть социальную сеть ex3m для экстремальных людей, которую он создал - я там бываю регулярно) задал мне вопрос:

Подскажи, как наложить патч для MC из портов, он не воспринимает utf в интерфейсе {…}

MC из портов, плохо работает с русскими буквами, и я решил найти решение такому поведению:

Я начал с инструкции, подсказанной мне @ex3m (он проблему решил по ней) ”Сборка Midnight Commander 4.6.3 на Mac OS Leopard”, но при использовании рекомендованного “Screen library” mcslang по-прежнему были проблемы с кодировкой, и не отображались символы, формирующие интерфейс программы:

Поэтому я использовал slang. Учитывая то, что используемая сборка оказалась доступной только со страницы автора статьи, но не автора модификации, то для полноты картины я решил попробовать и официальную пререлизную сборку. Детали - ниже.

Подготовка

Ставим и удаляем mc через MacPorts для разрешения зависимостей.

$ port installed | grep mc
  mc @4.6.1_0 (active)
$ sudo port uninstall mc

Все действия будем производить в каталоге ~/tmp

mkdir ~/tmp
cd ~/tmp

Находим последние slang, gettext и libiconv:

wget http://www.sfr-fresh.com/unix/misc/slang-2.2.1.tar.gz
wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.17.tar.gz
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz

Раскручиваем архивы

tar xfz gettext-0.17.tar.gz
tar xfz libiconv-1.13.1.tar.gz
tar xfz slang-2.2.1.tar.gz

Компилируем и устанавливаем пакеты (они поставятся не в /opt/local, а в /usr/local, поэтому нужно будет проверить $PATH, чтобы /usr/local/bin стоял перед /opt/local/bin):

cd ~/tmp
cd gettext-0.17
./configure && make -j 4 && sudo make install
cd ..
cd libiconv-1.13.1
./configure && make -j 4 && sudo make install
cd ..
cd slang-2.2.1
./configure && make -j 4 && sudo make install
cd ..

Использование модифицированной сборки Midnight Commander 4.6.3

По оригинальному адресу модифицированного MC нет, берём с сайта автора статьи sudouser:

cd ~/tmp
wget http://sudouser.com/mc-4.6.3-r504.tar.bz2
tar xfp mc-4.6.3-r504.tar.bz2

Особенность (!) - в качестве “Screen library” используем не mcslang, а slang

cd ~/tmp
cd mc-4.6.3-r504
./configure --with-screen=slang --with-libiconv-prefix=/usr/local

Configuration:
  Screen library:             S-Lang library (installed on the system)
  Enable support for utf-8:   yes
  Enable support for charset: yes

make -j 4 && sudo make install

Информация по сборке:

ole-mac:mc-4.6.3-r504 ctrld$ /usr/local/bin/mc -V
GNU Midnight Commander 4.6.3
Virtual File System: tarfs, extfs, cpiofs, ftpfs, fish, smbfs
With builtin Editor
Using system-installed S-Lang library with terminfo database
With subshell support as default
With support for background operations
With mouse support on xterm
With internationalization support
With multiple codepages support
Data types: char 8 int 32 long 64 void * 64 off_t 64 ecs_char 8

Наслаждаемся нормальным отображением русских букв:

Midnight Commander 4.7.0 Pre 3

На сайте www.midnight-commander.org находим и списываем последнюю сборку mc 4.7.0-pre3

cd ~/tmp
wget http://www.midnight-commander.org/downloads/14
mv 14 mc-4.7.0-pre3.tar.bz2
tar xfp mc-4.7.0-pre3.tar.bz2

cd mc-4.7.0-pre3
./configure --with-screen=slang --with-libiconv-prefix=/usr/local --with-slang-includes=/usr/local --with-slang-libs=/usr/local

Configuration:
  Screen library:             S-Lang library (installed on the system)
  Support for charset:        yes

make -j 4 && sudo make install

Информация по сборке:

ole-mac:mc-4.7.0-pre3 ctrld$ /usr/local/bin/mc -V
GNU Midnight Commander 4.7.0-pre3
Virtual File System: tarfs, extfs, cpiofs, ftpfs, fish
With builtin Editor
Using system-installed S-Lang library with terminfo database
With subshell support as default
With support for background operations
With mouse support on xterm
With internationalization support
With multiple codepages support
Data types: char 8 int 32 long 64 void * 64 off_t 64 ecs_char 8

И эта версия нормально отображает русский текст:

Порты

Можно поменять “Screen library” в порту mc с ncurses на slang, однако это не работает. Приведу описание процесса просто для сведения.

$ cd /opt/local/var/macports/sources/rsync.macports.org/release/ports/sysutils/mc
$ sudo cp Portfile Portfile.dist
$ sudo chown ctrld Portfile
$ cat Portfile.dist | sed 's/--with-screen=ncurses/--with-screen=slang/' > Portfile

Ставим slang, gettext и libiconv

$ sudo port install slang2
$ sudo port install gettext
$ sudo port install libiconv

$ sudo port -dv install mc

Информация по сборке

bash-3.2$ /opt/local/bin/mc -V
GNU Midnight Commander 4.6.1
Using system-installed S-Lang library with terminfo database
With internationalization support
...

Выводы

Штатная версия Midnight Commander из MacPorts некорректно отображает русские буквы в именах файлов. Решение я продемонстрировал - можно использовать либо отдельную сборку MC 4.6.3, либо версию 4.7.0pre3, они обе работают нормально. Я остановился на последней.


Comments