Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Category:

линукс-2

Ещё всякие муторности о процессе конфигурирования моего линукса.

Я ненавижу локаль.

Слово LC_CTYPE вызывает во мне что-то родственное ненависти.

Сейчас провёл кучу времени, настраивая свой любимый mutt, чтобы показывал русские буквы нормально.

Я ещё не знаю, буду ли пробовать какие-то графические юниксовские мейлеры (типа Mozilla Thunderbird или Evolution). Может, и стоит. Но пока что я возвращаюсь обратно к mutt'у, по которому успел заскучать (подписаться, что ли, заново на mutt-dev?).

Казалось бы, всё должно быть просто. Я привык, что в mutt могу менять charset терминала (т.е. говорить mutt'у, какой у меня charset терминала): ":set charset=cp1251", например. Проверить, что начинает правильно показывать (скажем, письма-уведомления о комментах от ЖЖ), внести это навсегда в .muttrc, и всё.

Тем более, что программа-терминал, gnome-terminal, позволяет тоже менять кодировки на лету: просто в меню выбираешь, в какой кодировке она должна воспринимать выдаваемые ей символы (включая и UTF-8 при желании), и сохранить можно. Очень удобно. Если добавить к этому то, что она позволяет много терминалов в табах одного окна открывать, и палитру настраивать -- вообще непонятно, зачем теперь rxvt нужен, я и не буду его ставить, наверное.

Но. mutt долго и упорно отказывался показывать мне русские буквы: либо показывает вопросительные знаки, либо восьмеричные коды типа \321 вместо символа. То есть, думает, что не может показать, хотя на самом деле может.

После долгого и упорного копания в исходниках оказалось, что при постройке он по умолчанию использует системные функции перехода от wide characters (Юникода, короче говоря) к multi-byte characters. Внутри у себя он всё пропускает через Юникод так или иначе, но при выдаче на экран обратно переводит в какую-то кодировку. Но функции, которыми он при этом пользуется - wcrtomb(), mbrtowc() и некоторые другие - используют локаль для того, чтобы знать, откуда и куда переводить. Т.е. заботливо выставленный мной set charset ничего не делает, т.к. (например) mutt во время вырисовки строки письма, получив одим символ в Юникоде, вызывает wcrtomb(), чтобы перевести его обратно в восьмибитную строку и передать curses, а этот вызов пользуется выставленной у меня локалью и туда и переводит (если может вообще). Если при постройке mutt не находит этих системных функций, то он использует свои такие же, но пользующиеся как раз не локалью, а его конфигурационной переменной charset - то, к чему я привык в прошлом.

В общем, я попытался поиграться с локалью, но, как обычно, кроме приступа ненависти это ни к чему не привело. Сначала долго вспоминал счастливо забытый за последние годы формат LC_CTYPE и прочих его друзей. Ну хорошо, вспомнил. LC_CTYPE=ru_RU mutt . Он поднимается и показывает мне русские буквы, переведенные... в ISO-8859-5! Боже мой, какое извращение, ну да, это же дифолтная кодировка ru_RU... пытаюсь выставить LC_CTYPE=ru_RU.CP1251, но это ни к чему не приводит, отказывается показывать в cp1251. Да я и в любом случае не хочу менять локаль на русскую! Потом только неожиданных проблем не оберёшься с сортировкой символов и ещё кучей вещей.

Потыкался я, потыкался, и решил перестроить mutt, чтобы он не пользовался glibc'шными функциями для перевода unicode<-->multibyte, а пользовался своими. К счастью, у его configure и флаг для этого нашёлся: --without-wc-funcs. Осталось только сообразить, как это сделать "правильно" в рамках Gentoo... после недолгого копания в недрах portage и ebuild нашлась переменная EXTRA_ECONF, и после запуска EXTRA_ECONF="--without-wc-funcs" emerge mutt всё собралось, построилось и заработало.

Уф.

Да, вот как я настроил себе почту пока. Установил postfix (ну не sendmail же, а qmail я совсем не знаю и учить лень). Собственно принимать почту у себя на машине пока не собираюсь, незачем особо, использую postfix только для отсылки (а почему не какой-нибудь простой примитивный отсыльщик типа ssmtp? потому что мне нужна посылка через рилей, и говорить с ним надо на SASL, а всякие простые отсыльщики этого не умеют. postfix умеет). Принимаю почту, качая её через POP3, для этого использую getmail (решил попробовать что-то новое вместо fetchmail), пока отлично работает. Для локальной delivery с фильтрами использую maildrop (опять же вместо привычного procmail, чтобы что-то новое попробовать), тоже очень хорошо выглядит, фильтры намного удобнее устроены, чем у procmail'а, правда, не успел их ещё пока настроить.

Все вокруг стремятся убедить меня использовать формат maildir для хранения почты -- Gentoo так конфигурирует по умолчанию, и пришлось его переиграть на использование mbox; getmail и maildrop умеют доставлять как в mbox, так и в maildir, но в один голос советуют maildir (для тех, кто не знает: mbox - это когда ящик писем в одном файле, maildir - ящик занимает директорию, каждое письмо - в отдельном файле + некоторые контрольные. Основное преимущество maildir в том, что не нужно locking делать для добавления нового письма, и не нужно сканировать все письма, когда открываешь ящик). Но я решил всё же не делать этого пока. Во-первых, привык к mbox'у всё же. Во-вторых, психологически мне тяжело принять систему, при которой каждое письмо в отдельном файле (и, скажем, ящик большой рассылки превращается в директорию с 3000 крошечными файлами). Даже хоть я умом и понимаю, что современные файловые системы с этим неплохо справляются, уж лучше, по крайней мере, чем в прошлом, а сердце всё равно не хочет это принять. Ну и ладно, поживу ещё с mbox'ом.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 17 comments