我在 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,来自其常问问题:
您应该使用键码而不是键名,如下所示:
- 跑步
xev
。 - 按Print键。
读取输出
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, ...
创建 ~/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 ""
这将确保以前的配置不会留下任何额外的选项。