Incrível: troca de layout do teclado

Eu uso o awesome como gerenciador de janelas no gnome (sistema debian) e criei um widget para trocar o layout do teclado por este código:

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

Funciona, mas há um problema sério com o comportamento do teclado. Quando eu mudo para o layout ru, nenhuma das minhas ligações de teclado funciona. Vinculações incríveis não funcionam. Por exemplo, os atalhos do vim também não funcionam e etc. Como posso resolver esse problema?

Resposta

As ligações do seu teclado não estão funcionando porque o seu teclado não tem mais esses teclados.

Se você quiser, por exemplo, Alt + F faça algo, então você precisa de “F” em alguma tecla. Mas se você carregar “ru” sozinho , não haverá “F” (nem qualquer letra latina).

Eu acho, especialmente quando você precisa lidar com vários layouts , que é muito melhor deixar o X11 (por meio de setxkbmap) fazer o trabalho para você; a forma como os gerenciadores de janela o fazem é muito mais limitada, como você descobriu.

Você também pode tentar, como o widget horrível parece chamar setxkbmap, mudar “ru” por “ru, us”, por exemplo :

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

dessa forma, o layout “us” será empilhado em cima do “ru” quando carregado, e o esquema chave do “us” layout, embora ainda não seja tipificável diretamente, será visto pela camada X11 que lida com as combinações de teclas.

Resposta

Sobre AwesomeWM , de suas FAQ :

Você deve usar códigos-chave, em vez de nomes-chave, como este:

  1. Execute xev.
  2. Pressione a tecla Imprimir .
  3. Leia a saída

    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. Crie ~ / screenshots, instale o scrot e adicione o seguinte a rc.lua:

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

Agora você pode testar se pode criar capturas de tela com qualquer layout de teclado.

Comentários

  • Esse ' é apenas um exemplo prático. O objetivo é usar códigos-chave

Resposta

Eu apenas tive que resolver o mesmo problema, e o solução listada aqui não funcionou. Acabei encontrando o xkb-switch que funcionou corretamente com o awesome. Tem o bônus adicional de código simplificado no arquivo 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 

Resposta

Não tenho certeza se é um comentário ou não: depois de ler e usar o comentário de @yotam “ (obrigado! você tem meu voto positivo).

Decidi levar isso para o próximo nível, corrigindo xkb-switch para permitir os sinalizadores -n e -p, e fazendo isso é possível mudar para o próximo layout e imprimi-lo. até mesclar pode ser clonado aqui . finalmente mesclado! pode ser encontrado em aqui .

Agora é possível tornar o switcher um pouco mais limpo e rápido 🙂

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

EDITAR: para fazer com que setxkbmap não perturbe a troca de layout por combinações de teclas incríveis, use este tipo de comando para configurar seu layout:

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

Isso garantirá que nenhuma opção extra seja deixada da configuração anterior íon.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *