?

Log in

линукс-3 - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

линукс-3 [авг. 9, 2003|04:31 pm]
Anatoly Vorobey


Решил сделать так, чтобы терминал (gnome-terminal), когда открывается, ставил себя в режим кодировки cp1251 по умолчанию.
А то он по умолчанию выбирает кодировку текущей локали, которая у меня вообще что-то дико-дифолтное. Пытаюсь выставить нужный LC_CTYPE - ничего не меняется. Тыкаюсь в меню - нигде нет чего-то типа "set default character coding". Думаю, может, в меню нет, но в конфигурации где-то сохраняется; лезу в .gconf/apps/gnome-terminal/ и читаю вручную .xml-файлы, ничего не нахожу (потом уже понял, что вместо чтения вручную надо идти в гномовский Application->System Tools->Configuration Editor). Смотрю на опции командной строки, нахожу опцию геометрии (чтобы запускать его сразу 80x40, а не 80x24, как по умолчанию, удобо), а кодировок нет.

Лезу в исходники gnome-terminal, блуждаю по encoding.c. terminal_encoding_init()... но нет, она создаёт список кодировок, но в этом списке никак не указано, какая текущая. grep encoding *.c . Ага, есть есть вызов terminal_widget_set_encoding() в terminal-window.c, внутри функции change_encoding_callback(). Очевидно, эта функция вызывается, когда я в меню меняю кодировку. Больше
terminal_widget_set_encoding нигде не вызывается, значит, change_encoding_callback() должен кто-то вызвать, когда программа начинает работать, чтобы поставить первоначальный дифолтный выбор. grep change_encoding_callback *.c . Ага, это происходит в fill_in_encodings_menu(), при инициализации меню. Где там ставится первоначальный выбор? charset = terminal_widget_get_encoding (w);

Т.е. первоначальную кодировку мы берём у библиотеки терминала. Смотрим, что это за функции terminal_widget_get_encoding() и terminal_widget_set_encoding(). Они определяются два раза: в terminal-widget-vte.c и terminal-widget-zvt.c . Смотрим на эти файлы - судя по всему, две разных имплементации виджета терминала. Та, которая zvt, попроще, и в terminal_widget_set_encoding() ничего не делает. Т.к. я могу менять кодировку, очевидно, мой gnome-terminal был построен с terminal-widget-vte.c, которая пользуется функциями vte_terminal_get_encoding() и vte_terminal_set_encoding(). Их в исходниках нет... это какая-то библиотека. Ищем vte... ага, есть такая библиотека гномовская, распакуем её исходники и посмотрим на эти функции. Из них становится понятно, что именно vte занимается перекодировкой входа/выхода, используя функции iconv. Откуда vte берёт первоначальный charset, к-й она использует? vte_terminal_get_encoding() читает кодировку из внутренней структуры терминала: terminal->pvt->encoding; значит, надо искать, кто её туда ставит. grep encoding *.c . Никто не трогает это поле, кроме vte_terminal_set_encoding(), странно; ага, эта функция принимает имя кодировки, но если вместо него передаётся NULL, то она вызывает g_get_charset(), и ставит кодировку, к-ю возвращает эта функция. Проверяем, где вызывается vte_terminal_set_encoding(), и да, действительно, во время инициализации терминала есть вызов с аргументом NULL. Т.е. надо искать, что такое g_get_charset(), похоже, что-то гномовское, но (grep g_get_charset *.c) в vte такой функции нет. find /usr/include -exec grep -q g_get_charset {} \; -print . Ага, /usr/include/glib-2.0/glib/gunicode.h .

Полезли распаковывать исходники glib2. g_get_charset() нашлась в glib/gutf8.c ; вначале вызывает _g_locale_charset_raw() - судя по имени, эта фунцкия наконец доходит до локали - но потом пользуется ещё каким-то внутренним кэшем для алиасов и канонизации имён кодировок, для чего использует g_utf8_get_charset_internal(), передавая ей полученную от _g_locale_charset_raw() строку и получая обратно имя кодировки, к-е сохраняет в кэше и возвращает наружу. Смотрим в _g_locale_charset_raw, она внутри glib/libcharset/libcharset.c ; ага, полезли кучи #define'ов на разные операционные системы и вызовы функций типа langinfo() и других функций локали. Здесь я ничего не добьюсь, чтобы разобраться, как мне грамотно выставить локаль, чтобы g_get_charset() получила 'cp1251', мне нужно лезть в исходники glibc, или искать грамотную документацию по локали (не-на-ви-жу). Смотрю в g_utf8_get_charset_internal(), и вот наконец приятный сюрприз:
const char *charset = getenv("CHARSET"); если это выставлено, она игнорирует то, что даёт локаль, и использует эту кодировку.

