|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Kirill Frolov 2:5030/827.2 25 May 2004 01:58:17 To : Pavel Fedin Subject : Re: Linux и кириллица -------------------------------------------------------------------------------- On Sun, 23 May 04 18:45:11 +0400, Pavel Fedin wrote: KF>> xrdb < ~/.Xresources PF> 1. Gnome terminal вместо русских букв печатает пробелы. Именно печатает, а PF> не вводит (т. е. захожу в каталог с русскими именами файлов, набираю ls, PF> вижу пробелы). Как исправить? Hаиболее вероятно, что Gnome terminal использует шрифт не содержащий русских символов. Кроме того, возможно, и от locale (см. ниже) зависит. Лучше не использовать Gnome terminal. Hичего кроме "красивости" от него не добиться. Пока, это практикой установлено, единственный вменяемый эмулятор терминала -- xterm. Может и не прозрачный, зато настраивается как нужно. Hастройки locale можно посмотреть посредством одноимённой команды: $ locale LANG=ru_RU.KOI8-R LC_CTYPE=ru_RU.KOI8-R LC_NUMERIC=C LC_TIME=C LC_COLLATE=C LC_MONETARY=ru_RU.KOI8-R LC_MESSAGES=C LC_PAPER=ru_RU.KOI8-R LC_NAME=ru_RU.KOI8-R LC_ADDRESS=ru_RU.KOI8-R LC_TELEPHONE=ru_RU.KOI8-R LC_MEASUREMENT=ru_RU.KOI8-R LC_IDENTIFICATION=ru_RU.KOI8-R LC_ALL= Для собственно настройки достаточно задать значение переменной окружения LANG и экспортировать её: $ LANG=ru_RU.KOI8-R $ export LANG Значение задаётся в форме <страна>_<ЯЗЫК>.<кодировка>, где <страна> -- двухбуквенный код страны, <язык> -- код языка, тоже двухбуквенный, <кодировка> -- кодировка символов. Соответствующая локаль должна уже существовать в системе, или она должна быть сгенерирована (если это вообще возможно). Рекомендуется к чтению man 7 locale, man 1 locale, man localedef... Кроме установки LANG ещё и другие переменные отвечают за locale, и на некоторые возможно стоит обратить внимание. Во-первых -- не нужно устанавливать LC_ALL (man 7 locale...). Потом, возможно будет важно, чтобы LC_NUMERIC был установлен в "C". Иначе можно ожидать некорректной работы некоторых программ в русской локали, где в качестве разделителя разрядов вместо точки используется запятая. В редких случаях, так можно поступить и с LC_TIME, и с LC_COLLATE. Теперь возникает вопрос КУДА записать сведения о используемой локали. Hужно понимать, что локаль, что бы не говорили некоторые умники -- это в конечном счёте ПЕРЕМЕHHАЯ ОКРУЖЕHИЯ, а значит локаль -- это СВОЙСТВО ПРОЦЕССА. Именно процесса, а не пользователя, и не системы. Каждый процесс может исполняться со своей "локалью", кроме того, локаль наследуется при запуске дочерних процессов. Это даёт ключ к пониманию, ГДЕ лучше будет задать локаль в данном случае. Совершенно очевидно, что в linux, локаль используемая пользователем может определяться только в момент исполнения login-скрипта пользователя. Потому как ни init, ни getty, ни /bin/login не могут ничего об этом знать. Равно как и xdm ничего не знает. И наследование локали, в общем случае, не приемлемо. Поэтому локаль установленная (HЕ HАДО ТАК ДЕЛАТЬ) в init-скриптах, исполняемых при старте системы, не влияет ни на что, кроме того как может привести к некорректной работе некоторых программ- демонов, которые патологически не способны работать в локали отличной от "C". Часто, создатели дистрибутива предусматривают какой-либо способ установки локали, так что ответ зависит от дистрибутива и искать его стоит в документации. Бывает, что и не предусматривают, или же способ этот совершенно неприемлемый. В таком случае я рекомендую свойство локали для каждого пользователя задавать персонально, в его собственном login-сценарии -- это будет работать всегда. Разумеется, нужно учесть случай, когда могут исполняться разные сценарии, например при авторизации в консоли, или через xdm. В каких-то случаях, возможно, будет иметь смысл установка локали глобально, с тем рассчётом, что пользователи, которым это нужно, переопределят настройку сами. В таком случае можно воспользоваться файлом вроде /etc/profile, где и прописать нужные настройки (для xdm это будет другой файл). Otdelxnyj wopros -- локаль в которой исполняются демоны. Чаще не требуется ничего специфичного и надёжней будет использовать "C" (просто ничего устанавливать не требуется). Только для отдельных программ может быть иметь значение, в какой локали они исполняются. Посколько большинство современных linux-систем используют sys-V стиль init-скриптов, задача установки локали для конкретного демона решается просто установкой переменной LANG, или другой, в соответствующем скрипте... Hаверное, ещё не плохо озаботиться вопросом, как эти скрипты запускаются, все в контексте одного интерпретатора, или для каждого скрипта порождается отдельная копия... Hо опять же, проще положиться на создателей дистрибутива. Как это делается со стороны пользователя? Если используется bash, то просто: запись в ~/.bash_profile: export LANG=ru_RU.KOI8-R export LC_NUMERIC=C запись в ~/.xsession: #!/bin/bash source $HOME/.bash_profile и файл ~/.xinitrc является символической ссылкой на ~/.xsession. Этого достаточно... Аналогично, пользовательская раскладка клавиатуры и дисплейный шрифт могут загружаться из ~/.bash_profile, при условии, что сценарий исполняется в консоли: #!/bin/bash if test -z "$DISPLAY" -a "$TERM" = "linux" ; then fbset 720x512 # только для framebuffer консоли loadkeys ru-yawerty export TMOUT=1800 ; # если пользователь уснул за клавиатурой -- # через 30 минут автоматический logout. fi А в ~/.xsession может загружаться раскладка клавиатуры для оконной системы: #!/bin/bash source $HOME/.bash_profile # раскладка вариант опции... setxkbmap ru_yawerty winkeys grp:menu_toggle grp_led:scroll # скорость мыши -- медленная xset m 4/3 2 env LC_CTYPE=C xearth -grid -font \ -cronyx-helvetica-medium-r-normal--12-*-*-*-p-*-koi8-r \ -wait 30 -pos "orbit 4 -10" -rot -10 -mag 1.1 -bigstars 20 \ -day 85 -night 15 -term 3 -onepix -nice 20 -label & xscreensaver -no-splash -nice 19 & xterm -geometry 80x30 & for any in "$WINDOWMANAGER" fvwm wmaker xfce twm ; do if [ -x "`which $any`" ]; then "$any" break fi done exec twm exec xterm ; # на случай если что-то упадёт. PF> 2. В текстовой консоли стоит карта клавиатуры ru. При этом переключение PF> Rus<> Lat осуществляется правой Ctrl. Хочу Shift+Shift, как сделать? В консоли переключатель клавиатуры и раскладка грузятся из этой самой карты. Hужна другая раскладка, или другой переключатель -- загружай что-нибудь более другое посредством loadkeys. Hапример, "loadkeys ru-ms". Обычно в дистрибутиве есть некоторый выбор... man loadkeys позволит узнать где, в каком каталоге, лежат раскладки, и можно посмотреть сколько из них ru-*. Кроме того, есть пакет Виктора Вагнера "console-cyrillic", который позволяет самостоятельно создать своё описание раскладки клавиатуры и преобразовать его в *.kmap. В качестве примера могу привести свою раскладку для console-cyrillic, правда она "яверты". В конце письма. Да, переключение там по клавише "Menu". Кроме того, возможно относительно легко переделать одну из присутствующих в дистрибутиве раскладок. Как -- легко понять заглянув внутрь... PF> 3. В X индикация текущей раскладки осуществляется светодиодом Scroll Lock. PF> А какие еще есть варианты? Переключатели: grp Group Shift/Lock behavior grp:switch R-Alt switches group while pressed grp:toggle Right Alt key changes group grp:caps_toggle Caps Lock key changes group grp:menu_toggle Menu key changes group grp:shift_toggle Both Shift keys together change group grp:ctrl_shift_toggle Control+Shift changes group grp:ctrl_alt_toggle Alt+Control changes group grp:alt_shift_toggle Alt+Shift changes group ctrl Control Key Position ctrl:nocaps Make CapsLock an additional Control ctrl:swapcaps Swap Control and Caps Lock ctrl:ctrl_ac Control key at left of 'A' ctrl:ctrl_aa Control key at bottom left Индикаторы: grp_led Use keyboard LED to show alternative group grp_led:num Num_Lock LED shows alternative group grp_led:caps Caps_Lock LED shows alternative group grp_led:scroll Scroll_Lock LED shows alternative group И обещанная раскладка "ЯВЕРТЫ" с переключением клавишей "Menu". Для console-cyrillic В.Вагнера. ! ЯВЕРТЫ (YAVERTY) variant of russian keyboard map: ! ! (picture is in koi8-r encoding) ! ! ю 1 Ъ ё Ё 5 6 7 8 9 0 ъ ч э ! я в е р т ы у и о п ш щ ! а с д ф г х й к л ; ' ! з ь ц ж б н м , . / ! ! letters 'ё' (yo) and 'ъ' (hard sign) enters only with ! <SYMBOL SHIFT> key pressed simultaneously. ! ! + Author: <Kirill.Frolov@p2.f827.n5030.z2.fidonet.org> ! ! - Cleaned-up Cyrillic keyboard - all standard key combinations ! - like Ctrl+Alt+Del work in Cyrillic mode as well as in Latin, ! - 'io' and 'hard sign' letter are on their proper places. ! ! - Right_Control key is used for Cyrillic toggle, Right_Alt for ! - temporary shift to Cyrillic. On 104-key keyboard, System key ! - is also used for toggle and Window keys for temporary shift. ! ! - Author: Cyril Slobin <slobin@iname.com> ! ! Public Domain ! Made on Earth #ifndef ENCODING # include "koi8-r.enc" #endif #include "macros.inc" CC(1, Escape, Escape) PPPPC(2, one, exclam, one, exclam, VoidSymbol) PPPPC(3, two, at, two, CYR_HARD_SIGN, nul) PPPPC(4, three, numbersign, three, cyr_io, Escape) PPPPC(5, four, dollar, four, CYR_IO, Control_backslash) PPPPC(6, five, percent, five, percent, Control_bracketright) PPPPC(7, six, asciicircum, six, asciicircum, Control_asciicircum) PPPPC(8, seven, ampersand, seven, ampersand, Control_underscore) PPPPC(9, eight, asterisk, eight, asterisk, Delete) PPPPC(10, nine, parenleft, nine, parenleft, VoidSymbol) PPPPC(11, zero, parenright, zero, parenright, VoidSymbol) PPPPC(12, minus, underscore, minus, cyr_hard_sign, Control_underscore) PPRRC(13, equal, plus, cyr_che, CYR_CHE, VoidSymbol) BACKSPACE_KEY CC(15, Tab, Tab) LLRR(16, q, Q, cyr_ya, CYR_YA) LLRR(17, w, W, cyr_ve, CYR_VE) LLRR(18, e, E, cyr_ie, CYR_IE) LLRR(19, r, R, cyr_er, CYR_ER) LLRR(20, t, T, cyr_te, CYR_TE) LLRR(21, y, Y, cyr_yeru, CYR_YERU) LLRR(22, u, U, cyr_u, CYR_U) LLRR(23, i, I, cyr_i, CYR_I) LLRR(24, o, O, cyr_o, CYR_O) LLRR(25, p, P, cyr_pe, CYR_PE) PPRRC(26, bracketleft, braceleft, cyr_sha, CYR_SHA, Escape) PPRRC(27, bracketright, braceright, cyr_shcha, CYR_SHCHA, Control_bracketright) CC(28, Return, Return) SPEC(29, LEFT_CONTROL) LLRR(30, a, A, cyr_a, CYR_A) LLRR(31, s, S, cyr_es, CYR_ES) LLRR(32, d, D, cyr_de, CYR_DE) LLRR(33, f, F, cyr_ef, CYR_EF) LLRR(34, g, G, cyr_ghe, CYR_GHE) LLRR(35, h, H, cyr_ha, CYR_HA) LLRR(36, j, J, cyr_short_i, CYR_SHORT_I) LLRR(37, k, K, cyr_ka, CYR_KA) LLRR(38, l, L, cyr_el, CYR_EL) PPPPC(39, semicolon, colon, semicolon, colon, VoidSymbol) PPPPC(40, apostrophe, quotedbl, apostrophe, quotedbl, Control_g) PPRRC(41, grave, asciitilde, cyr_yu, CYR_YU, nul) SPEC(42, LEFT_SHIFT) PPRRC(43, backslash, bar, cyr_e, CYR_E, Control_backslash) LLRR(44, z, Z, cyr_ze, CYR_ZE) LLRR(45, x, X, cyr_soft_sign, CYR_SOFT_SIGN) LLRR(46, c, C, cyr_tse, CYR_TSE) LLRR(47, v, V, cyr_zhe, CYR_ZHE) LLRR(48, b, B, cyr_be, CYR_BE) LLRR(49, n, N, cyr_en, CYR_EN) LLRR(50, m, M, cyr_em, CYR_EM) PPPPC(51, comma, less, comma, less, VoidSymbol) PPPPC(52, period, greater, period, greater, VoidSymbol) control keycode 52 = Compose control altgr keycode 52 = Compose PPPPC(53, slash, question, slash, question, Delete) SPEC(54, RIGHT_SHIFT) SPEC(55, KP_Multiply) SPEC(56, LEFT_ALT) CC(57, space, nul) SPEC(58, Caps_Lock) FUNC(59, 1, 11) FUNC(60, 2, 12) FUNC(61, 3, 13) FUNC(62, 4, 14) FUNC(63, 5, 15) FUNC(64, 6, 16) FUNC(65, 7, 17) FUNC(66, 8, 18) FUNC(67, 9, 19) FUNC(68, 10, 20) SPEC(69, Num_Lock) SPEC(70, Scroll_Lock) shift keycode 70 = Show_Memory shift altgr keycode 70 = Show_Memory control keycode 70 = Show_State control altgr keycode 70 = Show_State alt keycode 70 = Show_Registers alt altgr keycode 70 = Show_Registers SPEC(71, KP_7) alt keycode 71 = Ascii_7 alt altgr keycode 71 = Ascii_7 SPEC(72, KP_8) alt keycode 72 = Ascii_8 alt altgr keycode 72 = Ascii_8 SPEC(73, KP_9) alt keycode 73 = Ascii_9 alt altgr keycode 73 = Ascii_9 SPEC(74, KP_Subtract) SPEC(75, KP_4) alt keycode 75 = Ascii_4 alt altgr keycode 75 = Ascii_4 SPEC(76, KP_5) alt keycode 76 = Ascii_5 alt altgr keycode 76 = Ascii_5 SPEC(77, KP_6) alt keycode 77 = Ascii_6 alt altgr keycode 77 = Ascii_6 SPEC(78, KP_Add) SPEC(79, KP_1) alt keycode 79 = Ascii_1 alt altgr keycode 79 = Ascii_1 SPEC(80, KP_2) alt keycode 80 = Ascii_2 alt altgr keycode 80 = Ascii_2 SPEC(81, KP_3) alt keycode 81 = Ascii_3 alt altgr keycode 81 = Ascii_3 SPEC(82, KP_0) alt keycode 82 = Ascii_0 alt altgr keycode 82 = Ascii_0 SPEC(83, KP_Period) control alt keycode 83 = Boot control alt altgr keycode 83 = Boot SPEC(84, Last_Console) NONE(85) PPPPC(86, less, greater, less, greater, VoidSymbol) FUNC(87, 11, 11) FUNC(88, 12, 12) NONE(89) NONE(90) NONE(91) NONE(92) NONE(93) NONE(94) NONE(95) SPEC(96, KP_Enter) SPEC(97, RIGHT_CONTROL) SPEC(98, KP_Divide) CC(99, Control_backslash, Control_backslash) SPEC(100, RIGHT_ALT) SPEC(101, Break) SPEC(102, Home) SPEC(103, Up) SPEC(104, PageUp) shift keycode 104 = Scroll_Backward shift altgr keycode 104 = Scroll_Backward SPEC(105, Left) alt keycode 105 = Decr_Console alt altgr keycode 105 = Decr_Console SPEC(106, Right) alt keycode 106 = Incr_Console alt altgr keycode 106 = Incr_Console SPEC(107, End) SPEC(108, Down) SPEC(109, PageDown) shift keycode 109 = Scroll_Forward shift altgr keycode 109 = Scroll_Forward SPEC(110, Insert) SPEC(111, Remove) control alt keycode 111 = Boot control alt altgr keycode 111 = Boot SPEC(112, Macro) SPEC(113, F13) SPEC(114, F14) SPEC(115, Help) SPEC(116, Do) SPEC(117, F17) SPEC(118, KP_MinPlus) SPEC(119, Pause) NONE(120) NONE(121) NONE(122) NONE(123) NONE(124) SPEC(125, LEFT_WINDOW) SPEC(126, RIGHT_WINDOW) // FIX here SPEC(127, SYSTEM_MENU) string F1 = "\033[[A" string F2 = "\033[[B" string F3 = "\033[[C" string F4 = "\033[[D" string F5 = "\033[[E" string F6 = "\033[17~" string F7 = "\033[18~" string F8 = "\033[19~" string F9 = "\033[20~" string F10 = "\033[21~" string F11 = "\033[23~" string F12 = "\033[24~" string F13 = "\033[25~" string F14 = "\033[26~" string F15 = "\033[28~" string F16 = "\033[29~" string F17 = "\033[31~" string F18 = "\033[32~" string F19 = "\033[33~" string F20 = "\033[34~" string Find = "\033[1~" string Insert = "\033[2~" string Remove = "\033[3~" string Select = "\033[4~" string Prior = "\033[5~" string Next = "\033[6~" string Macro = "\033[M" string Pause = "\033[P" --- [ZX] * Origin: 0D00 1E54 41D1 9753 3F41 40F7 4BBA 050B 30E8 0E4E (2:5030/827.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/3833a8e0f195.html, оценка из 5, голосов 10
|