O Ubuntu mudou desde que outras respostas a essa pergunta foram escritas.
Keybindings foram movidos 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. Existe agora um caminho centralizado do dconf para armazenar atalhos de teclado do gerenciador de janelas ( org.gnome.desktop.wm.keybindings
). Há 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á usando (compiz ou metacity).
Um segundo conjunto de ligações de teclas não relacionadas ao gerenciador de janelas é armazenado no caminho do dconf org.gnome.settings-daemon.plugins.media-keys
Há um terceiro conjunto de atalhos de teclado relacionados aos botões de energia armazenados no caminho do dconf org.gnome.settings-daemon.plugins.power
. Atualmente, há um bug na GUI que permite configurar atalhos de teclado. Não sabe sobre essas configurações. Eu tenho um botão "sleep" no meu teclado. Se eu quiser reatribuir a outra funcionalidade, tenho que desabilitar a configuração em 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 combinação de teclas personalizadas. Estes são armazenados em dconf usando esquema relocável. É feito assim porque há um número arbitrário deles. Uma abordagem razoável, mas torna mais difícil listá-los ou modificá-los por meio da linha de comando do que deveria.
Eu também descobri que a interface gráfica que permite que você atribua atalhos de teclado é limitada de uma forma que me irrita. A GUI permite que exatamente uma tecla de atalho 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 "close-window" atribuída ao traditonal Alt-F4, bem como a facilidade de apertar um botão no meu teclado.
Eu escrevi um script Perl para despejar todos os atalhos de teclado em um arquivo csv ou restaurá-los do arquivo csv. Por exemplo, para descarregar 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) = (,,);
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/^'(.*)'$//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 de user2589537 para permitir comandos personalizados com aspas nelas.