O Ubuntu mudou desde que outras respostas a essa pergunta foram escritas.
As combinações de teclas passaram do gconf para o dconf. O Gconf armazena seus dados em arquivos xml e foi acessado por gconf-editor
e gconf-tool2
. O Dconf armazena seus dados em um formato binário e é acessado por dconf-editor
e gsettings
.
O número de locais em que as combinações de teclas são armazenadas é reduzido. Agora existe um caminho dconf centralizado para armazenar as combinações de teclas do gerenciador de janelas ( org.gnome.desktop.wm.keybindings
). Existem arquivos de mapeamento no diretório /usr/share/gnome-control-center/keybindings/
que mostram como eles são aplicados com base no gerenciador de janelas que você está realmente usando (compiz ou metacidade).
Um segundo conjunto de ligações de teclas não relacionadas ao gerenciador de janelas é armazenado no caminho dconf org.gnome.settings-daemon.plugins.media-keys
Há um terceiro conjunto de combinações de teclas relacionadas aos botões liga / desliga que são armazenados no caminho do dconf org.gnome.settings-daemon.plugins.power
. Atualmente, existe um bug na GUI que permite configurar as combinações de teclas. Não conhece essas configurações. Eu tenho um botão "dormir" no meu teclado. Se eu quiser reatribuí-lo para outra funcionalidade, tenho que desativar a configuração org.gnome.settings-daemon.plugins.power
manualmente. A GUI não faz isso por mim (embora atribua a nova funcionalidade muito bem).
A outra ruga é a ligação de teclas personalizadas. Eles são armazenados no dconf usando o esquema realocável. É feito dessa maneira porque há um número arbitrário deles. Uma abordagem razoável, mas torna mais difícil listá-las ou modificá-las por meio da linha de comando.
Também descobri que a GUI que permite atribuir combinações de teclas é limitada de uma maneira que me incomoda. A GUI permite que exatamente UMA combinação de teclas seja atribuída a cada ação. No dconf, você pode definir uma matriz de ligações para uma única ação. Isso é útil para mim. Por exemplo, eu gosto de ter a ação "fechar a janela" atribuída ao traditonal Alt-F4, bem como a um botão mais fácil de pressionar no meu teclado.
Eu escrevi um script Perl para despejar todas as combinações de teclas em um arquivo csv ou restaurá-las a partir do arquivo csv. Por exemplo, para despejar as combinações de teclas que você pode usar:
./keybindings.pl -e /tmp/keys.csv
e para restaurá-los, você pode usar:
./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);
}
Isso inclui a correção do user2589537 para permitir comandos personalizados com aspas.
gconftool-2 --dump /apps/metacity
ou algo assim.