Comment définir des raccourcis clavier personnalisés à partir d'un terminal?

56

Comment définir des raccourcis clavier personnalisés à partir d'un terminal pour différentes versions de Linux?

En gros, je veux savoir où Linux stocke les fichiers de raccourci clavier et comment ils peuvent être modifiés.

Lors de mes recherches, j’ai trouvé un fichier, ~/.config/compiz-1/compizconfigmais c’était plus ou moins crypté lorsque j’ai essayé de l’ouvrir nano.

Ornithorynque anonyme
la source
Remarque, les systèmes XFCE / Xubuntu ont déjà une réponse ici
Ulad Kasach

Réponses:

62

Ajout de raccourcis clavier en deux étapes à partir de la ligne de commande (14.04+)

Ajout de raccourcis personnalisés à partir de la ligne de commande peut être fait, mais c'est un peu compliqué; cela doit être fait en quelques étapes par liaison de clé. D'autre part, il est assez simple et peut très bien être scénarisé si vous voulez en quelque sorte de le faire à partir de la ligne de commande (qui était la question, non?).

Tout comme dans votre interface (Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés"), les raccourcis clavier personnalisés sont créés à partir de la ligne de commande en deux étapes:

  1. créez le raccourci clavier en modifiant (en ajoutant) la liste renvoyée par la commande:

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

    La liste renvoyée se présente comme suit (s’il ne s’agissait que d’un seul raccourci):

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

    Appliquez la liste modifiée à l'aide de la commande:

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

    (attention aux guillemets)

    NB Pas besoin de dire que la mention dans la liste (par exemple custom1, custom2) doit être unique. Si vous écrivez un script, le script devrait empêcher les doublons. Dans ce cas, la liste modifiée devrait ressembler par exemple à:

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

    pour ajouter un raccourci clavier: custom1

  2. définir ses propriétés:

    • Nom:

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

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
      
    • Combinaison de touches (par exemple <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>'
      

Des informations utiles peuvent être trouvées ici

Exemple de script pour définir un nouveau raccourci personnalisé

Le script ci-dessous peut être utilisé pour définir une nouvelle combinaison de touches de raccourci à partir de la ligne de commande. Il peut être utilisé avec la commande (en supposant que la combinaison de touches soit disponible):

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

Un exemple:

Pour définir une combinaison de touches de raccourci à ouvrir geditavec la combinaison de touches Alt+ 7:

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

Le scénario:

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

Comment utiliser:

Collez le script dans un fichier vide, enregistrez-le sous set_customshortcut.py, exécutez-le comme expliqué ci-dessus.

Certaines des mentions de clé les plus utilisées (trouvées expérimentalement, examinant les modifications apportées par la méthode de l'interface graphique à la valeur de liaison):

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
la source
5
Excellente réponse. J'ai besoin de 100 boutons de votes positifs pour ce script. ;)
Anandu M Das
@JacobVlijm Pourriez-vous expliquer un peu la partie concernant la combinaison de touches ? Qu'est-ce que cette balise <primaire> indique? Et au lieu de la lettre g, je peux remplacer n'importe quelle lettre que je pense, non?
Anonyme Platypus
1
@VladK ai, xubuntu, pourrait être que les raccourcis de xubuntu sont (toujours) définis dans un fichier xml. Je vais devoir regarder. Si tel est le cas, nous devons rouvrir votre question, étiquetée comme spécifique à xubuntu.
Jacob Vlijm
1
Merci, @JobobVlijm, je l'ai essayé. Et je viens de découvrir que mon correctif était une erreur. Il y en a vraiment difficile ici. custom-keybindingne devrait pas contenir "s" à la fin quand dans un schéma. Mais, il devrait contenir "s" quand agir comme clé ou dans le chemin. Sinon, la commande "set" lève une exception. Alors, supprimez les "s" de custom-keybindingdans le schéma. En outre, votre script python devrait également être mis à jour.
e-cloud
2
Pour votre information, votre script Python a un bogue. S'il n'y a pas de raccourcis clavier installés, les gsettingsretours @as []qui ne sont pas évalués.
Seanny123
11

Il existe un moyen simple de le faire en utilisant 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'"

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

Vous devez augmenter le nombre dans la custom0pièce pour ajouter plus de liaisons, c'est-à-dire. custom1, custom2Etc.

Pour le rendre permanent, ajoutez-le simplement à .bash_profileun script similaire exécuté par des shells de connexion. Il suffit de ne pas le faire pour les shells non connectés .bashrccar, d’après mon expérience, ceux dconf- ci le gsettingsralentissent considérablement. Changer / ajouter 30 liaisons prend une seconde! Vous ne voulez pas cela dans un shell sans connexion ( .bashrc)!

lisak
la source
1
Les deux échouent dans Ubuntu 18.04. Après la réponse de @Jacob Vlijm et ce wiki de communauté , vous devez ajouter des éléments custom0à la liste des raccourcis personnalisés, par exemple avec gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". Je ne sais pas pour dconf.
miguelmorin
Également dconf dump DIRpour vider un sous-chemin entier sur stdout. La sortie est dans un format semblable à un fichier de clés, avec des valeurs dans la syntaxe GVariant.
Pablo Un
10

Tous les paramètres de raccourcis clavier personnalisés sont stockés dans la base de données dconf.

Vous pouvez facilement y accéder avec dconf-editor:

sudo apt-get install dconf-editor

Ensuite, accédez au chemin d'accès dconf suivant dans l'éditeur:

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

entrez la description de l'image ici

Sylvain Pineau
la source
L'emplacement est-il identique pour toutes les versions de Linux? Ou au moins toutes les versions d'Ubuntu?
Anonyme Platypus
1
@AnonymousPlatypus: il s'agit de l'emplacement des réglages depuis le 14.04 (je ne peux pas dire pour un autre distro)
Sylvain Pineau
2
Ceci est une méthode graphique, et non depuis le terminal
Anandu M Das
1
Que dois-je faire si ma clé media-key n'a pas de sous-clé custom-keybindings?
Brandon Kuczenski
La question portait sur le terminal, pas sur l'interface graphique, alors la réponse est sans importance
Alexei Martianov
6

Ajout de raccourcis clavier à partir de la ligne de commande dans 12.04

Pour éviter que la réponse acceptée ne devienne trop volumineuse, publiez une solution distincte pour 12.04.

Jusqu'au 12.04 inclus (et y compris), les associations de touches personnalisées ne sont pas stockées dans la dconfbase de données, mais dans ~/.gconf/desktop/gnome/keybindings(dans un fichier xml, dans des sous-dossiers tels que custom0etc.).

Le script ci-dessous crée le xmlfichier et son dossier contenant, nommé automatiquement correctement.

Comment utiliser

  1. Collez le script dans un fichier vide, enregistrez-le sous. set_customshortcuts_12.py
  2. Exécutez-le avec la commande:

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

    key3 est optionnel, les commandes peuvent être par exemple:

    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 
    

Remarques

  • notez que la dénomination des touches diffère de celle de l'édition de paramètres. Les touches sont nommées comme elles apparaissent dans Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés", à ma connaissance.
  • J'ai testé le script sur 12.04 sous VirtualBox; il avait besoin d'une connexion / déconnexion pour que les changements aient lieu.
#!/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
la source
1

Vous pouvez définir un nouveau raccourci personnalisé sans script Python, en utilisant sed. Il vous suffit de définir le nom , la liaison et l' action à votre choix dans le script suivant:

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
la source
1

A écrit un script pour ça. Voir ci-dessous.

Voir l'utilisation dans l' creatShortcutinvocation.

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
la source
Ce serait parfait si nextShortcutId pouvait détecter automatiquement si d'anciennes clés sont déjà présentes (créées par d'autres programmes) simplement pour s'assurer qu'il n'y a pas de conflits. Vérifiez également si quelque chose d’autre est lié aux clés saisies.
Jack Giffin
0

J'ai trouvé la réponse de @JacobVlijm très utile, notamment le script. J'ai porté le code à bash. Je ne pense pas que cette fonction soit parfaite, elle contient peut-être quelques bugs, mais cela fonctionne pour moi.

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
la source