我在 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 ""
這將確保先前的配置不會留下任何額外的選項。