Como definir atalhos de teclado personalizados a partir do terminal?

44

Como definir atalhos de teclado personalizados do terminal para diferentes versões do Linux?

Basicamente eu quero saber onde o Linux armazena os arquivos de atalho do teclado e como ele pode ser editado.

Na minha pesquisa, encontrei um arquivo ~/.config/compiz-1/compizconfig , mas foi mais ou como criptografado quando tentei abri-lo com nano .

    
por Anonymous Platypus 16.03.2015 / 11:49

6 respostas

51

Adicionando atalhos de teclado de atalho em duas etapas a partir da linha de comando (14.04 +)

A adição de atalhos personalizados a partir da linha de comando pode ser feita, mas é um pouco complicada; precisa ser feito em algumas etapas por keybinding. Por outro lado, é bastante simples e pode muito bem ser roteirizado se você de alguma forma quiser fazê-lo a partir da linha de comando (essa foi a pergunta, certo?).

Assim como em sua interface (Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados"), os atalhos de teclado personalizados são criados a partir da linha de comando em duas etapas:

  1. crie a atalho editando (adicionando a-) a lista retornada pelo comando:

    gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings
    

    A lista retornada parece (se fosse apenas um atalho atualmente):

    ['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']
    

    Aplique a lista editada pelo comando:

    gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "[<altered_list>]"
    

    (lembre-se das aspas duplas)

    N.B. Não é necessário dizer que a menção na lista (por exemplo, custom1 , custom2 ) deve ser única. Se você script, o script deve evitar duplicatas. Nesse caso, a lista editada deve se parecer com, por exemplo:

    ['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']
    

    para adicionar um atalho de teclado: custom1

  2. defina suas propriedades:

    • nome:

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ name '<newname>'
      
    • comando:

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
      
    • Combinação de chaves (por exemplo <Primary><Alt>g ):

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ binding '<key_combination>'
      

Informações úteis podem ser encontradas aqui

Exemplo de script para definir um novo atalho personalizado

O script abaixo pode ser usado para definir uma nova combinação de teclas de atalho na linha de comando. Pode ser usado com o comando (supondo que a combinação de teclas esteja disponível):

python3 /path/to/script.py '<name>' '<command>' '<key_combination>'

Um exemplo:

Para definir uma combinação de teclas de atalho para abrir gedit com a combinação de teclas Alt + 7 :

python3 /path/to/script.py 'open gedit' 'gedit' '<Alt>7'

O script:

#!/usr/bin/env python3
import subprocess
import sys

# defining keys & strings to be used
key = "org.gnome.settings-daemon.plugins.media-keys custom-keybindings"
subkey1 = key.replace(" ", ".")[:-1]+":"
item_s = "/"+key.replace(" ", "/").replace(".", "/")+"/"
firstname = "custom"
# get the current list of custom shortcuts
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
array_str = get("gsettings get "+key)
# in case the array was empty, remove the annotation hints
command_result = array_str.lstrip("@as")
current = eval(command_result)
# make sure the additional keybinding mention is no duplicate
n = 1
while True:
    new = item_s+firstname+str(n)+"/"
    if new in current:
        n = n+1
    else:
        break
# add the new keybinding to the list
current.append(new)
# create the shortcut, set the name, command and shortcut key
cmd0 = 'gsettings set '+key+' "'+str(current)+'"'
cmd1 = 'gsettings set '+subkey1+new+" name '"+sys.argv[1]+"'"
cmd2 = 'gsettings set '+subkey1+new+" command '"+sys.argv[2]+"'"
cmd3 = 'gsettings set '+subkey1+new+" binding '"+sys.argv[3]+"'"

for cmd in [cmd0, cmd1, cmd2, cmd3]:
    subprocess.call(["/bin/bash", "-c", cmd])

Como usar:

Cole o script em um arquivo vazio, salve-o como set_customshortcut.py , execute-o como explicado acima.

Algumas das principais menções de chave usadas (encontradas experimentalmente, examinando as alterações feitas pelo modo GUI no valor de ligação):

Super key:                 <Super>
Control key:               <Primary> or <Control>
Alt key:                   <Alt>
Shift key:                 <Shift>
numbers:                   1 (just the number)
Spacebar:                  space
Slash key:                 slash
Asterisk key:              asterisk (so it would need '<Shift>' as well)
Ampersand key:             ampersand (so it would need <Shift> as well)

a few numpad keys:
Numpad divide key ('/'):   KP_Divide
Numpad multiply (Asterisk):KP_Multiply
Numpad number key(s):      KP_1
Numpad '-':                KP_Subtract

etc.

    
por Jacob Vlijm 16.03.2015 / 12:45
10

Todas as configurações de atalhos de teclado personalizados são armazenadas no banco de dados dconf.

Você pode acessá-los facilmente com dconf-editor :

sudo apt-get install dconf-editor

Em seguida, vá para o seguinte caminho do dconf no editor:

/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/

    
por Sylvain Pineau 16.03.2015 / 12:40
9

Existe uma maneira simples de fazer isso usando dconf :

dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/command "'move-window.sh'"
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding "'<Primary><Alt>Page_Down'"
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/name "'move-window'"

Usando gsettings :

gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ name "'move-window'"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ binding "'<Primary><Alt>Page_Down'"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ command "'/usr/local/bin/move-window.sh'"

Você precisa aumentar o número na parte custom0 para adicionar mais ligações, por exemplo. custom1 , custom2 , etc.

Para torná-lo permanente, basta adicioná-lo a .bash_profile ou um script semelhante que seja executado por shells de login. Apenas não faça isso para shells de não-login .bashrc porque, da minha experiência, esses dconf e gsettings diminuem significativamente. Alterar / adicionar 30 ligações demora um segundo! Você não quer isso no shell de não-login ( .bashrc )!

    
por lisak 18.09.2016 / 01:04
6

Adicionando atalhos de teclas de atalho na linha de comando em 12.04

Para evitar que a resposta aceita seja muito extensa, postar uma solução separada para 12.04.

Até (e incluindo) 12.04, atalhos de teclado personalizados não são armazenados no banco de dados dconf , mas em ~/.gconf/desktop/gnome/keybindings (em um arquivo xml, em subpastas como custom0 etc).

O script abaixo cria o arquivo xml e sua pasta contendo, nomeada automaticamente corretamente.

Como usar

  1. Cole o script em um arquivo vazio, salve-o como set_customshortcuts_12.py
  2. Execute-o com o comando:

    python /path/to/set_customshortcuts_12.py <name> <command> <key1> <key2> <key3>
    

    key3 é opcional, os comandos podem ser, por exemplo:

    python /path/to/set_customshortcuts_12.py run_browser firefox Primary 7 
    

    ou

    python /path/to/set_customshortcuts_12.py run_texteditor gedit Primary Alt 3 
    

Notas

  • observe que a nomeação das chaves é diferente da edição de configurações. As chaves são nomeadas como elas aparecem em Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados", até onde eu posso ver.
  • Eu testei o script em 12.04 no VirtualBox; precisava de um logout para que as mudanças ocorressem.
#!/usr/bin/env python
import os
import sys

home = os.environ["HOME"]
name = sys.argv[1]
command = sys.argv[2]
keys = sys.argv[3:]

keyfile = [
    '<?xml version="1.0"?>',
    '<gconf>',
    '\t<entry name="action" mtime="1427791732" type="string">',
    '\t\t<stringvalue>'+command+'</stringvalue>',
    '\t</entry>',
    '\t<entry name="name" mtime="1427791732" type="string">',
    '\t\t<stringvalue>'+name+'</stringvalue>',
    '\t</entry>',
    '\t<entry name="binding" mtime="1427791736" type="string">',
    '\t</entry>',
    '</gconf>',
    ]

if len(keys) == 2:
    keyfile.insert(9, '\t\t<stringvalue>&lt;'+keys[0]+'&gt;'+keys[1]+'</stringvalue>')
else:
    keyfile.insert(9, '\t\t<stringvalue>&lt;'+keys[0]+'&gt;&lt;'+keys[1]+'&gt;'+keys[2]+'</stringvalue>')

n = 0
while True:
    check = home+"/"+".gconf/desktop/gnome/keybindings/custom"+str(n)
    if os.path.exists(check):
        n = n+1
    else:
        newdir = check
        newfile = check+"/"+"%gconf.xml"
        break

os.makedirs(newdir)
with open(newfile, "wt") as shortcut:
    for l in keyfile:
        shortcut.write(l+"\n")
    
por Jacob Vlijm 31.03.2015 / 14:08
1

Você pode definir um novo atalho personalizado sem um script python, usando sed. Você só precisa definir nome , ligação e ação à sua escolha no seguinte script:

name="myaction"
binding="<CTRL><ALT>v"
action="/usr/local/bin/myaction"

media_keys=org.gnome.settings-daemon.plugins.media-keys
custom_kbd=org.gnome.settings-daemon.plugins.media-keys.custom-keybinding
kbd_path=/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/$name/
new_bindings='gsettings get $media_keys custom-keybindings | sed -e"s>'\]>','$kbd_path']>"| sed -e"s>@as \[\]>['$kbd_path']>"'
gsettings set $media_keys custom-keybindings "$new_bindings"
gsettings set $custom_kbd:$kbd_path name $name
gsettings set $custom_kbd:$kbd_path binding $binding
gsettings set $custom_kbd:$kbd_path command $action
    
