¿Dónde se almacenan los atajos de teclado de GNOME?

53

Por lo general, cargo una nueva versión para cada versión para mantener mi sistema operativo actualizado y al mismo tiempo preservar la última versión en otra partición como copia de seguridad. También utilizo muchas asignaciones de teclas personalizadas.

Hasta ahora he descubierto cómo transferir la mayoría de mi configuración a través de los sistemas, pero no puedo entender dónde se almacenan las asignaciones de atajos de teclado personalizados.

¿Alguien sabe dónde pone estos gnomos? ¿Hay archivos separados de configuración de usuario (es decir, ~ /) y de configuración del sistema (es decir, / etc)?

Evan Plaice
fuente
2
¿Cómo cambiaste la configuración? ¿Usando GConf Editor? Supongo que quieres gconftool-2 --dump /apps/metacityo algo así.
Mikel
1
@Mikel Muchas gracias por ese comentario. Por lo que puedo decir en gconf-editor, la mayoría de las combinaciones de teclas se almacenan en / apps / metacity mientras que el resto se distribuye. Actualmente estoy escribiendo scripts de Python de Importar / Exportar para hacer que los enlaces de copia de seguridad / restauración sean una operación de un solo clic.
Evan Plaice
Relacionado: askubuntu.com/questions/17626/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

45

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-editory gconf-tool2. Dconf almacena sus datos en formato binario y se accede por dconf-editory 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.powermanualmente. 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.

Stephen Ostermiller
fuente
2
Archivé dos errores contra los atajos de teclado ubuntu gnome-control-center. Los encontré al crear este script. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/… y bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/…
Stephen Ostermiller
1
Gracias por el script @Stephen, ¡acabo de probar Ubuntu 13.10 y funcionó! Creó una esencia para compartir fácilmente: gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci
Impresionante trabajo y buen trabajo documentando los detalles.
Evan Plaice
2
Todavía funciona en Ubuntu GNOME 3.2 - ¡Gracias!
Klele
1
"funciona" técnicamente para mí, pero probablemente tenga que ver diferentes secciones dconf para Ubuntu-MATE (es decir [org/mate/marco/global-keybindings], [org/mate/marco/window-keybindings], ...)
Frank Nocke
17

Cómo hacer una copia de seguridad de la configuración de dconf como atajos de teclado

  1. Volcarlos a todos en un archivo:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Abra ese archivo en un editor de texto y seleccione la configuración que le interesa:

    editor ~/.config/dconf/user.conf
    

    Si usa Vim, querrá este resaltado de sintaxis .

    Pronto te preguntarás qué es<Primary> .

  3. Si no conoce el nombre de la configuración, pero sabe cómo modificarlo desde una GUI como unity-control-center, ejecute:

    dconf watch /
    

    y luego modificarlos. La configuración exacta aparecerá en el terminal.

  4. Cuando desee restaurar esa configuración, ejecute:

    dconf load / <~/.config/dconf/user.conf
    
  5. Git rastrea el archivo de configuración para nunca perderlo. https://github.com/andsens/homeshick es mi método favorito actual.

Probado en Ubuntu 15.10. Consejo adaptado de: http://catern.com/2014/12/21/plain-text-configuration-gnome.html

Desafortunadamente, el terminal Gnome es resistente a tales ediciones debido a las identificaciones de perfil impredecibles: edite el perfil del terminal Gnome desde la línea de comandos el 18.04

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente
15

Los atajos de teclado no se almacenan en un solo lugar

Dependiendo de su versión de distribución, la aplicación de atajos de teclado puede llamarse cosas diferentes en la GUI, pero en la línea de comando debería llamarse 'gnome-keybinding-properties'. Resulta que esta pequeña aplicación ordenada trae todos los accesos directos en un lugar conveniente para que los usuarios editen.

Como no existe una herramienta de exportación / importación con un solo clic para las combinaciones de teclas en Ubuntu, escribí una en python:

Aquí hay un enlace al guión