Уф. До свидания, исходники. "CHARSET=cp1251 gnome_terminal" - работает! Пытаюсь прописать это в шорткате, который я себе поставил для вызова терминала - фиг, говорит, не может запустить программу, значит, не пользуется он шеллом. Ищу где-то в опциях шортката (который здесь launcher называется) место для определения переменных среды - фигвам, хижина такая у эскимосов. Ладно, надоело: cat >~/scripts/gnome-terminal-cp1251
#!/bin/bash
export CHARSET=cp1251
exec gnome-terminal $*

Выставляю нужные разрешения на файл, ставлю его имя в launcher ($HOME он тоже не понимает, дубина... а где этому гному сказать, чтобы $HOME/scripts в $PATH добавил? Ладно, лень разбираться, в следующий раз, прописываю полный путь). Всё.


Это было такое экспериментальное описание "рабочего процесса".
Всё это сделать было быстрее, чем описать сейчас. Интересно, если бы я разбирался в локали, знал бы заранее, что можно CHARSET поставить? Или если бы в правильное место полез RTFMить, не пришлось бы по исходникам бегать? Очень вероятно, но, в конце концов, мне сам этот процесс нравится. Надо не увлекаться, однако, слишком легко много времени потерять.

Теперь программа терминала запускается с кодировкой cp1251, и mutt тоже (после того, как я прописал set charset=cp1251 в .muttrc), так что для чтение русских писем ничего дополнительного не надо делать.
СсылкаОтветить

Comments:
[User Picture]From: dimrub
2003-08-09 06:37 am
Windows: Control Panel -> Regional and Language Settings -> Regional Options -> Russian.

Щас меня будут пинать ногами. Не бейте меня, дяденька, я тоже Линукс люблю!
(Ответить) (Thread)
[User Picture]From: pargentum
2003-08-09 08:18 am

Это не то

Таким способом кодировку не выберешь.
(Ответить) (Parent) (Thread)
From: oblomov_jerusal
2003-08-09 06:45 am
А почему не выставить нормальную локаль? Вы входите через GDM? Надо при входе через меню заказать русский язык (это нужно сделать только один раз, оно сохранится).
(Ответить) (Thread)
[User Picture]From: avva
2003-08-09 06:58 am
Ага, я уже попробовал (но я не знал, что оно локаль юниксовскую тоже на основании этого правильно выставляет), но потом отменил. Обычно предпочитаю английские интерфейсы.
(Ответить) (Parent) (Thread)
[User Picture]From: ormuz
2003-08-09 07:40 am
Хм, а чем Вас в таком случае не устраивает LC_ALL=ru_RU.CP1251
LANG=C?

Вобще странно, вроде терминал всегда отображал все символы которые мог отобразить, и кодировка в меню была нужна чтоб он шрифт правильно выбрал. Но если установить - MultiLanguage или что там, то он все символы нормально показывает.

Вобще, как то часто Вы в исходиники смотрите, всемирный разум давно такие проблемы порешал.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2003-08-09 11:18 am
Хм, а чем Вас в таком случае не устраивает LC_ALL=ru_RU.CP1251
LANG=C?


Всем устраивает, кроме того, что не работает. Т.е. gnome-terminal не распознаёт после этого cp1251 как дифолтную локальную кодировку. Почему - не знаю, а разбираться не хочу, т.к. ненавижу локаль.

Вообще странно, вроде терминал всегда отображал все символы которые мог отобразить, и кодировка в меню была нужна чтоб он шрифт правильно выбрал.

Ну подумайте сами, предположим, у Вас есть файл в cp1251, и Вы его просто посмотреть хотите, т.е. more ему сделать. Кто-то же должен знать, что это файл в cp1251? Не надо же заставлять Вас специально фонты cp1251 для этого выставлять, а если файл в koi8-r - другие фонты? Поэтому и есть эта опция выбора кодировки, и очень удобная, кстати; к фонтам она вообще никакого отношения не имеет, а управляет перекодировкой входа и выхода.

