LINUX.ORG.RU

Как сделать удобную *включалку* раскладок?


0

1

Кто знает, как сделать удобную *включалку* раскладок клавиатуры?

В переключалках специальная клавиша (или комбинация) переключает раскладки по кругу: русская → английская → русская → английская… Чем это неудобно? Да все знают: начинаешь печатать «привет» а получается «ghbdtn». Или наоборот, пишешь «Hello, world» а получаешь «Руддщб цщкдв» Причём такие ошибки настолько часты, что некоторые начинают писать программы с искусственным интеллектом для распознавания языка и автоматического переключения с изменением уже набранного слова. Надо ли говорить, что такие программы довольно сложны?

А меж тем, есть довольно простое решение проблемы: нужна не переключалка, а *включалка* раскладок. *Включалка* от переключалки отличается тем, что для каждой раскладки предусмотрена своя клавиша (или комбинация), включающая именно эту раскладку. Ошибки набора не в той раскладке исчезают, поскольку очень быстро вырабатывается навык: перед набором русского текста включаешь русскую раскладку, перед набором английского — английскую. Искусственный интеллект не нужен, с работой вполне справляется (спинной?) мозг, руки сами включают нужную раскладку. Становятся излишними индикаторы раскладок и программы, запоминающие раскладку в каждом окне.

Однако, важно, чтобы включалка была удобная. В Винде, например, есть возможность сделать и переключалку (например, популярную Ctrl+Shift), и включалку. Но включалки настолько неудобные (Ctrl+Shift+0, Ctrl+Shift+1, …), что ими никто не пользуется.

Удобная включалка должна быть простой, чтобы её легко было нажимать перед набором фразы или после паузы при печати. Поэтому сложные комбинации далеко отстоящих друг от друга клавиш (типа виндовых Ctrl+Shift+0) не годятся. По собственному опыту знаю, что хороши комбинации из близко расположенных клавиш, которые можно нажимать одной рукой. Причём одной рукой включается одна раскладка, другой — другая. Например, относительно неплохо работает такой вариант: Left Ctrl+Left Shift включает английскую (латинскую) раскладку, Right Ctrl+Right Shift — русскую.

Идеальная включалка (разумеется, имхо) должна быть ещё проще, то есть быть одной клавишей. Но все клавиши уже имеют какую-нибудь функцию… Хотя есть выход. Тот же Ctrl (или Shift) имеет значение только будучи нажатым в паре с какой-нибудь другой клавишей. (Ну, игры, где левый Ctrl открывает огонь, не в счёт.) Поэтому можно было бы организовать включалки так: одиночное быстрое нажатие на левый Ctrl включает английскую раскладку, одиночное быстрое нажатие на правый Ctrl — русскую. Ctrl в комбинации с другими клавишами имеет свой обычный смысл и не изменяет раскладку. Долгое нажатие на Ctrl также не изменяет раскладку.

Я жил с такими включалками в Винде много лет (при помощи программы RusLat95) и был счастлив. Всё время хотел сделать такие же включалки в Линуксе. Но подходящей программы всё не попадалось. Поковырялся с настройками xkb — говорят, там можно всё, но у меня всё не получилось. Мне удалось посадить английскую раскладку на Left Ctrl+Left Shift, русскую — на Right Ctrl+Right Shift. Потом я нашёл более удобные включалки: английская — Left Ctrl+Left Win, русская — Right Ctrl+Menu. Почему так? Left Ctrl и Left Win — две самые левые клавиши нижнего ряда, расположены горизонтально, нажимаются так: средний палец (левой руки, разумеется) нажимает Ctrl, потом указательный — Win. Получается очень быстро. Для правой руки то же самое, только вторая справа клавиша нижнего ряда — Menu, а не Win. В общем, неплохо, но есть два «но»:

1. Не идеально. Одиночный Ctrl был бы лучше, поскольку меньше движений пальцами.

2. С некоторых пор OpenOffice стал распознавать Menu даже в комбинации с Ctrl — и вместе с включением русской раскладки появляется совершенно не нужная контекстная менюшка.

Ладно, закругляюсь:

Если кто знает как настроить xkb на включение раскладки по одиночному Ctrl и не потерять обычного значения Ctrl — пожалуйста, напишите.

Если кто знает программку-переключалку раскладок, которую можно настроить на включение раскладок по одиночному Ctrl и не потерять обычного значения Ctrl — пожалуйста, напишите.

★★★★★