Una exportación extrae la configuración del sistema. Esencialmente contiene una lista de todas las ubicaciones de combinación de teclas está codificada en un diccionario en el script. El script emula la lista y ejecuta el comando "gconftool-2 --get [location]" para cada clave y almacena el valor en el diccionario junto con la clave. Luego, cuando especifica la ubicación para guardar la configuración, guarda el diccionario en el archivo en formato json.

Un script de importación invierte este proceso. Carga el diccionario del archivo json. Luego enumera a través de estos y ejecuta el comando "gconftool-2 --type string --set [location] [value]" para restaurar todas las configuraciones guardadas.

Un disparo en cada extremo y guarda / restaura cada atajo de teclado sin tocar ninguna de las otras configuraciones del sistema.

Las únicas dependencias para estos scripts son:

  • Python (probado y trabajando en 2.6, 2.7 y 3.1)
  • gconftool-2 (viene estándar con una instalación de Ubuntu)
  • zenity (viene estándar con una instalación de Ubuntu)

Se necesita Python para ejecutar el script, se usa gconftool-2 para obtener / establecer la configuración, se necesita zenity para los diálogos de GUI de carga / guardado de archivos.

He creado una entrada en Ubuntu Brainstorm y estoy progresando para que esta característica se introduzca en el menú GUI 'gnome-keybinding-properties'.

Actualizar:

Actualicé los scripts de importación y exportación combinados en uno, agregué la funcionalidad completa de la línea de comandos (incluida --help info) y lo hice compatible tanto para python2x como para python3k. Además, agregó el enlace a la idea de Ubuntu Brainstorm.

Evan Plaice
fuente
Brainstorm no es un buen lugar para las mejoras reales de Ubuntu: solo los 10 problemas principales realmente llaman la atención del desarrollador. Te sugiero que encuentres la página de Launchpad gnome-keybinding-propertiesy publiques un parche con tu script.
Oxwivi
Su script es bueno para los atajos enumerados / manejados por gconftool-2 / gconf-editor ... y supongo que depende de lo que uno llama un atajo de teclado GNOME ... pero no está recogiendo atajos de usuario agregados en todo el sistema por Keyboard Shortcutsej. gnome-keybinding-properties... ni otras combinaciones de teclas agregadas por, por ejemplo Xbindkeys... así que sospecho que gconf 'no es donde están almacenados los atajos de todo el sistema, sino que es una interfaz para algo / en algún lugar más profundo ... (I He estado buscando ese lugar .. :). tal vez solo necesito mantener 3 listas 'exportadas' por ahora ...
Peter.O
@ fred.bear Estoy bastante seguro de que todos están almacenados en gconf, pero descubro que se agregan nuevas combinaciones de teclas a las propiedades de combinación de teclas gnome cuando cambia los valores predeterminados en el panel de control. El script actual realizará los accesos directos predeterminados que se encuentran en la GUI, pero no podrá admitir todos los accesos directos sin una integración más estrecha en la GUI. Actualmente ya hay un plan abierto para esto, así que estoy tratando de ponerme en contacto con el otro desarrollador que propuso esto para resolver los detalles en el launchpad. Por ahora ... esto funciona.
Evan Plaice
3

En 11.10 ejecutando Gnome classic encontré un conjunto de directorios (Custom0, Custom1 ...) en

$HOME/.gconf/desktop/gnome/keybindings

Copié esos directorios en la misma carpeta en una instalación limpia 12.04 (nuevamente ejecutándose con Gnome fallback), cerré la sesión y volví a iniciar sesión. Las combinaciones de teclas se enredaron un poco en la transición (algo extraño le sucedió al modificador SUPER), pero de lo contrario estaban allí.

EntropíaReducción
fuente
2

Hay un pequeño problema con la respuesta aceptada, ya que no puede manejar comandos personalizados con comillas. Solo cambié el procesamiento de comandos personalizados para generar la salida correcta.

#!/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);
}
Jordan Weitz
fuente
Excelente primera respuesta en AskUbuntu! Felicidades!
Fabby
He integrado tus cambios en la respuesta aceptada.
Stephen Ostermiller