¿Cómo configurar atajos de teclado personalizados desde la terminal?

56

¿Cómo configurar atajos de teclado personalizados desde el terminal para diferentes versiones de Linux?

Básicamente, quiero saber dónde almacena Linux los archivos de acceso directo del teclado y cómo se puede editar.

En mi investigación encontré un archivo ~/.config/compiz-1/compizconfigpero estaba más o menos encriptado cuando intenté abrirlo nano.

Ornitorrinco anónimo
fuente
Tenga en cuenta que los sistemas XFCE / Xubuntu ya tienen una respuesta aquí
Ulad Kasach

Respuestas:

62

Agregar combinaciones de teclas de acceso directo en dos pasos desde la línea de comandos (14.04+)

Se puede agregar accesos directos personalizados desde la línea de comandos, pero es un poco complicado; debe hacerse en unos pocos pasos por combinación de teclas. Por otro lado, es bastante sencillo y puede ser programado si de alguna manera quieres hacerlo desde la línea de comandos (esa era la pregunta, ¿verdad?).

Al igual que en su interfaz (Configuración del sistema> "Teclado"> "Atajos"> "Atajos personalizados"), los atajos de teclado personalizados se realizan desde la línea de comandos en dos pasos:

  1. cree la combinación de teclas editando (agregando a-) la lista que devuelve el comando:

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

    La lista devuelta se ve así (si solo fuera un acceso directo actualmente):

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

    Aplique la lista editada por el comando:

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

    (cuenta las comillas dobles)

    NB No es necesario decir que la mención en la lista (por ejemplo custom1, custom2) debería ser única. Si lo escribe, el script debe evitar duplicados. En este caso, la lista editada debería verse, por ejemplo:

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

    para agregar una combinación de teclas: custom1

  2. establecer sus propiedades:

    • nombre:

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

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
      
    • Combinación de teclas (por ejemplo <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>'
      

Puede encontrar información útil aquí.

Script de ejemplo para establecer un nuevo acceso directo personalizado

El siguiente script se puede usar para establecer una nueva combinación de teclas de acceso directo desde la línea de comandos. Se puede usar con el comando (suponiendo que la combinación de teclas esté disponible):

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

Un ejemplo:

Para establecer una combinación de teclas de acceso directo para abrir geditcon la combinación de teclas Alt+ 7:

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

La secuencia de comandos:

#!/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])

Cómo utilizar:

Pegue el script en un archivo vacío, guárdelo como set_customshortcut.py, ejecútelo como se explicó anteriormente.

Algunas de las menciones clave más utilizadas (encontradas experimentalmente, analizando los cambios que la GUI realizó en el valor de enlace):

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
fuente
55
Excelente respuesta Necesito 100 botones de votos a favor para ese script. ;)
Anandu M Das
@JacobVlijm ¿Podría explicar un poco sobre la parte de combinación de teclas ? ¿Qué indica esa etiqueta <primary>? Y en lugar de la letra g , puedo reemplazar cualquier letra que piense, ¿no?
Anónimo Ornitorrinco
1
@VladK ai, xubuntu, podría ser que los atajos de xubuntu estén (todavía) configurados en un archivo xml. Tendré que mirar. Si es así, tenemos que volver a abrir su pregunta, etiquetada como xubuntu- específica.
Jacob Vlijm
1
Gracias, @JacobVlijm, lo he probado. Y acabo de descubrir que mi solución fue un error. Hay algo realmente complicado aquí. custom-keybindingno debe contener "s" al final cuando está dentro de un esquema. Pero, debe contener "s" cuando actúa como clave o en la ruta. De lo contrario, el comando "set" arrojará una excepción. Por lo tanto, elimine la "s" de custom-keybindingen el esquema. Además, tu script de Python también debería actualizarse.
e-cloud
2
Para su información, su script de Python tiene un error. Si no hay atajos de teclado instalados, gsettingsdevuelve @as []lo que no evalúa.
Seanny123
11

Hay una forma simple de hacerlo 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'"

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

