avva: (Default)
[personal profile] avva


Решил сделать так, чтобы терминал (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), так что для чтение русских писем ничего дополнительного не надо делать.

Date: 2003-08-09 06:37 am (UTC)
From: [identity profile] dimrub.livejournal.com
Windows: Control Panel -> Regional and Language Settings -> Regional Options -> Russian.

Щас меня будут пинать ногами. Не бейте меня, дяденька, я тоже Линукс люблю!

Date: 2003-08-09 06:45 am (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
А почему не выставить нормальную локаль? Вы входите через GDM? Надо при входе через меню заказать русский язык (это нужно сделать только один раз, оно сохранится).

Date: 2003-08-09 06:58 am (UTC)
From: [identity profile] avva.livejournal.com
Ага, я уже попробовал (но я не знал, что оно локаль юниксовскую тоже на основании этого правильно выставляет), но потом отменил. Обычно предпочитаю английские интерфейсы.

Date: 2003-08-09 07:03 am (UTC)
From: (Anonymous)
две разные имплементации

Date: 2003-08-09 07:17 am (UTC)
From: [identity profile] nice-beaver.livejournal.com
После этих трех постов про Линукс многие откажутся от мысли его ставить.

Date: 2003-08-09 07:32 am (UTC)
From: (Anonymous)
не для средних умов ;)- впрочем, для средних есть локализованные версии Linux.

Date: 2003-08-09 07:33 am (UTC)
From: [identity profile] mbravo.livejournal.com
И зря, если так :)

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

Gentoo вообще не всякий решит себе ставить, равно как даже и Debian.

Date: 2003-08-09 07:40 am (UTC)
From: [identity profile] ormuz.livejournal.com
Хм, а чем Вас в таком случае не устраивает LC_ALL=ru_RU.CP1251
LANG=C?

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

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

Date: 2003-08-09 07:40 am (UTC)
From: [identity profile] zigmar.livejournal.com
Угу :) У меня тоже самое :) Признаю интерфейсы только на англиском, но возможность читать/писать на русском/иврите требуется регулярно. Правда лазить ради этого в сорцы мне обычно лень - я предпочитаю более лёгкие пути :)

Date: 2003-08-09 08:11 am (UTC)
From: [identity profile] nice-beaver.livejournal.com
А какой Линукс больше всего похож на черный ящик (в смысле, чтоб не нужно было с паяльником под капот), и какие от этого минусы? Я говорю про операционку для десктопа.

Это не то

Date: 2003-08-09 08:18 am (UTC)
From: [identity profile] pargentum.livejournal.com
Таким способом кодировку не выберешь.

Date: 2003-08-09 08:59 am (UTC)
From: [identity profile] mbravo.livejournal.com
Из доступных в России мне наиболее user-friendly представляется как раз ALT Linux. По разным техническим причинам (и не потому, что я их представлял в Питере - как раз наоборот).

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

Ну и понятно, если хочется чего-то из того, что не предоставлено завёрнутым на блюдечке, то приходится тоже как-то напрягаться. В этом смысле Альты как раз хороши, потому что у них механизм апдейтов взят из Дебиана, а их репозитарий пакетов обновляется каждый день. Если что - рраз - и проапгрейдился или что-то новое поставил прямо через сеть, и маяться не надо.

Date: 2003-08-09 09:25 am (UTC)
From: [identity profile] nice-beaver.livejournal.com
А вот это "не все идет как надо" - случается чаще чем в Windows?

Date: 2003-08-09 09:44 am (UTC)
From: [identity profile] ex-matiouch.livejournal.com
RedHat

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

Почему-то мне никогда не приходилось сталкиваться ни с какими проблемами локализации. Я, знаете ли, адепт Юникода. Мне эта лабудень типа cp1251 уже и так поднадоела -- зачем же восьмибитные кодировки еще и в Линукс тащить?

Date: 2003-08-09 09:49 am (UTC)
From: [identity profile] krace.livejournal.com
это уж смотря что "надо".

Date: 2003-08-09 10:14 am (UTC)
From: [identity profile] mbravo.livejournal.com
Значительно реже.

