Ubuntu a changé depuis que les autres réponses à cette question ont été écrites.
Les raccourcis clavier ont été déplacés de gconf à dconf. Gconf stocke ses données dans des fichiers xml et était accédé par gconf-editor
y gconf-tool2
. Dconf stocke ses données dans un format binaire et on y accède par dconf-editor
y gsettings
.
Le nombre d'endroits où sont stockés les raccourcis clavier est réduit. Il y a maintenant un chemin dconf centralisé pour stocker les raccourcis clavier du gestionnaire de fenêtres ( org.gnome.desktop.wm.keybindings
). Il existe des fichiers de cartographie dans le répertoire /usr/share/gnome-control-center/keybindings/
qui montrent comment ils sont appliqués en fonction du gestionnaire de fenêtres que vous utilisez actuellement (compiz ou metacity).
Un deuxième ensemble de liaisons de touches non liées au gestionnaire de fenêtres est stocké dans le chemin dconf org.gnome.settings-daemon.plugins.media-keys
Il existe un troisième ensemble de combinaisons de touches liées aux boutons d'alimentation qui est stocké dans le chemin dconf. org.gnome.settings-daemon.plugins.power
. Il y a actuellement un bogue dans l'interface graphique qui vous permet de configurer les combinaisons de touches. Elle ne connaît pas ces paramètres. J'ai un bouton "veille" sur mon clavier. Si je veux le réaffecter à une autre fonctionnalité, je dois désactiver le paramètre dans le menu org.gnome.settings-daemon.plugins.power
manuellement. L'interface graphique ne le fait pas pour moi (bien qu'elle attribue la nouvelle fonctionnalité sans problème).
L'autre problème est la personnalisation des touches. Celles-ci sont stockées dans dconf en utilisant un schéma relocalisable. Il est fait de cette façon parce qu'il y a un nombre arbitraire d'entre eux. C'est une approche raisonnable, mais cela rend leur énumération ou leur modification via la ligne de commande plus difficile qu'elle ne devrait l'être.
J'ai également découvert que l'interface graphique qui vous permet d'assigner des raccourcis clavier est limitée d'une manière qui m'ennuie. L'interface graphique permet d'assigner exactement UNE combinaison de touches à chaque action. Dans dconf, vous pouvez définir un tableau de combinaisons pour une seule action. Ceci est utile pour moi. Par exemple, j'aime avoir l'action "fermer-fenêtre" assignée à la traditionnelle Alt-F4 ainsi qu'à un bouton unique plus facile à frapper sur mon clavier.
J'ai écrit un script Perl pour vider tous les keybindings dans un fichier csv, ou les restaurer à partir du fichier csv. Par exemple pour vider les keybindings vous pourriez utiliser :
./keybindings.pl -e /tmp/keys.csv
et pour les restaurer, vous pouvez utiliser :
./keybindings.pl -i /tmp/keys.csv
#!/usr/bin/perl
use strict;
my $action = '';
my $filename = '-';
for my $arg (@ARGV){
if ($arg eq "-e" or $arg eq "--export"){
$action = 'export';
} elsif ($arg eq "-i" or $arg eq "--import"){
$action = 'import';
} elsif ($arg eq "-h" or $arg eq "--help"){
print "Import and export keybindings\n";
print " -e, --export <filename>\n";
print " -i, --import <filename>\n";
print " -h, --help\n";
exit;
} elsif ($arg =~ /^\-/){
die "Unknown argument $arg";
} else {
$filename = $arg;
if (!$action){
if ( -e $filename){
$action='import';
} else {
$action='export';
}
}
}
}
$action='export' if (!$action);
if ($action eq 'export'){
&export();
} else {
&import();
}
sub export(){
my $gsettingsFolders = [
['org.gnome.desktop.wm.keybindings','.'],
['org.gnome.settings-daemon.plugins.power','button'],
['org.gnome.settings-daemon.plugins.media-keys','.'],
];
my $customBindings = [
];
$filename = ">$filename";
open (my $fh, $filename) || die "Can't open file $filename: $!";
for my $folder (@$gsettingsFolders){
my @keylist = split(/\n/, `gsettings list-recursively $folder->[0]`);
foreach my $line (@keylist){
if ($line =~ /^([^ ]+) ([^ ]+)(?: \@[a-z]+)? (.*)/){
my ($path, $name, $value) = ($1,$2,$3);
if ($name eq "custom-keybindings"){
$value =~ s/[\[\]\' ]//g;
my @c = split(/,/, $value);
$customBindings = \@c;
} elsif ($name =~ /$folder->[1]/){
if ($value =~ /^\[|\'/){
if ($value =~ /^\[\'(?:disabled)?\'\]$/){
$value = '[]';
}
print $fh "$path\t$name\t$value\n";
}
}
} else {
die "Could note parse $line";
}
}
}
for my $folder (@$customBindings){
my $gs = `gsettings list-recursively org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:$folder`;
my ($binding) = $gs =~ /org.gnome.settings-daemon.plugins.media-keys.custom-keybinding binding (\'[^\n]+\')/g;
my ($command) = $gs =~ /org.gnome.settings-daemon.plugins.media-keys.custom-keybinding command (\'[^\n]+\')/g;
my ($name) = $gs =~ /org.gnome.settings-daemon.plugins.media-keys.custom-keybinding name (\'[^\n]+\')/g;
$command =~ s/\"/\\\"/g;
$command =~ s/^'(.*)'$/$1/g;
$command =~ s/\'/\'\\\'\'/g;
$command = "\'$command\'";
print $fh "custom\t$name\t$command\t$binding\n"
}
close($fh);
}
sub import(){
$filename = "<$filename";
open (my $fh, $filename) || die "Can't open file $filename: $!";
my $customcount=0;
while (my $line = <$fh>){
chomp $line;
if ($line){
my @v = split(/\t/, $line);
if (@v[0] eq 'custom'){
my ($custom, $name, $command, $binding) = @v;
print "Installing custom keybinding: $name\n";
print `gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom$customcount/ name \"$name\"`;
print `gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom$customcount/ command \"$command\"`;
print `gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom$customcount/ binding \"$binding\"`;
$customcount++;
} else {
my ($path, $name, $value) = @v;
print "Importing $path $name\n";
print `gsettings set \"$path\" \"$name\" \"$value\"`;
}
}
}
if ($customcount > 0){
my $customlist = "";
for (my $i=0; $i<$customcount; $i++){
$customlist .= "," if ($customlist);
$customlist .= "'/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom$i/'";
}
$customlist = "[$customlist]";
print "Importing list of custom keybindings.\n";
print `gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings \"$customlist\"`;
}
close($fh);
}
Cela inclut la correction par utilisateur2589537 pour autoriser les commandes personnalisées contenant des guillemets.