Como definir atalhos de teclado personalizados no terminal?

56

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

Basicamente, quero saber onde o Linux armazena os arquivos de atalho do teclado e como eles podem ser editados.

Na minha pesquisa, encontrei um arquivo, ~/.config/compiz-1/compizconfigmas era mais ou menos criptografado quando tentei abri-lo nano.

Ornitorrinco Anônimo
fonte
Note, sistemas XFCE / Xubuntu já tem uma resposta aqui
Ulad kasash

Respostas:

62

Adicionando atalhos de teclado de atalho em duas etapas na linha de comando (14.04+)

Adicionar atalhos personalizados a partir da linha de comando pode ser feito, mas é um pouco complicado; isso precisa ser feito em algumas etapas por combinação de teclas. Por outro lado, é bastante direto e pode muito bem ser roteirizado se você quiser fazê-lo a partir da linha de comando (essa era a pergunta, certo?).

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

  1. crie a combinação de teclas editando (adicionando a) a lista retornada pelo comando:

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

    A lista retornada se 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>]"
    

    (observe as aspas duplas)

    NB: Não é necessário dizer que a menção na lista (por exemplo custom1, custom2) deve ser única. Se você o 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 uma combinação de teclas: 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 teclas (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

Script de exemplo 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 (assumindo 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 geditcom 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 conforme explicado acima.

Algumas das principais menções usadas (encontradas experimentalmente, analisando as alterações feitas pela 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.

Jacob Vlijm
fonte
5
Excelente resposta. Preciso de 100 botões de votos para esse script. ;)
Anandu M Das
@JacobVlijm Você poderia explicar um pouco sobre a parte da combinação de teclas ? O que essa tag <primary> indica? E em vez da letra g eu posso substituir qualquer letra que eu acho, ryt?
Ornitorrinco anônimo
11
@VladK ai, xubuntu, pode ser que os atalhos do xubuntu estejam (ainda) definidos em um arquivo xml. Eu vou ter que olhar. Nesse caso, precisamos reabrir sua pergunta, marcada como xubuntu- específica.
Jacob Vlijm
11
Obrigado, @JacobVlijm, eu tentei. E acabei de descobrir que minha correção foi um erro. Há alguns realmente complicados aqui. custom-keybindingnão deve conter "s" no final quando estiver dentro de um esquema. Mas, deve conter "s" quando agir como chave ou no caminho. Caso contrário, o comando "set" lançará uma exceção. Portanto, remova os "s" de custom-keybindingno esquema. Além disso, seu script python também deve ser atualizado.
e-cloud
2
Para sua informação, seu script Python possui um bug. Se não houver atalhos de teclado instalados, gsettingsretornos @as []que não são avaliados.
Seanny123
11

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 custom0peça para adicionar mais ligações, ou seja. custom1, custom2etc.

Para torná-lo permanente, basta adicioná-lo a .bash_profileou um script semelhante executado por shells de login. Só não fazê-lo para os reservatórios não-logon .bashrcporque da minha experiência estes dconfe gsettingsretardá-lo significativamente. Alterar / adicionar 30 ligações leva um segundo! Você não quer isso no shell que não é de login ( .bashrc)!

lisak
fonte
11
Ambos falham no Ubuntu 18.04. Seguindo a resposta de @Jacob Vlijm e este wiki da comunidade , você precisa adicionar custom0à lista de atalhos personalizados, por exemplo, com gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". Eu não sei dconf.
Miguelmorin 4/10
Também dconf dump DIRpara despejar um subcaminho inteiro para stdout. A saída está em um formato de arquivo de chave, com valores na sintaxe GVariant.
Pablo A
10

Todas as configurações personalizadas dos atalhos de teclado 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/

insira a descrição da imagem aqui

Sylvain Pineau
fonte
O local é o mesmo para todas as versões do Linux? Ou pelo menos todas as versões do Ubuntu?
Ornitorrinco anônimo
11
@AnonymousPlatypus: Este é o local das configurações desde 14,04 (Eu não posso dizer para outra distro)
Sylvain Pineau
2
Este é um método gráfico, e não a partir do terminal.
Anandu M Das
11
O que faço se minha chave de teclas de mídia não possuir uma subchave de ligações de teclas personalizadas?
Brandon Kuczenski
A pergunta era sobre terminal, não GUI, então a resposta é irrelevante
Alexei Martianov 15/01
6

Adicionando atalhos de teclado de atalho na linha de comando no 12.04

Para impedir que a resposta aceita se torne muito extensa, publique uma solução separada para 12.04.

Até (e inclusive) 12.04, as combinações de teclas personalizadas não são armazenadas no dconfbanco de dados, mas em ~/.gconf/desktop/gnome/keybindings(em um arquivo xml, em subpastas como custom0etc).

O script abaixo cria o xmlarquivo e sua pasta contendo, nomeados 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

  • note que o nome das teclas é diferente da edição de configurações. As teclas são nomeadas como mostram em Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados", tanto quanto posso ver.
  • Testei o script no 12.04 no VirtualBox; precisava de um logout / in para que as alterações 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")
Jacob Vlijm
fonte
1

Você pode definir um novo atalho personalizado sem um script python, usando sed. Você só precisa definir o nome , a ligação e a 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
mmai
fonte
1

Escreveu um script para isso. Ver abaixo.

Veja o uso na creatShortcutinvocação.

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/']"
AlikElzin-kilaka
fonte
Seria perfeito se nextShortcutId pudesse detectar automaticamente se as chaves antigas já estão lá (já criadas por outros programas) apenas para garantir que não haja conflitos. Além disso, verifique se há mais alguma coisa vinculada às teclas inseridas.
Jack Giffin 19/01
0

Achei a resposta postada por @JacobVlijm muito útil, especialmente o script. Eu portado o código para bash. Eu não faço essa função é perfeita, pode conter alguns erros, no entanto, funciona para mim.

function set_shortcuts(){
    # Usage: set_shortcuts [name] [command] [shortcut]
    unset num i name command shortcut value test value_new
    local name="$1"
    local command="$2"
    local shortcut="$3"
    local value=$(gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings)
    local test=$(echo $value | sed "s/\['//;s/', '/,/g;s/'\]//" - | tr ',' '\n' | grep -oP ".*/custom\K[0-9]*(?=/$)")

    if [ "$(echo "$value" | grep -o "@as")" = "@as" ]; then
        local num=0
        local value_new="['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/']"
    else
        local i=1
        until [ "$num" != "" ]; do
            if [ "$(echo $test | grep -o $i)" != "$i" ]; then
                local num=$i
            fi
            i=$(echo 1+$i | bc);
        done
        local value_new=$(gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings | sed "s#']\$#', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/']#" -)
    fi

    gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "$value_new"
    gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ name "$name"
    gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ command "$command"
    gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ binding "$shortcut"
}
tukusejssirs
fonte