Ubuntu a changé depuis que d'autres réponses à cette question ont été écrites.
Les raccourcis clavier sont passés de gconf à dconf. Gconf stocke ses données dans des fichiers XML et a été accédé par gconf-editor
et gconf-tool2
. Dconf stocke ses données dans un format binaire et est accessible par dconf-editor
et gsettings
.
Le nombre d’espaces de stockage des raccourcis clavier est réduit. Il existe désormais un chemin dconf centralisé pour stocker les raccourcis clavier du gestionnaire de fenêtres ( org.gnome.desktop.wm.keybindings
). Il existe des fichiers de mappage dans le répertoire /usr/share/gnome-control-center/keybindings/
qui montrent comment ceux-ci sont appliqués en fonction du gestionnaire de fenêtres que vous utilisez (compiz ou metacity).
Un deuxième ensemble de liaisons de clés non liées à un gestionnaire de fenêtre est stocké dans le chemin dconf org.gnome.settings-daemon.plugins.media-keys
Il existe un troisième ensemble de raccourcis clavier associés aux boutons d’alimentation qui sont stockés dans le chemin dconf org.gnome.settings-daemon.plugins.power
. Il y a actuellement un bug dans l'interface graphique qui vous permet de configurer les raccourcis clavier. Il ne connaît pas ces paramètres. J'ai un bouton "sommeil" sur mon clavier. Si je veux le réaffecter à d'autres fonctionnalités, je dois désactiver le paramètre dans org.gnome.settings-daemon.plugins.power
manuellement. L’interface graphique ne le fait pas pour moi (bien qu’elle attribue très bien la nouvelle fonctionnalité).
L’autre des rides est la création de raccourcis clavier. Ceux-ci sont stockés dans dconf en utilisant un schéma déplaçable. C'est fait de cette façon car il y en a un nombre arbitraire. Une approche raisonnable, mais il est plus difficile de les lister ou de les modifier via la ligne de commande.
J'ai également découvert que l'interface graphique qui vous permet d'attribuer des raccourcis clavier est limitée d'une manière qui m'agace. L'interface utilisateur graphique vous permet d'affecter UN SEUL raccourci à chaque action. Dans dconf, vous pouvez définir un tableau de liaisons pour une action unique. Ceci est utile pour moi. Par exemple, j'aime avoir l'action "fermer la fenêtre" assignée à la traditionnelle Alt-F4, ainsi qu'un simple bouton sur mon clavier.
J'ai écrit un script Perl pour transférer tous les raccourcis vers un fichier csv ou les restaurer à partir du fichier csv. Par exemple, pour vider les raccourcis clavier que 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) = (,,);
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/^'(.*)'$//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 le correctif de user2589537 pour autoriser les commandes personnalisées avec des guillemets.