Come impostare scorciatoie da tastiera personalizzate dal terminale?


56

Come impostare scorciatoie da tastiera personalizzate dal terminale per diverse versioni di Linux?

Fondamentalmente voglio sapere dove Linux memorizza i file delle scorciatoie da tastiera e come può essere modificato.

Nella mia ricerca ho trovato un file ~/.config/compiz-1/compizconfigma era più o meno crittografato quando ho provato ad aprirlo con nano.


Nota, i sistemi XFCE / Xubuntu hanno già una risposta qui
Ulad Kasach,

Risposte:


62

Aggiunta di combinazioni di tasti di scelta rapida in due passaggi dalla riga di comando (14.04+)

L'aggiunta di collegamenti personalizzati dalla riga di comando può essere eseguita, ma è un po 'complicata; deve essere eseguito in pochi passaggi per associazione di tasti. D'altra parte, è piuttosto semplice e può benissimo essere copiato da script se in qualche modo vuoi farlo dalla riga di comando (era la domanda, giusto?).

Proprio come nella tua interfaccia (Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate"), le scorciatoie da tastiera personalizzate vengono create dalla riga di comando in due passaggi:

  1. crea il keybinding modificando (aggiungendo a-) l'elenco che viene restituito dal comando:

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

    L'elenco restituito è simile (se al momento fosse solo una scorciatoia):

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

    Applica l'elenco modificato con il comando:

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

    (attenzione alle doppie virgolette)

    NB Non è necessario dire che la menzione nell'elenco (ad es custom1. custom2) Dovrebbe essere unica. Se lo script, lo script dovrebbe impedire i duplicati. In questo caso l'elenco modificato dovrebbe apparire come ad esempio:

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

    per aggiungere un keybinding: custom1

  2. imposta le sue proprietà:

    • 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>'
      
    • Combinazione di tasti (ad esempio <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>'
      

Informazioni utili sono disponibili qui

Script di esempio per impostare un nuovo collegamento personalizzato

Lo script seguente può essere utilizzato per impostare una nuova combinazione di tasti di scelta rapida dalla riga di comando. Può essere utilizzato con il comando (presupponendo che la combinazione di tasti sia disponibile):

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

Un esempio:

Per impostare una combinazione di tasti di scelta rapida da aprire geditcon la combinazione di tasti Alt+ 7:

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

Il copione:

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

Come usare:

Incolla lo script in un file vuoto, salvalo come set_customshortcut.py, eseguilo come spiegato sopra.

Alcune delle menzioni chiave maggiormente utilizzate (trovate sperimentalmente, esaminando le modifiche apportate dal modo GUI al valore di associazione):

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

eccetera.


5
Risposta eccellente. Ho bisogno di 100 pulsanti di voto per quella sceneggiatura. ;)
Anandu M Das

@JacobVlijm Potresti spiegare qualcosa nella parte della combinazione di tasti ? Cosa indica quel tag <primary>? E invece della lettera g posso sostituire qualsiasi lettera che penso, ryt?
Platypus anonimo

1
@VladK ai, xubuntu, potrebbe essere che le scorciatoie di xubuntu sono (ancora) impostate in un file xml. Dovrò guardare In tal caso, dobbiamo riaprire la tua domanda, contrassegnata come specifica per xubuntu.
Jacob Vlijm,

1
Grazie, @JacobVlijm, l'ho provato. E ho appena scoperto che la mia correzione è stata un errore. C'è qualcosa di veramente complicato qui. custom-keybindingnon dovrebbe contenere "s" alla fine quando all'interno di uno schema. Tuttavia, dovrebbe contenere "s" quando agisce come chiave o nel percorso. Altrimenti, il comando "set" genererà un'eccezione. Quindi, rimuovere la "s" di custom-keybindingnello schema. Inoltre, anche il tuo script Python dovrebbe essere aggiornato.
e-cloud

2
Cordiali saluti, il tuo script Python ha un bug. Se non sono installate scorciatoie da tastiera, gsettingsrestituisce ciò @as []che non viene valutato.
Seanny123,

11

Esiste un modo semplice per farlo utilizzando 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'"

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

È necessario aumentare il numero nella custom0parte per aggiungere più associazioni, ad es. custom1, custom2ecc.

Per renderlo permanente, basta aggiungerlo .bash_profileo uno script simile che viene eseguito dalle shell di login. Basta non farlo per shell senza login .bashrcperché dalla mia esperienza queste dconfe gsettingsrallentarle in modo significativo. La modifica / aggiunta di 30 associazioni richiede un secondo! Non vuoi questo nella shell non login ( .bashrc)!


1
Entrambi falliscono in Ubuntu 18.04. Dopo la risposta di @Jacob Vlijm e questa wiki della comunità , è necessario aggiungere custom0all'elenco di collegamenti personalizzati, ad esempio con gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". Non lo so dconf.
miguelmorin,

Anche dconf dump DIRper scaricare un intero sottotraccia su stdout. L'output è in un formato simile a un file di chiavi, con valori nella sintassi di GVariant.
Pablo A

10

Tutte le impostazioni personalizzate delle scorciatoie da tastiera sono memorizzate nel database dconf.

Puoi accedervi facilmente con dconf-editor:

sudo apt-get install dconf-editor

Quindi vai al seguente percorso dconf nell'editor:

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

inserisci qui la descrizione dell'immagine


La posizione è uguale per tutte le versioni di Linux? O almeno tutte le versioni di Ubuntu?
Platypus anonimo

1
@AnonymousPlatypus: questa è la posizione delle impostazioni dal 14.04 (non posso dirlo per altre distro)
Sylvain Pineau

2
Questo è un metodo grafico, e non dal terminale
Anandu M Das

1
Cosa devo fare se la mia chiave per i media media non ha una sottochiave per i collegamenti personalizzati?
Brandon Kuczenski il

La domanda riguardava il terminale, non la GUI, quindi la risposta è irrilevante
Alexei Martianov il

6

Aggiunta di combinazioni di tasti di scelta rapida dalla riga di comando in 12.04

Per evitare che la risposta accettata diventi troppo estesa, pubblicare una soluzione separata per 12.04.

Fino al (incluso 12.12), le combinazioni di tasti personalizzate non sono memorizzate nel dconfdatabase, ma in ~/.gconf/desktop/gnome/keybindings(in un file xml, in sottocartelle come custom0ecc.).

Lo script seguente crea il xmlfile e la sua cartella di contabilità, automaticamente denominati correttamente.

Come usare

  1. Incolla lo script in un file vuoto, salvalo come set_customshortcuts_12.py
  2. Eseguilo con il comando:

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

    key3 è facoltativo, i comandi possono essere ad esempio:

    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 
    

Appunti

  • si noti che la denominazione dei tasti è diversa dalla modifica delle impostazioni. I tasti sono denominati come mostrano in Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate", per quanto posso vedere.
  • Ho testato lo script su 12.04 in VirtualBox; era necessario un logout / in per le modifiche.
#!/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")

1

Puoi impostare un nuovo collegamento personalizzato senza uno script Python, usando sed. Devi solo impostare nome , associazione e azione a tua scelta nel seguente 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

1

Ha scritto una sceneggiatura per questo. Vedi sotto.

Vedi l'utilizzo creatShortcutnell'invocazione.

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/']"

Sarebbe perfetto se nextShortcutId potesse rilevare automaticamente se vecchie chiavi sono già lì (già create da altri programmi) solo per assicurarsi che non ci siano conflitti. Inoltre, controlla se qualcos'altro è associato alle chiavi immesse.
Jack Giffin il

0

Ho trovato molto utile la risposta pubblicata da @JacobVlijm, in particolare la sceneggiatura. Ho portato il codice su bash. Non credo che questa funzione sia perfetta, potrebbe contenere alcuni bug, tuttavia, funziona per me.

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"
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.