굉장 : 키보드 레이아웃 전환

그놈 (데비안 시스템)에서 창 관리자로 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 단축키도 작동하지 않습니다.이 문제를 어떻게 해결할 수 있습니까?

답변

키보드에 더 이상 키 심이 없기 때문에 키보드 바인딩이 작동하지 않습니다.

원하는 경우 (예 : Alt + F 뭔가를하면 키에 "F"가 필요합니다. 그러나 "ru"를 혼자 로드하면 "F"가 전혀 없습니다 (라틴 문자도 아님).

특히 여러 레이아웃을 처리해야 할 때 그렇습니다. , X11 (setxkbmap을 통해)이 작업을 수행하도록하는 것이 훨씬 낫습니다. 창 관리자가하는 방식은 여러분이 발견 한 것처럼 훨씬 더 제한적입니다.

awfull 위젯이 setxkbmap을 호출하는 것처럼 보이므로 "ru"를 "ru, us"로 변경해보십시오. :

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

그러면 "us"레이아웃이로드 될 때 "ru"레이아웃과 "us"의 keysysms 위에 스택됩니다. 레이아웃은 여전히 직접 입력 할 수는 없지만 키 바인딩을 처리하는 X11 레이어에 표시됩니다.

Answer

AwesomeWM 정보 , FAQ 에서 :

다음과 같이 키 이름 대신 키 코드를 사용해야합니다.

  1. xev를 실행합니다.
  2. 인쇄 키를 누릅니다.
  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), 

이제 모든 키보드 레이아웃으로 스크린 샷을 만들 수 있는지 테스트 할 수 있습니다.

댓글

  • '는 작동하는 예일뿐입니다. 요점은 키 코드를 사용하는 것입니다.

답변

나는 방금 같은 문제를 해결해야했고 여기에 나열된 솔루션이 작동하지 않았습니다. 결국 awesome과 제대로 작동하는 xkb-switch 를 발견했습니다. 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 

Answer

댓글인지 아닌지 확실하지 않음 : @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 "" 

이전 구성에서 남은 추가 옵션이 없는지 확인합니다. 이온.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다