Genial: Tastaturlayout-Umschaltung

Genial: Tastaturlayout-Umschaltung

Ich verwende Awesome als Fenstermanager unter Gnome (Debian-System) und habe mit diesem Code ein Widget zum Umschalten des Tastaturlayouts erstellt:

-- 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),

Es funktioniert, allerdings gibt es ein ernstes Problem mit dem Tastaturverhalten. Wenn ich zum RU-Layout wechsle, funktioniert keine meiner Tastaturbelegungen. Tolle Belegungen funktionieren nicht. Zum Beispiel funktionieren auch Vim-Tastenkombinationen nicht usw. Wie kann ich dieses Problem lösen?

Antwort1

Ihre Tastaturbelegungen funktionieren nicht, da Ihre Tastatur nicht mehr über diese Tastensymbole verfügt.

Wenn Sie beispielsweise etwas Altmit + Ftun möchten, benötigen Sie "F" in einer Taste. Wenn Sie jedoch "ru" laden,allein, dann gibt es überhaupt kein "F" (und auch keinen lateinischen Buchstaben).

Ich denke, dass es insbesondere dann viel besser ist, die Arbeit von X11 (über setxkbmap) erledigen zu lassen, wenn Sie mehrere Layouts handhaben müssen. Wie Sie festgestellt haben, ist die Vorgehensweise der Fenstermanager viel eingeschränkter.

Sie können auch versuchen, „ru“ durch „ru,us“ zu ersetzen, da das schreckliche Widget anscheinend setxkbmap aufruft, zB:

kbdcfg.layout = { { "us", "" }, { "ru,us", "phonetic" } }

Auf diese Weise wird das „us“-Layout beim Laden über das „ru“-Layout gestapelt und die Tastatursysteme des „us“-Layouts werden, obwohl sie noch immer nicht direkt eingegeben werden können, von der X11-Ebene erkannt, die die Tastenkombinationen verwaltet.

Antwort2

Über AwesomeWM, von seinerFAQ:

Sie sollten Schlüsselcodes anstelle von Schlüsselnamen verwenden, wie folgt:

  1. Laufen xev.
  2. Drücken Sie Printdie Taste.
  3. Lesen der Ausgabe

    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. Erstellen Sie ~/screenshots, installieren Sie scrot und fügen Sie Folgendes zu rc.lua hinzu:

    awful.key({ }, "#107", function () awful.util.spawn("scrot -e 'mv $f ~/screenshots/ 2>/dev/null'") end),
    

Testen Sie nun, ob Sie mit jedem beliebigen Tastaturlayout Screenshots erstellen können.

Antwort3

Ich musste mich gerade mit dem gleichen Problem auseinandersetzen und die hier aufgeführte Lösung hat nicht funktioniert. Ich habe schließlich gefundenxkb-schalterdas hat mit Awesome einwandfrei funktioniert. Es hat den zusätzlichen Vorteil, dass der Code in der rc.luaDatei vereinfacht ist.

-- 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

Antwort4

Nicht sicher, ob es ein Kommentar sein soll oder nicht, aber: nach dem Lesen und Verwenden@yotams Kommentar(danke! Du hast mein Upvote).

Ich habe mich entschieden, es auf die nächste Ebene zu bringen, indem ich xkb-switch so patche, dass sowohl die Flags -n als auch -p zulässig sind und es dadurch möglich wird, zum nächsten Layout zu wechseln und es zu drucken.bis zum Zusammenführen kann geklont werden vonHier.endlich zusammengeführt! finden Sie überHier.

Jetzt ist es möglich, den Umschalter etwas übersichtlicher und schneller zu machen :)

-- 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()

BEARBEITEN: Damit „setxkbmap“ das Umschalten des Layouts nicht durch tolle Tastenkombinationen stört, verwenden Sie diese Art von Befehl, um Ihr Layout einzurichten:

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

Dadurch wird sichergestellt, dass keine zusätzlichen Optionen aus der vorherigen Konfiguration übrig bleiben.

verwandte Informationen