использую «включалки»:
- rwin → english;
- menu → russian;
- shift+rwin → japanese;
- shift+menu → ukrainian.
достаточно удобно (мне).

> Если кто знает как настроить xkb на включение раскладки по одиночному Ctrl и не потерять обычного значения Ctrl — пожалуйста, напишите.

архитектура xkb не позволяет полноценно это реализовать.

> Если кто знает программку-переключалку раскладок, которую можно настроить на включение раскладок по одиночному Ctrl и не потерять обычного значения Ctrl — пожалуйста, напишите.

сейчас точно не вспомню подробностей, но написать такую программу очень проблематично. более-менее это можно реализовать путём постоянного периодического сканирования состояния модификаторов, но это очень затратно по ресурсам + рулетка.

arsi ★★★★★
()

> В переключалках специальная клавиша (или комбинация) переключает раскладки по кругу: русская → английская → русская → английская… Чем это неудобно? Да все знают: начинаешь печатать «привет» а получается «ghbdtn».

За двадцать лет впервые слышу.

И да, в 1990 году я знал наизусть QWERTYUIOP ASDFGHJKL ZXCVBNM. Русскую клавиатуру я наизусть не перескажу, но уже очень очень много лет спокойно ловлю нужные клавиши пальцами, даже не зная, что на них написано, но и до этого никогда подобной проблемы не испытывал.

Проблема надумана. А решение даже для неё есть, только я его не знаю. Можешь повесить на один хоткей setxkbmap ru, а на другой setxkbmap us, если тебе так нравится.

Я жил с такими включалками в Винде много лет

Замечательно. Там и оставайтесь, любезнейший.

movietrouble
()

Юзаю капс и соответственно светодиод от него. на ноутбуке очень удобно, особенно ночью.
светодиод горит - рус
не горит - англ.
правда на три и более раскладок вряд ли прокатит

cx ★★
()

http://xneur.ru Разработчики пишут, что можно настроить хоткеи на включение 1, 2, 3 и 4 раскладок

aydar ★★★★★
()
Ответ на: комментарий от cx

Заюзай диоды принт-скрина и нам-лока - вот тебе и 8 раскладок :)

программы с искусственным интеллектом для распознавания языка и автоматического переключения с изменением уже набранного слова.

КСЖ! AI уже пихают и в переключалку раскладок или так всё же словарик + нехитрая функция сопоставления?

Ну и много букв... Но подозреваю, что тебе нужно:

setxkbmap -layout 'us,ru' -option 'grp:caps_toggle,grp_led:scroll'

Можно засунуть в rc.local

Если с ctrl, то это, вроде не получится сделать просто. /me вспомнил про ctrl+shift+t в терминале при хоткее смены раскладки ctrl+shift.

helios ★★★★★
()

>А меж тем, есть довольно простое решение проблемы: нужна не переключалка, а *включалка* раскладок. *Включалка* от переключалки отличается тем, что для каждой раскладки предусмотрена своя клавиша (или комбинация), включающая именно эту раскладку. Ошибки набора не в той раскладке исчезают, поскольку очень быстро вырабатывается навык: перед набором русского текста включаешь русскую раскладку, перед набором английского — английскую.

Проблема то в том, что люди не переключают раскладку на другую, а забывают ее переключать, имхо. (Дальше не читал)

derlafff ★★★★★
()
Ответ на: комментарий от helios

> КСЖ! AI уже пихают и в переключалку раскладок или так всё же словарик + нехитрая функция сопоставления?

Насколько помню, в таких переключалках нет сопоставления со словарем, а есть анализ невозможных сочетаний букв для данного языка. По крайней мере у Пунто так, может Xneur и сопоставляет.

Shlyapa ★★
()

actkbd

Такое можно сделать просто

actkbd +
pipe +
bash read line +
setxkbmap -layout ru,us
setxkbmap -layout us,ru

actkbd запускаешь в руте.
bash скрипт в своём юзере в автозапуск.

anonymous
()
Ответ на: комментарий от arsi

Как настраивал? У меня по альтшифту рус/лат, по контролшифту включается и выключается ibus с японской соответсвенно. Причем если параллельно работает русская, то ibus ничего не ловит, если английская, то можно писать кану/кандзи.

tensai_cirno ★★★★★
()
Ответ на: комментарий от tensai_cirno

> Как настраивал?

свои конфигурационные файлы для иксов и своя переключалка, которая, кроме запоминания раскладки для каждого окна, синхронизирует раскладку и uim. а, да, ещё и плазмоид для этого дела написал (по dbus общается с переключалкой) :)

