Ubuntu đã thay đổi kể từ khi câu trả lời khác cho câu hỏi này được viết.
Keybindings đã chuyển từ gconf sang dconf. Gconf lưu trữ dữ liệu của mình trong các tệp xml và được truy cập bởi gconf-editor
và gconf-tool2
. Dconf lưu trữ dữ liệu của nó ở định dạng nhị phân và được truy cập bởi dconf-editor
và gsettings
.
Số lượng vị trí mà keybindings được lưu trữ bị giảm. Hiện tại có một đường dẫn drc tập trung để lưu trữ keybindings của trình quản lý cửa sổ ( org.gnome.desktop.wm.keybindings
). Có các tệp ánh xạ trong thư mục /usr/share/gnome-control-center/keybindings/
cho biết cách chúng được áp dụng dựa trên trình quản lý cửa sổ mà bạn thực sự đang sử dụng (compiz hoặc metacity).
Một tập hợp các ràng buộc khóa không liên quan đến trình quản lý cửa sổ thứ hai được lưu trữ trong đường dẫn dconf org.gnome.settings-daemon.plugins.media-keys
Có một bộ khóa phím thứ ba liên quan đến các nút nguồn được lưu trữ trong đường dẫn dconf org.gnome.settings-daemon.plugins.power
. Hiện tại có một lỗi trong GUI cho phép bạn định cấu hình các phím. Nó không biết về các cài đặt này. Tôi có nút "ngủ" trên bàn phím. Nếu tôi muốn gán lại nó cho chức năng khác, tôi phải tắt cài đặt org.gnome.settings-daemon.plugins.power
theo cách thủ công. GUI không làm điều đó cho tôi (mặc dù nó chỉ gán chức năng mới tốt).
Các nếp nhăn khác là ràng buộc quan trọng tùy chỉnh. Chúng được lưu trữ trong dconf bằng cách sử dụng lược đồ có thể định vị lại. Nó được thực hiện theo cách này bởi vì có một số lượng tùy ý của họ. Một cách tiếp cận hợp lý, nhưng nó làm cho việc liệt kê hoặc sửa đổi chúng thông qua dòng lệnh khó hơn mức cần thiết.
Tôi cũng phát hiện ra rằng GUI cho phép bạn gán keybindings bị hạn chế theo cách làm tôi khó chịu. GUI cho phép chính xác MỘT liên kết phím được gán cho mỗi hành động. Trong dconf, bạn có thể đặt một mảng các ràng buộc cho một hành động. Điều này hữu ích với tôi. Ví dụ: tôi muốn có hành động "đóng cửa sổ" được gán cho Alt-F4 truyền thống cũng như để nhấn một nút dễ dàng hơn trên bàn phím của tôi.
Tôi đã viết một tập lệnh Perl để kết xuất tất cả các keybindings vào tệp csv hoặc khôi phục chúng từ tệp csv. Ví dụ để kết xuất các phím bấm bạn có thể sử dụng:
./keybindings.pl -e /tmp/keys.csv
và để khôi phục chúng, bạn có thể sử dụng:
./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);
}
Điều này bao gồm sửa lỗi bởi user2589537 để cho phép các lệnh tùy chỉnh có dấu ngoặc kép trong đó.
gconftool-2 --dump /apps/metacity
hoặc một cái gì đó như thế.