อูบุนตูเปลี่ยนไปเนื่องจากคำตอบอื่น ๆ ของคำถามนี้เขียน
ปุ่มลัดได้ย้ายจาก gconf ไปยัง dconf แล้ว gconf เก็บข้อมูลในไฟล์ XML และเข้าถึงได้โดยและgconf-editor
gconf-tool2
Dconf เก็บข้อมูลในรูปแบบไบนารีและมีการเข้าถึงโดยและdconf-editor
gsettings
จำนวนของสถานที่ที่จัดเก็บการโยงคีย์จะลดลง ขณะนี้มีพา ธ dconf แบบรวมศูนย์เพื่อจัดเก็บ keybindings manager window ( org.gnome.desktop.wm.keybindings
) มีไฟล์การแมปในไดเรกทอรี/usr/share/gnome-control-center/keybindings/
ที่แสดงวิธีการนำไฟล์เหล่านี้ไปใช้ขึ้นอยู่กับโปรแกรมจัดการหน้าต่างที่คุณใช้งานอยู่ (Compiz หรือ metacity)
ชุดที่สองของการโยงคีย์ที่เกี่ยวข้องกับผู้จัดการหน้าต่างจะถูกเก็บไว้ในพา ธ dconf org.gnome.settings-daemon.plugins.media-keys
มีชุดที่สามของ keybindings org.gnome.settings-daemon.plugins.power
เกี่ยวข้องกับปุ่มไฟฟ้าที่ถูกเก็บไว้ในเส้นทาง ขณะนี้มีข้อผิดพลาดใน GUI ที่ให้คุณกำหนดค่าการโยงคีย์ ไม่ทราบเกี่ยวกับการตั้งค่าเหล่านี้ ฉันมีปุ่ม "นอน" บนคีย์บอร์ดของฉัน หากฉันต้องการมอบหมายให้ฟังก์ชันการทำงานอื่นฉันต้องปิดการตั้งค่าorg.gnome.settings-daemon.plugins.power
ด้วยตนเอง GUI ไม่ได้ทำเพื่อฉัน (แม้ว่าจะกำหนดฟังก์ชั่นใหม่ได้ดี)
ริ้วรอยอื่น ๆ คือการผูกกุญแจที่กำหนดเอง เหล่านี้ถูกเก็บไว้ใน dconf โดยใช้สคีมา relocatable มันทำแบบนี้เพราะมันมีจำนวนตามอำเภอใจ วิธีการที่สมเหตุสมผล แต่ทำให้การแสดงรายการหรือแก้ไขผ่านบรรทัดคำสั่งหนักกว่าที่ควรจะเป็น
ฉันยังพบว่า GUI ที่อนุญาตให้คุณกำหนด keybindings มีข้อ จำกัด ในทางที่ทำให้ฉันรำคาญ GUI อนุญาตให้กำหนดหนึ่งการโยงคีย์ให้กับแต่ละการดำเนินการ ใน dconf คุณสามารถตั้งค่าอาร์เรย์ของการผูกสำหรับการกระทำเดียว สิ่งนี้มีประโยชน์สำหรับฉัน ตัวอย่างเช่นฉันต้องการให้มีการกระทำ "ปิดหน้าต่าง" เพื่อกำหนดให้กับปุ่มกด Alt-F4 แบบดั้งเดิมเช่นเดียวกับการกดปุ่มเดียวบนแป้นพิมพ์ได้ง่ายขึ้น
ฉันได้เขียนสคริปต์ Perl เพื่อทิ้งการโยงคีย์ทั้งหมดไปยังไฟล์ csv หรือเรียกคืนจากไฟล์ csv ตัวอย่างเช่นการดัมพ์การโยงคีย์ที่คุณอาจใช้:
./keybindings.pl -e /tmp/keys.csv
และเพื่อกู้คืนพวกเขาคุณอาจใช้:
./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);
}
ซึ่งรวมถึงการแก้ไขโดยuser2589537เพื่อให้คำสั่งที่กำหนดเองด้วยคำพูดในพวกเขา
gconftool-2 --dump /apps/metacity
หรืออะไรแบบนั้น