Просто надо понимать, что тут есть принципиальная разница в терминах. (лично для меня) с Windows основные проблемы состоят в том, что хотя большинство программ обладают красивыми инсталяшками и прочей необходимой цивилизацией, сама операционка иногда необъяснимым образом "портится" в разных аспектах своей жизнедеятельности. И вот тогда начинается шаманское разбирательство, которое иногда (не всегда, но часто) упирается в полное бессилие что-либо сделать. С Линуксом же получается наоборот - приложений меньше, они часто не завёрнуты в красивую обёртку и/или требуют больше возни при настройке. Но когда требуемая рабочая среда установлена и настроена, всё работает _железно_. В случае же проблем, если есть желание, можно дойти до самых корней и, гордясь достижениями человеческого разума (и собственного), починить.
From: [identity profile] braay.livejournal.com
попробуйте в /.profile все Path'y записать
PАТH=$PATH;bin/bash;usr/home...
и т.д.
у меня работает.

Date: 2003-08-09 10:32 am (UTC)
From: [identity profile] dimrub.livejournal.com
Windows работает по принципу, которым руководствуется мало-мало любая коммерческая структура: вещи, нужные 80% пользователей - работают, а все, что кроме этого - либо работает, либо нет. При этом, что бы не говорили поборники OSS, мелкомягкие системы со временем стабилизируются (то есть, процент стабильно работающих вещей растет).

Что же касается десктопа - то тут говорить о Линуксе еще рано. Если человеку важна совместимость с майкрософтовскими форматами, которые на данный момент являются де-факто стандартом, ему придется выбрать винды. Я намеренно не влезаю в сравнение Microsoft Office со, скажем, Star Office, потому что это beyond the point.

Date: 2003-08-09 10:41 am (UTC)
From: [identity profile] nice-beaver.livejournal.com
Человек собирается ставить Dual Boot (это я о себе). То, что нужно от Линукса - писать и отлаживать свои программки под ним (и запуск на удаленных машинах, естессно). Документы и презентации буду писать под Windows.

Date: 2003-08-09 11:18 am (UTC)
From: [identity profile] avva.livejournal.com
Хм, а чем Вас в таком случае не устраивает LC_ALL=ru_RU.CP1251
LANG=C?


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

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

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

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

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

Я просто нетерпелив очень. Мне быстро надоедает читать длинную документацию, искать в сети, или какие-то запросы посылать в какие-нибудь форумы/рассылки... посмотреть в исходниках пусть не всегда быстрее, зато почти всегда интереснее.

Date: 2003-08-09 11:20 am (UTC)
From: [identity profile] avva.livejournal.com
Об этом я не подумал ;)
From: [identity profile] avva.livejournal.com
Почему-то мне показалось, что гном его не прочитает при загрузке.
Но, скорее всего, меня заглючило.
Спасибо, попробую.

Date: 2003-08-09 11:50 am (UTC)
From: [identity profile] msh.livejournal.com
Чтобы писать и отлаживать программы удобнее всего купить еще один компьютер за $200 и засунуть его в чулан.

Date: 2003-08-09 11:59 am (UTC)
From: [identity profile] ormuz.livejournal.com
Не знаю, я по жизни делаю что-то типа
cat file | iconv -f cp1251 -t koi8 - |less
или lynx --dump, в midnight commander тоже кнопка какая-то есть.
В mutt даже не знаю, ничего не трогал, само как-то заработало.

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

Совсем чайник - читал бы документацию,
Более-меннее опытный, знал бы что в gnome редко что работает если отойти от заложенной схемы хотя бы на шаг.
А совсем навороченный остался бы в Windows, поставил бы cygwin и получил бы всё то же но на меньшие деньги :))))))

Date: 2003-08-09 12:01 pm (UTC)
From: [identity profile] nice-beaver.livejournal.com
В смысле?

Date: 2003-08-09 12:11 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Тогда лично я, не мудрствуя лукаво, установил бы RedHat.

Date: 2003-08-09 12:12 pm (UTC)
From: [identity profile] msh.livejournal.com
В прямом смысле. Купить дешевый компьютер, поставить туда Linux, компьютер в чулан, на нем и отлаживать

Date: 2003-08-09 12:17 pm (UTC)
From: [identity profile] nice-beaver.livejournal.com
Не пройдет. У меня расчетная программа, считается долго даже на хорошем компе. А чем плох Dual Boot?

Date: 2003-08-09 12:21 pm (UTC)
From: [identity profile] nice-beaver.livejournal.com
Да, я тоже к этому склоняюсь.

Date: 2003-08-09 12:53 pm (UTC)
From: [identity profile] msh.livejournal.com
Чем плох dual boot начинаешь понимать после 8-го "ой, это было в письме, которое я не скопировал на общий раздел"

