很棒:键盘布局切换

很棒:键盘布局切换

我在 gnome(debian 系统)下使用 Awesome 作为窗口管理器,并通过以下代码制作了一个小部件来切换键盘布局:

-- 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 布局时,我的键盘绑定不起作用。很棒的绑定不起作用。例如 vim 快捷方式不起作用等等。我该如何解决这个问题?

答案1

您的键盘绑定不起作用,因为您的键盘不再具有这些键符号。

例如,如果您想让Alt+F做某事,那么您需要在某个键上输入“F”。但如果你加载“ru”独自的,那么根本就没有“F”(也没有任何拉丁字母)。

我认为,特别是当您需要处理多个布局时,最好让 X11(通过 setxkbmap)为您完成这项工作;正如您所发现的,窗口管理器的执行方式要有限得多。

您也可以尝试,因为可怕的小部件似乎调用 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()

编辑:要使 setxkbmap 不通过很棒的键绑定干扰切换布局,请使用此类命令来设置布局:

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

这将确保以前的配置不会留下任何额外的选项。

相关内容