В идеале, конечно, надо переходить полностью на utf-8, как кто-то уже написал. Тому же mutt'у я могу сказать set charset=utf-8, и выбрать эту кодировку в терминале. Но не все программы ещё хорошо это поддерживают.

Вобще, как то часто Вы в исходиники смотрите, всемирный разум давно такие проблемы порешал.

Я просто нетерпелив очень. Мне быстро надоедает читать длинную документацию, искать в сети, или какие-то запросы посылать в какие-нибудь форумы/рассылки... посмотреть в исходниках пусть не всегда быстрее, зато почти всегда интереснее.
(Ответить) (Parent) (Thread)
[User Picture]From: ormuz
2003-08-09 11:59 am
Не знаю, я по жизни делаю что-то типа
cat file | iconv -f cp1251 -t koi8 - |less
или lynx --dump, в midnight commander тоже кнопка какая-то есть.
В mutt даже не знаю, ничего не трогал, само как-то заработало.

Вобще, мне кажется, Вы слишком много знаете и поэтому сильно необычный пользователь.

Совсем чайник - читал бы документацию,
Более-меннее опытный, знал бы что в gnome редко что работает если отойти от заложенной схемы хотя бы на шаг.
А совсем навороченный остался бы в Windows, поставил бы cygwin и получил бы всё то же но на меньшие деньги :))))))
(Ответить) (Parent) (Thread)
From: ex_ex_aim11
2003-08-09 03:30 pm
Хотя-бы потому что это абсолютно неверно (я не беру в расчёт того, что ru_RU.CP1251 это некорректно).

Правильно:

LANG=ru_RU.CP1251
# сообщения по-английски:
LC_MESSAGES=C
# время "по-английски":
LC_TIME=C

Идеологически верно:

LANG=ru_RU.KOI8-R
# или, если позволяет используемое ПО, то LANG=ru_RU.UTF-8
# ну и далее
LC_MESSAGES=C
LC_TIME=C
(Ответить) (Parent) (Thread)
[User Picture]From: zigmar
2003-08-09 07:40 am
Угу :) У меня тоже самое :) Признаю интерфейсы только на англиском, но возможность читать/писать на русском/иврите требуется регулярно. Правда лазить ради этого в сорцы мне обычно лень - я предпочитаю более лёгкие пути :)
(Ответить) (Parent) (Thread)
From: (Anonymous)
2003-08-09 07:03 am
две разные имплементации
(Ответить) (Thread)
[User Picture]From: nice_beaver
2003-08-09 07:17 am
После этих трех постов про Линукс многие откажутся от мысли его ставить.
(Ответить) (Thread)
From: (Anonymous)
2003-08-09 07:32 am

не для средних умов ;)- впрочем, для средних есть локализованные версии Linux.
(Ответить) (Parent) (Thread)
[User Picture]From: mbravo
2003-08-09 07:33 am
И зря, если так :)

У всех разный подход - Анатолию, в силу склада ума и опыта, проще залезть под капот и там паяльником чего надо... а некоторые могут и документацию прочитать, или вдруг ничего не иметь против русскоязыныч интерфейсов. Купили, например, ALT Linux себе, и счастливы.

Gentoo вообще не всякий решит себе ставить, равно как даже и Debian.
(Ответить) (Parent) (Thread)
[User Picture]From: nice_beaver
2003-08-09 08:11 am
А какой Линукс больше всего похож на черный ящик (в смысле, чтоб не нужно было с паяльником под капот), и какие от этого минусы? Я говорю про операционку для десктопа.
(Ответить) (Parent) (Thread)
[User Picture]From: mbravo
2003-08-09 08:59 am
Из доступных в России мне наиболее user-friendly представляется как раз ALT Linux. По разным техническим причинам (и не потому, что я их представлял в Питере - как раз наоборот).

Потребительские минусы у любого чёрного ящика одинаковые - когда что-то всё-таки идёт не так как надо - а рано или поздно это всегда случается, оказываешься в зависимости от спецов. Которые могут оказаться среди друзей, а могут и не оказаться :)