Date: 2003-08-09 03:22 pm (UTC)
From: (Anonymous)
Вы не хотите книжки писать?
Не конфигурация Линукс, поразумней, конечно, но что-нибудь не слишком накрученное. С Вашим даром неунывающей занудности пойдет на ура. Те или иные протоколы или библиотеки, как набор современного джентельмена в сети.
Подумайте.

Date: 2003-08-09 03:30 pm (UTC)
From: [identity profile] ex-ex-aim11.livejournal.com
Хотя-бы потому что это абсолютно неверно (я не беру в расчёт того, что 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

Date: 2003-08-09 03:32 pm (UTC)
From: (Anonymous)
Ну вот, пришлось приставить к экрану линейку, чтобы понять, к кому эта реплика относится :(
Что ж делать-то, а? Иногда совсем непонятно, кто кому отвечает.

Date: 2003-08-09 04:50 pm (UTC)
From: [identity profile] avva.livejournal.com
На кнопку "Уровень выше" (по-англ. parent) можно нажать.

Date: 2003-08-09 04:51 pm (UTC)
From: [identity profile] avva.livejournal.com
Мне свою неунывающую занудность хочется тратить только на интересные мне вещи, вот в чём загвоздка. Сочинение компьютерных пособой сюда не относится.

Date: 2003-08-09 06:39 pm (UTC)
From: [identity profile] cema.livejournal.com
Altlinux русифицирован, некоторым в России это нужно.

VmWare?

Date: 2003-08-09 06:41 pm (UTC)
From: [identity profile] cema.livejournal.com
VmWare. Run them together.

Date: 2003-08-09 08:58 pm (UTC)
From: (Anonymous)
та не, интересных. distributed programming, шо ли, или distributed data management, - где конь не валялся

ну не кнут, так не кнут

Date: 2003-08-10 12:39 am (UTC)
From: [identity profile] ex-matiouch.livejournal.com
Не знаю, как там ALT Linux, но RedHat -- русифицирован точно. Купленный в Германии, кстати.

Re: VmWare?

Date: 2003-08-10 03:04 am (UTC)
From: [identity profile] msh.livejournal.com
Даже если не учитывать то, что VmWare стоит денег, она дает заметный overhead. То есть для короткого тестирования на разных системах это еще куда ни шло (если программа совсем-совсем прикладная и ни от какого железа не зависит), но при разработке второй компьютер окупится очень быстро

Я пробовал все варианты - самый удобный выходит отдельный компьютер все-таки (или даже два, если драйверы писать)

Date: 2003-08-10 04:33 am (UTC)
From: [identity profile] pechkin.livejournal.com
A tut-to kakaja problema? Vrode zhe mozhno smontirovat' fat[32] pod linuxom i suw,estvujut smotrelki ext2fs pod windoj?

Date: 2003-08-10 10:14 am (UTC)
From: [identity profile] msh.livejournal.com
Обычная fs под Linux сейчас или ext3 или reiser, под Windows - NTFS.

Пожалуйста, если хотите чтобы я прочитал, пишите или по русски, или по английски, а не этой галиматьей.

Date: 2003-08-10 02:41 pm (UTC)
From: [identity profile] pishi-chitai.livejournal.com
Потому как до хрена программ, которые про юникод ни сном, ни духом.

Date: 2003-08-10 03:04 pm (UTC)
From: [identity profile] pechkin.livejournal.com
Тысяча пардонов, не знал, что у вас аллергия на транслит. Писал из школы, где моих разрешений не хватает на установку соответствующих прилад.

У меня на домашней машине стоит программулька, позволяющая (правда, RO) просматривать разделы в ext3, а равно и ext2.

Date: 2003-08-10 03:35 pm (UTC)
From: [identity profile] msh.livejournal.com
Да все можно. Прочитать, сконвертировать, вытащить. Только надоедает. Жалко время-то тратить на борьбу со всей этой ерундой

Date: 2003-08-11 12:09 am (UTC)
From: [identity profile] avnik.livejournal.com
Альт растет ногами из Мандрейка... Но уже года два развивается самостоятельно - заимствуя наработки из дебиана, + некотрые свои
(у меня руки не дорходят кое что обратно в дебиан спортировать)

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
2829 30 31   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 1st, 2026 05:25 pm
Powered by Dreamwidth Studios