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/compizconfig
mais il était plus ou moins crypté lorsque j'ai essayé de l'ouvrir avec nano
.
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, est assez simple et peut très bien être scripté si vous voulez le faire depuis la ligne de commande (c'était la question, n'est-ce pas?).
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:
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)
N.B. Inutile de dire que la mention dans la liste (par exemple custom1
, custom2
) devrait ê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/']
ajouter un raccourci clavier: custom1
définir ses propriétés:
pré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
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 pour ouvrir gedit
avec la combinaison de touches Alt+7:
python3 /path/to/script.py 'open gedit' 'gedit' '<Alt>7'
Le 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])
Comment utiliser:
Collez le script dans un fichier vide, enregistrez-le sous set_customshortcut.py
, exécutez-le comme expliqué ci-dessus.
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.
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/
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'"
Utilisation de 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 custom0
part pour ajouter plus de liaisons, c'est-à-dire. custom1
, custom2
, etc.
Pour le rendre permanent, ajoutez-le simplement à .bash_profile
ou à un script similaire exécuté par des shells de connexion. Ne le faites pas pour les shells non-connectés .bashrc
car, d'après mon expérience, ces dconf
et gsettings
le ralentissent considérablement. Changer/ajouter 30 liaisons prend une seconde! Vous ne voulez pas cela dans un shell non connecté (.bashrc
)!
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 base de données dconf
, mais dans ~/.gconf/desktop/gnome/keybindings
(dans un fichier xml, dans des sous-dossiers tels que custom0
etc.).
Le script ci-dessous crée le fichier xml
et son dossier contenant, nommé automatiquement correctement.
set_customshortcuts_12.py
Exécutez-le avec la commande:
python /path/to/set_customshortcuts_12.py <name> <command> <key1> <key2> <key3>
key3
est facultatif, 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
#!/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><'+keys[0]+'>'+keys[1]+'</stringvalue>')
else:
keyfile.insert(9, '\t\t<stringvalue><'+keys[0]+'><'+keys[1]+'>'+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")
Vous pouvez définir un nouveau raccourci personnalisé sans script python, à l'aide de sed. Vous devez juste définir nom, liaison et 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
A écrit un script pour ça. Voir ci-dessous.
Voir l'utilisation dans l'invocation 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/']"