Necesita aumentar el número en la custom0parte para agregar más enlaces, es decir. custom1, custom2etc.

Para hacerlo permanente, simplemente agréguelo .bash_profileo un script similar que se ejecute mediante shells de inicio de sesión. Eso sí, no lo haga por conchas de no ingreso .bashrcporque a partir de mi experiencia éstos dconfy gsettingsreducir la velocidad considerablemente. ¡Cambiar / agregar 30 enlaces toma un segundo! ¡No quieres esto en el shell sin inicio de sesión ( .bashrc)!

Lisak
fuente
1
Ambos fallan en Ubuntu 18.04. Siguiendo la respuesta de @Jacob Vlijm y este wiki de la comunidad , debe agregar custom0a la lista de accesos directos personalizados, por ejemplo, con gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". No lo se dconf.
miguelmorin
También dconf dump DIRpara volcar un subpath completo a stdout. La salida está en un formato similar a un archivo de claves, con valores en sintaxis GVariant.
Pablo A
10

Todos los ajustes personalizados de atajos de teclado se almacenan en la base de datos dconf.

Puede acceder fácilmente a ellos con dconf-editor:

sudo apt-get install dconf-editor

Luego vaya a la siguiente ruta dconf en el editor:

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

ingrese la descripción de la imagen aquí

Sylvain Pineau
fuente
¿La ubicación es la misma para todas las versiones de Linux? ¿O al menos todas las versiones de Ubuntu?
Anónimo Ornitorrinco
1
@AnonymousPlatypus: esta es la ubicación de la configuración desde el 14.04 (no puedo decir para otra distribución)
Sylvain Pineau
2
Este es un método gráfico, y no desde la terminal
Anandu M Das
1
¿Qué hago si mi clave de teclas multimedia no tiene una subclave de combinaciones de teclas personalizadas?
Brandon Kuczenski
La pregunta era sobre el terminal, no sobre la interfaz gráfica de usuario, por lo que la respuesta es irrelevante
Alexei Martianov
6

Agregar combinaciones de teclas de acceso directo desde la línea de comando en 12.04

Para evitar que la respuesta aceptada sea demasiado extensa, publique una solución separada para 12.04.

Hasta (e incluyendo) 12.04, las combinaciones de teclas personalizadas no se almacenan en la dconfbase de datos, sino en ~/.gconf/desktop/gnome/keybindings(en un archivo xml, en subcarpetas como custom0etc.).

El siguiente script crea el xmlarchivo y su carpeta de contacto, automáticamente nombrado correctamente.

Cómo utilizar

  1. Pegue el script en un archivo vacío, guárdelo como set_customshortcuts_12.py
  2. Ejecútelo con el comando:

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

    key3 es opcional, los comandos pueden ser, por ejemplo:

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

    o

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

Notas

  • tenga en cuenta que el nombre de las teclas es diferente de la edición de ajustes. Las teclas se nombran como se muestran en Configuración del sistema> "Teclado"> "Atajos"> "Atajos personalizados", por lo que puedo ver.
  • Probé el script en 12.04 en VirtualBox; necesitaba un cierre de sesión / entrada para que los cambios tuvieran lugar.
#!/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
fuente
1

Puede establecer un nuevo acceso directo personalizado sin un script de Python, utilizando sed. Solo tiene que establecer el nombre , el enlace y la acción a su elección en el siguiente 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
fuente
1

Escribió un guión para eso. Vea abajo.

Ver el uso en la creatShortcutinvocación.

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
fuente
Sería perfecto si nextShortcutId pudiera detectar automáticamente si las claves antiguas ya están allí (ya creadas por otros programas) solo para asegurarse de que no haya conflictos. Además, verifique si hay algo más relacionado con las teclas ingresadas.
Jack Giffin
0

La respuesta publicada por @JacobVlijm me pareció muy útil, especialmente el guión. Porté el código a bash. No creo que esta función sea perfecta, puede contener algunos errores, sin embargo, funciona para mí.

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
fuente