최고: 키보드 레이아웃 스위치

최고: 키보드 레이아웃 스위치

나는 gnome(데비안 시스템)에서 창 관리자로 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-스위치정말 훌륭하게 작동했습니다. 파일 에 단순화된 코드가 추가된 보너스가 있습니다 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의 코멘트(감사합니다! 당신은 내 찬성 투표를 받았습니다).

나는 -n 및 -p 플래그를 모두 허용하도록 xkb-switch를 패치하고 이를 통해 다음 레이아웃으로 전환하고 인쇄할 수 있도록 함으로써 다음 단계로 나아가기로 결정했습니다.병합이 복제될 수 있을 때까지여기.드디어 합체! 이상에서 찾을 수 있습니다여기.

이제 스위처를 좀 더 깔끔하고 빠르게 만들 수 있게 되었습니다 :)

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

그러면 이전 구성에 추가 옵션이 남아 있지 않은지 확인할 수 있습니다.

관련 정보