素晴らしい: キーボードレイアウトの切り替え

素晴らしい: キーボードレイアウトの切り替え

私は 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 経由) にその作業を実行させる方がはるかに優れていると思います。ウィンドウ マネージャーがそれを実行する方法は、あなたが発見したように、はるかに制限されています。

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スイッチこれは素晴らしいもので、正常に動作しました。ファイル内のコードが簡素化されるという追加のボーナスもあります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 ""

これにより、以前の構成から余分なオプションが残らないことが保証されます。

関連情報