arsi ★★★★★
()

А у меня раскладки переключается капслок. Горит лампочка - русский, не горит - английский.

Zhbert ★★★★★
()
Ответ на: комментарий от movietrouble

>За двадцать лет впервые слышу.

В Винде такое часто бывает (во-всяком случае, в XP): у них переключалка то срабатывает с запаздыванием, то в некоторых программах глючит. В том же QIP (старом) оставил окошко с одной раскладкой, а когда вернулся в него, то уже может быть другая. Там даже в саму программу встроена конвертация из QWERTY в ЙЦУКЕН для таких случаев.

kss ★★★★★
()

> Если кто знает как настроить xkb на включение раскладки по одиночному Ctrl и не потерять обычного значения Ctrl — пожалуйста, напишите.
Чисто средствами XKB - никак. Но есть патчик для иксов где-то в багзилле.

svu ★★★★★
()

Не думал что всё так плохо.

Из 17 ответов 13 — совершенно не в кассу. Мдя… Следуя правилам форума, воздержусь от дальнейших высказываний.

arsi и svu — спасибо за ответы по теме.

debugger ★★★★★
() автор топика
Ответ на: комментарий от linuxfan

Не вспомню. Ищите в компоненте Input/XKB

svu ★★★★★
()

А я пошел другим путем

