Ещё всякие муторности о процессе конфигурирования моего линукса.
Я ненавижу локаль.
Слово 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'ом.
Я ненавижу локаль.
Слово 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'ом.