Ubuntu змінився з моменту написання інших відповідей на це питання.
Клавіатурні зв’язки перейшли від gconf до dconf. Gconf зберігає свої дані у xml-файлах, до них звертається gconf-editor
та gconf-tool2
. Dconf зберігає свої дані у двійковому форматі та має доступ до dconf-editor
та gsettings
.
Кількість місць, в яких зберігаються клавіші, зменшується. Зараз існує централізований шлях dconf для зберігання зв'язків ключів менеджера вікон ( org.gnome.desktop.wm.keybindings
). У каталозі є файли відображення, /usr/share/gnome-control-center/keybindings/
які показують, як вони застосовуються на основі вікна-менеджера, який ви фактично використовуєте (compiz або metacity).
Другий набір ключів, що не пов'язані з вікном, пов'язані з ключем, зберігається у шляху dconf org.gnome.settings-daemon.plugins.media-keys
Існує третій набір клавішних зв’язків, пов’язаний з кнопками живлення, які зберігаються в dconf шляху org.gnome.settings-daemon.plugins.power
. Наразі в графічному інтерфейсі є помилка, яка дозволяє вам налаштувати прив'язки клавіш. Про ці налаштування він не знає. У мене на клавіатурі є кнопка "сон". Якщо я хочу передати його іншому функціоналу, я мушу відключити налаштування org.gnome.settings-daemon.plugins.power
вручну. GUI не робить це для мене (хоча він призначає нову функціональність просто чудово).
Інша зморшка - це спеціальні прив’язки ключів. Вони зберігаються в dconf за допомогою переїзної схеми. Це зроблено таким чином, оскільки їх існує довільна кількість. Розумний підхід, але він перераховує або модифікує їх за допомогою командного рядка складніше, ніж це має бути.
Я також з’ясував, що графічний інтерфейс, який дозволяє призначити прив'язки клавіш, обмежений таким чином, який мене дратує. Графічний інтерфейс дозволяє призначати рівно ОДНУ прив'язку клавіш до кожної дії. У 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
чи щось подібне.