Не стал отказываться от «переключалки». Поскольку тоже когд-то жил с RusLat95, настроил «переключалку» на правый ctrl, в режиме «для каждой программы своя раскладка». Поскольку в качестве DE использую KDE3, «переключалкой» работает kkbswitch. А с «Руддщб цщкдв» расправляюсь следующим образом. По-настоящему это мешает мне только в OpenOffice Writer. Вот я и написал два макроса для OpenOffice и повесил их на хоткеи. А с остальными программами - уж терплю :( Кстати, xneur у меня работает не всегда корректно («двоит» и «глотает» буквы, например, в Опере) - так что дешевше перебить текст (если уже набито много - copy/past в writer, запуск макроса и copy/paste обратно).

PVOzerski ★★★
()
Ответ на: А я пошел другим путем от PVOzerski

Макрос 1


REM  *****  BASIC  *****
Sub RusLatFix
  oCurSelection = thisComponent.getCurrentSelection()
  if oCurSelection.supportsService("com.sun.star.text.TextRanges") then
    oTextRange = oCurSelection.getByIndex(0)
    s = oTextRange.getString()
    w = ""
    for i = 1 to len(s)
      c = mid$(s, i, 1)
      select case c
        case "й"
          w = w + "q"
        case "ц"
          w = w + "w"
        case "у"
          w = w + "e"
        case "к"
          w = w + "r"
        case "е"
          w = w + "t"
        case "н"
          w = w + "y"
        case "г"
          w = w + "u"
        case "ш"
          w = w + "i"
        case "щ"
          w = w + "o"
        case "з"
          w = w + "p"
        case "х"
          w = w + "["
        case "ъ"
          w = w + "]"
        case "ф"
          w = w + "a"
        case "ы"
          w = w + "s"
        case "в"
          w = w + "d"
        case "а"
          w = w + "f"
        case "п"
          w = w + "g"
        case "р"
          w = w + "h"
        case "о"
          w = w + "j"
        case "л"
          w = w + "k"
        case "д"
          w = w + "l"
        case "ж"
          w = w + ";"
        case "э"
          w = w + "'"
        case "/"
          w = w + "\"
        case "я"
          w = w + "z"
        case "ч"
          w = w + "x"
        case "с"
          w = w + "c"
        case "м"
          w = w + "v"
        case "и"
          w = w + "b"
        case "т"
          w = w + "n"
        case "ь"
          w = w + "m"
        case "б"
          w = w + ","
        case "ю"
          w = w + "."
        case "."
          w = w + "/"
        case "Й"
          w = w + "Q"
        case "Ц"
          w = w + "W"
        case "У"
          w = w + "E"
        case "К"
          w = w + "R"
        case "Е"
          w = w + "T"
        case "Н"
          w = w + "Y"
        case "Г"
          w = w + "U"
        case "Ш"
          w = w + "I"
        case "Щ"
          w = w + "O"
        case "З"
          w = w + "P"
        case "Х"
          w = w + "{"
        case "Ъ"
          w = w + "}"
        case "Ф"
          w = w + "A"
        case "Ы"
          w = w + "S"
        case "В"
          w = w + "D"
        case "А"
          w = w + "F"
        case "П"
          w = w + "G"
        case "Р"
          w = w + "H"
        case "О"
          w = w + "J"
        case "Л"
          w = w + "K"
        case "Д"
          w = w + "L"
        case "Ж"
          w = w + ":"
        case "Э"
          w = w + CHR$(34)
        case "Я"
          w = w + "Z"
        case "Ч"
          w = w + "X"
        case "С"
          w = w + "C"
        case "М"
          w = w + "V"
        case "И"
          w = w + "B"
        case "Т"
          w = w + "N"
        case "Ь"
          w = w + "M"
        case "Б"
          w = w + "<"
        case "Ю"
          w = w + ">"
        case ","
          w = w + "?"
        case CHR$(34)
          w = w + "@"
        case "№"
          w = w + "#"
        case ";"
          w = w + "$"
        case ":"
          w = w + "^"
        case "?"
          w = w + "&"
        case else
          w = w + c
      end select
    next
    oTextRange.setString(w)
  end if 
End Sub
PVOzerski ★★★
()
Ответ на: А я пошел другим путем от PVOzerski

Макрос 2

Sub LatRusFix
  oCurSelection = thisComponent.getCurrentSelection()
  if oCurSelection.supportsService("com.sun.star.text.TextRanges") then
    oTextRange = oCurSelection.getByIndex(0)
    s = oTextRange.getString()
    w = ""
    for i = 1 to len(s)
      c = mid$(s, i, 1)
      select case c
        case "q"
          w = w + "й"
        case "w"
          w = w + "ц"
        case "e"
          w = w + "у"
        case "r"
          w = w + "к"
        case "t"
          w = w + "е"
        case "y"
          w = w + "н"
        case "u"
          w = w + "г"
        case "i"
          w = w + "ш"
        case "o"
          w = w + "щ"
        case "p"
          w = w + "з"
        case "["
          w = w + "х"
        case "]"
          w = w + "ъ"
        case "a"
          w = w + "ф"
        case "s"
          w = w + "ы"
        case "d"
          w = w + "в"
        case "f"
          w = w + "а"
        case "g"
          w = w + "п"
        case "h"
          w = w + "р"
        case "j"
          w = w + "о"
        case "k"
          w = w + "л"
        case "l"
          w = w + "д"
        case ";"
          w = w + "ж"
        case "'"
          w = w + "э"
        case "\"
          w = w + "/"
        case "z"
          w = w + "я"
        case "x"
          w = w + "ч"
        case "c"
          w = w + "с"
        case "v"
          w = w + "м"
        case "b"
          w = w + "и"
        case "n"
          w = w + "т"
        case "m"
          w = w + "ь"
        case ","
          w = w + "б"
        case "."
          w = w + "ю"
        case "/"
          w = w + "."
        case "Q"
          w = w + "Й"
        case "W"
          w = w + "Ц"
        case "E"
          w = w + "У"
        case "R"
          w = w + "К"
        case "T"
          w = w + "Е"
        case "Y"
          w = w + "Н"
        case "U"
          w = w + "Г"
        case "I"
          w = w + "Ш"
        case "O"
          w = w + "Щ"
        case "P"
          w = w + "З"
        case "{"
          w = w + "Х"
        case "}"
          w = w + "Ъ"
        case "A"
          w = w + "Ф"
        case "S"
          w = w + "Ы"
        case "D"
          w = w + "В"
        case "F"
          w = w + "А"
        case "G"
          w = w + "П"
        case "H"
          w = w + "Р"
        case "J"
          w = w + "О"
        case "K"
          w = w + "Л"
        case "L"
          w = w + "Д"
        case ":"
          w = w + "Ж"
        case CHR$(34)
          w = w + "Э"
        case "Z"
          w = w + "Я"
        case "X"
          w = w + "Ч"
        case "C"
          w = w + "С"
        case "V"
          w = w + "М"
        case "B"
          w = w + "И"
        case "N"
          w = w + "Т"
        case "M"
          w = w + "Ь"
        case "<"
          w = w + "Б"
        case ">"
          w = w + "Ю"
        case "?"
          w = w + ","
        case "@"
          w = w + CHR$(34)
        case "#"
          w = w + "№"
        case "$"
          w = w + ";"
        case "^"
          w = w + ":"
        case "&"
          w = w + "?"
        case else
          w = w + c
      end select
    next
    oTextRange.setString(w)
  end if 
End Sub
PVOzerski ★★★
()
7 октября 2011 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.