Ubuntu telah berubah sejak jawaban lain untuk pertanyaan ini ditulis.
Gantungan kunci telah dipindahkan dari gconf ke dconf. Gconf menyimpan datanya dalam file xml dan diakses oleh gconf-editor
dan gconf-tool2
. Dconf menyimpan datanya dalam format biner dan diakses oleh dconf-editor
dan gsettings
.
Jumlah tempat penyimpanan gantungan kunci berkurang. Sekarang ada jalur dconf terpusat untuk menyimpan keybindings window manager ( org.gnome.desktop.wm.keybindings
). Ada memetakan file dalam direktori /usr/share/gnome-control-center/keybindings/
yang menunjukkan bagaimana ini diterapkan berdasarkan window manager yang sebenarnya Anda gunakan (compiz atau metacity).
Set kedua binding key terkait non-window-manager disimpan di path dconf org.gnome.settings-daemon.plugins.media-keys
Ada seperangkat ikatan kunci terkait dengan tombol daya yang disimpan di jalur dconf org.gnome.settings-daemon.plugins.power
. Saat ini ada bug di GUI yang memungkinkan Anda mengkonfigurasi ikatan kunci. Tidak tahu tentang pengaturan ini. Saya memiliki tombol "tidur" di keyboard saya. Jika saya ingin menetapkan kembali ke fungsi lain, saya harus menonaktifkan pengaturan org.gnome.settings-daemon.plugins.power
secara manual. GUI tidak melakukannya untuk saya (walaupun itu memberikan fungsi baru dengan baik).
Kerutan lainnya adalah binding kunci kustom. Ini disimpan dalam dconf menggunakan skema relocatable. Ini dilakukan dengan cara ini karena ada jumlah yang sewenang-wenang dari mereka. Pendekatan yang masuk akal, tetapi membuat daftar atau memodifikasi mereka melalui baris perintah lebih sulit dari yang seharusnya.
Saya juga menemukan bahwa GUI yang memungkinkan Anda untuk menetapkan keybindings terbatas dengan cara yang mengganggu saya. GUI memungkinkan tepat SATU pengikat kunci yang ditugaskan untuk setiap tindakan. Di dconf, Anda dapat mengatur array binding untuk satu tindakan. Ini berguna bagi saya. Sebagai contoh, saya ingin memiliki tindakan "close-window" yang ditugaskan untuk Alt-F4 tradisional serta untuk menekan satu tombol pada keybord saya.
Saya telah menulis skrip Perl untuk membuang semua keybindings ke file csv, atau mengembalikannya dari file csv. Misalnya untuk membuang ikatan kunci yang mungkin Anda gunakan:
./keybindings.pl -e /tmp/keys.csv
dan untuk mengembalikannya, Anda dapat menggunakan:
./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);
}
Ini termasuk perbaikan oleh user2589537 untuk memungkinkan perintah khusus dengan tanda kutip di dalamnya.
gconftool-2 --dump /apps/metacity
atau sesuatu seperti itu.