por mmai 17.02.2018 / 12:01
0

Escreveu um script para isso. Veja abaixo.

Veja o uso na invocação creatShortcut .

export nextShortcutId=0
function creatShortcut() {
    name="$1"
    commandToRun="$2"
    binding="$3"
    path="/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${nextShortcutId}"
    nextShortcutId=$nextShortcutId+1
    dconf write "$path/name" "'""$name""'"
    dconf write "$path/command" "'""$commandToRun""'"
    dconf write "$path/binding" "'""$binding""'"
}

# dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding '"<Primary><Shift>exclam"'
creatShortcut 'copyq show' 'copyq show' '<Primary><Shift>exclam'
creatShortcut 'System Monitor' 'gnome-system-monitor' '<Primary><Alt>m'
creatShortcut 'Suspend' 'systemctl suspend -i' '<Super>d'
creatShortcut 'Volume Up' 'amixer -D pulse sset Master 5%+' '<Super>Page_Up'
creatShortcut 'Volume Down' 'amixer -D pulse sset Master 5%-' '<Super>Page_Down'

overallbindings=""
for ((i = 0 ; i < $nextShortcutId ; i++ ));
do
    overallbindings="$overallbindings, '$customindingPathPrefix$i/'"
done
overallbindings="[${overallbindings:2}]" # Delete the first 2 chars: " ," - space and comma
# echo $overallbindings

# Update the list of bindings for the shortcuts to work
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings "$overallbindings"
# dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom4/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom5/']"
    
por AlikElzin-kilaka 20.03.2018 / 11:39