Ubuntu ha cambiado desde que se escribieron otras respuestas a esta pregunta.
Las combinaciones de teclas se han movido de gconf a dconf. Gconf almacena sus datos en archivos xml y fue accedido por gconf-editor
y gconf-tool2
. Dconf almacena sus datos en formato binario y se accede por dconf-editor
y gsettings
.
Se reduce el número de lugares donde se almacenan las combinaciones de teclas. Ahora hay una ruta dconf centralizada para almacenar las combinaciones de teclas del administrador de ventanas ( org.gnome.desktop.wm.keybindings
). Hay archivos de mapeo en el directorio /usr/share/gnome-control-center/keybindings/
que muestran cómo se aplican según el administrador de ventanas que está utilizando (compiz o metacity).
Un segundo conjunto de enlaces de teclas no relacionados con el administrador de ventanas se almacena en la ruta dconf org.gnome.settings-daemon.plugins.media-keys
Hay un tercer conjunto de combinaciones de teclas relacionadas con los botones de encendido que se almacena en la ruta dconf org.gnome.settings-daemon.plugins.power
. Actualmente hay un error en la GUI que le permite configurar la combinación de teclas. No sabe acerca de estas configuraciones. Tengo un botón "dormir" en mi teclado. Si quiero reasignarlo a otra funcionalidad, tengo que deshabilitar la configuración org.gnome.settings-daemon.plugins.power
manualmente. La GUI no lo hace por mí (aunque asigna la nueva funcionalidad muy bien).
La otra arruga son las combinaciones de teclas personalizadas. Estos se almacenan en dconf utilizando un esquema reubicable. Se hace de esta manera porque hay un número arbitrario de ellos. Un enfoque razonable, pero hace que enumerarlos o modificarlos a través de la línea de comando sea más difícil de lo que debería ser.
También descubrí que la GUI que le permite asignar combinaciones de teclas está limitada de una manera que me molesta. La GUI permite que se asigne exactamente UNA combinación de teclas a cada acción. En dconf, puede establecer una matriz de enlaces para una sola acción. Esto me es útil. Por ejemplo, me gusta tener la acción "cerrar ventana" asignada al Alt-F4 tradicional, así como a un solo botón más fácil de presionar en mi teclado.
He escrito un script de Perl para volcar todas las combinaciones de teclas en un archivo csv, o restaurarlas desde el archivo csv. Por ejemplo, para volcar las combinaciones de teclas que podría usar:
./keybindings.pl -e /tmp/keys.csv
y para restaurarlos puedes 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);
}
Esto incluye la corrección por user2589537 para permitir comandos personalizados con comillas.
gconftool-2 --dump /apps/metacity
o algo así.