Ну и понятно, если хочется чего-то из того, что не предоставлено завёрнутым на блюдечке, то приходится тоже как-то напрягаться. В этом смысле Альты как раз хороши, потому что у них механизм апдейтов взят из Дебиана, а их репозитарий пакетов обновляется каждый день. Если что - рраз - и проапгрейдился или что-то новое поставил прямо через сеть, и маяться не надо.
(Ответить) (Parent) (Thread)
[User Picture]From: nice_beaver
2003-08-09 09:25 am
А вот это "не все идет как надо" - случается чаще чем в Windows?
(Ответить) (Parent) (Thread)
[User Picture]From: krace
2003-08-09 09:49 am
это уж смотря что "надо".
(Ответить) (Parent) (Thread)
[User Picture]From: mbravo
2003-08-09 10:14 am
Значительно реже.

Просто надо понимать, что тут есть принципиальная разница в терминах. (лично для меня) с Windows основные проблемы состоят в том, что хотя большинство программ обладают красивыми инсталяшками и прочей необходимой цивилизацией, сама операционка иногда необъяснимым образом "портится" в разных аспектах своей жизнедеятельности. И вот тогда начинается шаманское разбирательство, которое иногда (не всегда, но часто) упирается в полное бессилие что-либо сделать. С Линуксом же получается наоборот - приложений меньше, они часто не завёрнуты в красивую обёртку и/или требуют больше возни при настройке. Но когда требуемая рабочая среда установлена и настроена, всё работает _железно_. В случае же проблем, если есть желание, можно дойти до самых корней и, гордясь достижениями человеческого разума (и собственного), починить.
(Ответить) (Parent) (Thread)
[User Picture]From: dimrub
2003-08-09 10:32 am
Windows работает по принципу, которым руководствуется мало-мало любая коммерческая структура: вещи, нужные 80% пользователей - работают, а все, что кроме этого - либо работает, либо нет. При этом, что бы не говорили поборники OSS, мелкомягкие системы со временем стабилизируются (то есть, процент стабильно работающих вещей растет).

Что же касается десктопа - то тут говорить о Линуксе еще рано. Если человеку важна совместимость с майкрософтовскими форматами, которые на данный момент являются де-факто стандартом, ему придется выбрать винды. Я намеренно не влезаю в сравнение Microsoft Office со, скажем, Star Office, потому что это beyond the point.
(Ответить) (Parent) (Thread)
[User Picture]From: nice_beaver
2003-08-09 10:41 am
Человек собирается ставить Dual Boot (это я о себе). То, что нужно от Линукса - писать и отлаживать свои программки под ним (и запуск на удаленных машинах, естессно). Документы и презентации буду писать под Windows.
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2003-08-09 11:50 am
Чтобы писать и отлаживать программы удобнее всего купить еще один компьютер за $200 и засунуть его в чулан.
(Ответить) (Parent) (Thread)
[User Picture]From: nice_beaver
2003-08-09 12:01 pm
В смысле?
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2003-08-09 12:12 pm
В прямом смысле. Купить дешевый компьютер, поставить туда Linux, компьютер в чулан, на нем и отлаживать
(Ответить) (Parent) (Thread)
[User Picture]From: nice_beaver
2003-08-09 12:17 pm
Не пройдет. У меня расчетная программа, считается долго даже на хорошем компе. А чем плох Dual Boot?
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2003-08-09 12:53 pm
Чем плох dual boot начинаешь понимать после 8-го "ой, это было в письме, которое я не скопировал на общий раздел"

(Ответить) (Parent) (Thread)
[User Picture]From: cema
2003-08-09 06:41 pm

VmWare?

VmWare. Run them together.
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2003-08-10 03:04 am

Re: VmWare?

Даже если не учитывать то, что VmWare стоит денег, она дает заметный overhead. То есть для короткого тестирования на разных системах это еще куда ни шло (если программа совсем-совсем прикладная и ни от какого железа не зависит), но при разработке второй компьютер окупится очень быстро

Я пробовал все варианты - самый удобный выходит отдельный компьютер все-таки (или даже два, если драйверы писать)
(Ответить) (Parent) (Thread)
[User Picture]From: pechkin
2003-08-10 04:33 am
A tut-to kakaja problema? Vrode zhe mozhno smontirovat' fat[32] pod linuxom i suw,estvujut smotrelki ext2fs pod windoj?
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2003-08-10 10:14 am
Обычная fs под Linux сейчас или ext3 или reiser, под Windows - NTFS.

