Ubuntu zmieniło się od czasu napisania innych odpowiedzi na to pytanie.
Skróty klawiszowe zostały przeniesione z gconf do dconf. Gconf przechowuje swoje dane w plikach xml i był dostępny przez gconf-editor
i gconf-tool2
. Dconf przechowuje swoje dane w formacie binarnym i jest dostępny przez dconf-editor
i gsettings
.
Liczba miejsc, w których są przechowywane skróty klawiszowe, jest zmniejszona. Istnieje teraz scentralizowana ścieżka dconf do przechowywania skrótów klawiszowych menedżera okien ( org.gnome.desktop.wm.keybindings
). W katalogu znajdują się pliki odwzorowań, /usr/share/gnome-control-center/keybindings/
które pokazują, w jaki sposób są one stosowane na podstawie aktualnie używanego menedżera okien (compiz lub metacity).
Drugi zestaw powiązań klawiszy niezwiązanych z menedżerem okien jest przechowywany w ścieżce dconf org.gnome.settings-daemon.plugins.media-keys
Istnieje trzeci zestaw skrótów klawiszowych związanych z przyciskami zasilania, który jest przechowywany na ścieżce dconf org.gnome.settings-daemon.plugins.power
. Obecnie w interfejsie GUI występuje błąd, który umożliwia konfigurowanie skrótów klawiszowych. Nie wie o tych ustawieniach. Na klawiaturze mam przycisk „uśpienia”. Jeśli chcę ponownie przypisać to do innej funkcji, muszę org.gnome.settings-daemon.plugins.power
ręcznie wyłączyć to ustawienie . GUI nie robi tego dla mnie (chociaż dobrze przypisuje nową funkcjonalność).
Drugim zmarszczeniem są niestandardowe przypisania klawiszy. Są one przechowywane w dconf przy użyciu schematu relokowalnego. Dokonano tego w ten sposób, ponieważ jest ich dowolna liczba. Rozsądne podejście, ale sprawia, że lista lub modyfikacja ich za pomocą wiersza poleceń jest trudniejsza niż powinna.
Dowiedziałem się również, że GUI, które pozwala przypisywać skróty klawiszowe, jest ograniczone w sposób, który mnie denerwuje. GUI pozwala przypisać dokładnie JEDEN skrót klawiszowy do każdej akcji. W dconf możesz ustawić tablicę powiązań dla pojedynczej akcji. To mi się przydaje. Na przykład lubię mieć przypisaną akcję „zamknij okno” do tradycyjnego Alt-F4, a także do łatwiejszego do naciśnięcia jednego przycisku na klawiaturze.
Napisałem skrypt Perla, aby zrzucić wszystkie skróty klawiszowe do pliku csv lub przywrócić je z pliku csv. Na przykład, aby zrzucić skróty, których możesz użyć:
./keybindings.pl -e /tmp/keys.csv
i aby je przywrócić, możesz użyć:
./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);
}
Obejmuje to poprawkę użytkownika 2589537, która zezwala na niestandardowe polecenia z cytatami.
gconftool-2 --dump /apps/metacity
czy coś takiego.