很棒:鍵盤佈局切換

很棒:鍵盤佈局切換

我在 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 ""

這將確保先前的配置不會留下任何額外的選項。

相關內容