Пожалуйста, если хотите чтобы я прочитал, пишите или по русски, или по английски, а не этой галиматьей.
(Ответить) (Parent) (Thread)
[User Picture]From: pechkin
2003-08-10 03:04 pm
Тысяча пардонов, не знал, что у вас аллергия на транслит. Писал из школы, где моих разрешений не хватает на установку соответствующих прилад.

У меня на домашней машине стоит программулька, позволяющая (правда, RO) просматривать разделы в ext3, а равно и ext2.
(Ответить) (Parent) (Thread)
[User Picture]From: msh
2003-08-10 03:35 pm
Да все можно. Прочитать, сконвертировать, вытащить. Только надоедает. Жалко время-то тратить на борьбу со всей этой ерундой
(Ответить) (Parent) (Thread)
[User Picture]From: dimrub
2003-08-09 12:11 pm
Тогда лично я, не мудрствуя лукаво, установил бы RedHat.
(Ответить) (Parent) (Thread)
[User Picture]From: nice_beaver
2003-08-09 12:21 pm
Да, я тоже к этому склоняюсь.
(Ответить) (Parent) (Thread)
From: ex_matiouch
2003-08-09 09:44 am
RedHat

Собственно, ALT Linux, насколько мне известно, есть обработанный еще одним напильником RedHat -- но вот мне невдомек, нахрена козе баян (в смысле, еще одна обработка напильником).

Почему-то мне никогда не приходилось сталкиваться ни с какими проблемами локализации. Я, знаете ли, адепт Юникода. Мне эта лабудень типа cp1251 уже и так поднадоела -- зачем же восьмибитные кодировки еще и в Линукс тащить?
(Ответить) (Parent) (Thread)
[User Picture]From: cema
2003-08-09 06:39 pm
Altlinux русифицирован, некоторым в России это нужно.
(Ответить) (Parent) (Thread)
From: ex_matiouch
2003-08-10 12:39 am
Не знаю, как там ALT Linux, но RedHat -- русифицирован точно. Купленный в Германии, кстати.
(Ответить) (Parent) (Thread)
[User Picture]From: pishi_chitai
2003-08-10 02:41 pm
Потому как до хрена программ, которые про юникод ни сном, ни духом.
(Ответить) (Parent) (Thread)
[User Picture]From: avnik
2003-08-11 12:09 am
Альт растет ногами из Мандрейка... Но уже года два развивается самостоятельно - заимствуя наработки из дебиана, + некотрые свои
(у меня руки не дорходят кое что обратно в дебиан спортировать)
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2003-08-09 11:20 am
Об этом я не подумал ;)
(Ответить) (Parent) (Thread)
From: (Anonymous)
2003-08-09 03:32 pm
Ну вот, пришлось приставить к экрану линейку, чтобы понять, к кому эта реплика относится :(
Что ж делать-то, а? Иногда совсем непонятно, кто кому отвечает.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2003-08-09 04:50 pm
На кнопку "Уровень выше" (по-англ. parent) можно нажать.
(Ответить) (Parent) (Thread)
[User Picture]From: braay
2003-08-09 10:24 am

а где этому гному сказать, чтобы $HOME/scripts в $PATH добавил?

попробуйте в /.profile все Path'y записать
PАТH=$PATH;bin/bash;usr/home...
и т.д.
у меня работает.
(Ответить) (Thread)
[User Picture]From: avva
2003-08-09 11:20 am

Re: а где этому гному сказать, чтобы $HOME/scripts в $PATH добавил

Почему-то мне показалось, что гном его не прочитает при загрузке.
Но, скорее всего, меня заглючило.
Спасибо, попробую.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2003-08-09 03:22 pm
Вы не хотите книжки писать?
Не конфигурация Линукс, поразумней, конечно, но что-нибудь не слишком накрученное. С Вашим даром неунывающей занудности пойдет на ура. Те или иные протоколы или библиотеки, как набор современного джентельмена в сети.
Подумайте.
(Ответить) (Thread)
[User Picture]From: avva
2003-08-09 04:51 pm
Мне свою неунывающую занудность хочется тратить только на интересные мне вещи, вот в чём загвоздка. Сочинение компьютерных пособой сюда не относится.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2003-08-09 08:58 pm
та не, интересных. distributed programming, шо ли, или distributed data management, - где конь не валялся

ну не кнут, так не кнут
(Ответить) (Parent) (Thread)