Потрясающе: переключение раскладки клавиатуры

Потрясающе: переключение раскладки клавиатуры

Я использую awesome в качестве оконного менеджера в Gnome (система Debian) и сделал виджет для переключения раскладки клавиатуры с помощью этого кода:

-- Keyboard map indicator and changer
    kbdcfg = {}
    kbdcfg.cmd = "setxkbmap"
    kbdcfg.layout = { { "us", "" }, { "ru", "phonetic" } }
    kbdcfg.current = 1  -- us is our default layout
    kbdcfg.widget = widget({ type = "textbox", align = "right" })
    kbdcfg.widget.text = " " .. kbdcfg.layout[kbdcfg.current][1] .. " "
    kbdcfg.switch = function ()
       kbdcfg.current = kbdcfg.current % #(kbdcfg.layout) + 1
       local t = kbdcfg.layout[kbdcfg.current]
       kbdcfg.widget.text = " " .. t[1] .. " "
       os.execute( kbdcfg.cmd .. " " .. t[1] .. " " .. t[2] )
    end

    -- Mouse bindings
    kbdcfg.widget:buttons(awful.util.table.join(
        awful.button({ }, 1, function () kbdcfg.switch() end)
    ))
-- Alt + Right Shift switches the current keyboard layout
    awful.key({ "Mod1" }, "Shift_R", function () kbdcfg.switch() end),

Работает, однако есть серьезная проблема с поведением клавиатуры. Когда я переключаюсь на раскладку ru, ни одна из моих привязок клавиатуры не работает. Привязки Awesome не работают. Например, сочетания клавиш vim также не работают и т. д. Как мне решить эту проблему?

решение1

Ваши привязки клавиш не работают, поскольку на вашей клавиатуре больше нет соответствующих символов клавиш.

Если вы хотите, например, чтобы Alt+ Fчто-то делал, то вам нужна "F" в какой-то тональности. Но если вы загрузите "ru"один, то вообще нет никакой «F» (и никакой латинской буквы).

Я думаю, что, особенно когда вам нужно работать с несколькими макетами, гораздо лучше позволить X11 (через setxkbmap) сделать эту работу за вас; способ, которым это делают оконные менеджеры, гораздо более ограничен, как вы обнаружили.

Вы также можете попробовать, поскольку виджет awesomel, похоже, вызывает setxkbmap, изменить «ru» на «ru,us», например:

kbdcfg.layout = { { "us", "" }, { "ru,us", "phonetic" } }

Таким образом, при загрузке раскладка «us» будет наложена поверх раскладки «ru», а клавиши раскладки «us», хотя и не будут напрямую набираться, будут видны слою X11, который обрабатывает привязки клавиш.

решение2

О AwesomeWM, от егоЧасто задаваемые вопросы:

Вместо названий клавиш следует использовать коды клавиш, например:

  1. Бегать xev.
  2. Нажмите Printклавишу.
  3. Прочитать вывод

    KeyPress event, serial 34, synthetic NO, window 0x1200002,
    root 0x291, subw 0x0, time 1510129, (471,293), root:(472,316),
    state 0x0, keycode **107** (keysym 0xff61, Print), same_screen YES,
    ...
    
  4. Создайте ~/screenshots, установите scrot и добавьте следующее в rc.lua:

    awful.key({ }, "#107", function () awful.util.spawn("scrot -e 'mv $f ~/screenshots/ 2>/dev/null'") end),
    

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

решение3

Мне только что пришлось решать ту же проблему, и решение, указанное здесь, не сработало. В конце концов я нашелxkb-переключателькоторый работал правильно с awesome. Он имеет дополнительный бонус в виде упрощенного кода в rc.luaфайле.

-- language switcher
kbdcfg = {}
kbdcfg.cmd = "xkb-switch -n"
kbdcfg.widget = wibox.widget.textbox()

kbdcfg.current = io.popen("xkb-switch"):read("*a")
kbdcfg.widget:set_text(kbdcfg.current)
kbdcfg.switch = function()
    os.execute(kbdcfg.cmd)
    kbdcfg.current = io.popen("xkb-switch"):read("*a")
    kbdcfg.widget:set_text(kbdcfg.current)
end

решение4

Не уверен, следует ли это считать комментарием или нет, однако: после прочтения и использования@yotam комментарий(спасибо! вы получили мой голос «за»).

Я решил вывести это на новый уровень, исправив xkb-switch так, чтобы разрешить использование флагов -n и -p, и тем самым сделать возможным переключение на следующую раскладку и ее печать.до слияния можно клонировать изздесь.наконец-то объединены! можно найти болеездесь.

Теперь можно сделать переключатель немного чище и быстрее :)

-- Language switcher
kbdcfg = {}
kbdcfg.widget = wibox.widget.textbox()
kbdcfg.switch = function ()
  current_kb = io.popen("xkb-switch -p -n"):read("*a")
  kbdcfg.widget:set_text(current_kb)
end
kbdcfg.switch()

EDIT: чтобы setxkbmap не мешал переключению раскладки с помощью привязок клавиш awesome, используйте следующую команду для настройки раскладки:

setxkbmap -layout "us,il" -option ""

Это позволит убедиться в том, что не осталось никаких дополнительных опций от предыдущей конфигурации.

Связанный контент