Où les raccourcis clavier GNOME sont-ils stockés?

53

En règle générale, je charge une nouvelle version pour chaque version afin que mon système d'exploitation reste à jour tout en préservant la dernière version sur une autre partition. J'utilise aussi beaucoup de mappages de clés personnalisés.

Jusqu'à présent, j'ai compris comment transférer la majeure partie de ma configuration entre systèmes, mais je ne sais pas où les mappages de raccourcis clavier personnalisés sont stockés.

Est-ce que quelqu'un sait où gnome les met? Existe-t-il des fichiers de configuration utilisateur (par exemple, ~ /) et de configuration système (par exemple, / etc)?

Evan Plaice
la source
2
Comment avez-vous modifié les paramètres? Utiliser GConf Editor? Je suppose que vous voulez gconftool-2 --dump /apps/metacityou quelque chose comme ça.
Mikel
1
@ Mikel Merci beaucoup pour ce commentaire. D'après ce que je peux dire dans gconf-editor, la plupart des associations de touches sont stockées dans / apps / metacity, tandis que les autres sont réparties. J'écris actuellement des scripts d'importation / exportation python pour que la liaison de clé / sauvegarde soit une opération en un clic.
Evan Plaice le
Connexes: askubuntu.com/questions/17626/…
Ciro Santilli a annoncé

Réponses:

45

Ubuntu a changé depuis que d’autres réponses à cette question ont été écrites.

Les raccourcis clavier sont passés de gconf à dconf. Gconf stocke ses données dans des fichiers XML et a été consulté par gconf-editoret gconf-tool2. Dconf stocke ses données dans un format binaire et est accessible par dconf-editoret gsettings.

Le nombre d'emplacements dans lesquels les raccourcis clavier sont stockés est réduit. Il existe maintenant un chemin dconf centralisé pour stocker les liaisons de clés du gestionnaire de fenêtres ( org.gnome.desktop.wm.keybindings). Il existe dans le répertoire des fichiers de mappage /usr/share/gnome-control-center/keybindings/indiquant comment ceux-ci sont appliqués en fonction du gestionnaire de fenêtres que vous utilisez réellement (compiz ou metacity).

Un deuxième ensemble de raccourcis clavier liés au gestionnaire de fenêtres est stocké dans le chemin d'accès dconf org.gnome.settings-daemon.plugins.media-keys

Un troisième ensemble de liaisons de clé liées aux boutons d’alimentation est stocké dans le chemin d'accès dconf org.gnome.settings-daemon.plugins.power. Il y a actuellement un bogue dans l'interface graphique qui vous permet de configurer les liaisons de clé. Il ne sait pas à propos de ces paramètres. J'ai un bouton "sommeil" sur mon clavier. Si je veux le réaffecter à une autre fonctionnalité, je dois désactiver le paramètre org.gnome.settings-daemon.plugins.powermanuellement. L'interface graphique ne le fait pas pour moi (bien qu'il assigne parfaitement la nouvelle fonctionnalité).

L'autre ride est des raccourcis clavier personnalisés. Celles-ci sont stockées dans dconf à l'aide d'un schéma déplaçable. Cela se fait de cette façon car il y en a un nombre arbitraire. Une approche raisonnable, mais il est plus difficile de les répertorier ou de les modifier via la ligne de commande.

J'ai également découvert que l'interface graphique qui vous permet d'attribuer des raccourcis clavier est limitée de manière à m'agacer. L'interface graphique permet d'attribuer UNE SEULE touche à chaque action. Dans dconf, vous pouvez définir un tableau de liaisons pour une seule action. Cela m'est utile. Par exemple, j'aime bien que l'action "fermer la fenêtre" soit assignée à la touche Alt-F4 traditionnelle, ainsi qu'à un bouton plus facile à utiliser sur mon clavier.

J'ai écrit un script Perl pour vider toutes les associations de clés dans un fichier csv ou pour les restaurer à partir du fichier csv. Par exemple, pour vider les raccourcis clavier que vous pourriez utiliser:

./keybindings.pl -e /tmp/keys.csv

et pour les restaurer, vous pouvez utiliser:

./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);
}

Cela inclut le correctif de l' utilisateur2589537 pour autoriser les commandes personnalisées contenant des guillemets.

Stephen Ostermiller
la source
2
J'ai classé deux bogues contre les raccourcis clavier ubuntu gnome-control-center. Je les ai trouvés lors de la création de ce script. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/… et bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/…
Stephen Ostermiller
1
Merci pour le script @Stephen, j'ai juste essayé Ubuntu 13.10 et ça a marché! Création d'un résumé pour faciliter le partage: gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci
Excellent travail et bon travail pour documenter les détails.
Evan Plaice
2
Fonctionne toujours sur Ubuntu GNOME 3.2 - Merci!
Klequis
1
"fonctionne" techniquement pour moi, mais aurait probablement besoin de regarder les différentes sections de dconf pour Ubuntu-MATE (c. -à [org/mate/marco/global-keybindings], [org/mate/marco/window-keybindings]...)
Frank Nocke
17

Comment sauvegarder les paramètres dconf tels que les raccourcis clavier

  1. Jetez-les tous dans un fichier:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Ouvrez ce fichier dans un éditeur de texte et sélectionnez les paramètres qui vous intéressent:

    editor ~/.config/dconf/user.conf
    

    Si vous utilisez Vim, vous voudrez que cette syntaxe soit surlignée .

    Vous allez bientôt vous demander ce qui est<Primary> .

  3. Si vous ne connaissez pas le nom du paramètre, mais savez comment le modifier à partir d'une interface graphique unity-control-center, exécutez:

    dconf watch /
    

    et ensuite les modifier. Le réglage exact apparaîtra alors sur le terminal.

  4. Lorsque vous souhaitez restaurer ces paramètres, exécutez:

    dconf load / <~/.config/dconf/user.conf
    
  5. Git suit le fichier de configuration pour ne jamais le perdre. https://github.com/andsens/homeshick est ma méthode préférée actuelle.

Testé sur Ubuntu 15.10. Conseil adapté de: http://catern.com/2014/12/21/plain-text-configuration-gnome.html

Le terminal Gnome est malheureusement résistant à de telles modifications à cause des identifiants de profil imprévisibles: Modifiez le profil Gnome-Terminal à partir de la ligne de commande le 18.04.

Ciro Santilli 改造 中心 六四 事件
la source
15

Les raccourcis clavier ne sont pas stockés dans un seul endroit

Selon la version de votre distribution, l'application de raccourcis clavier peut être appelée de différentes manières dans l'interface graphique, mais sur la ligne de commande, elle doit s'appeler 'gnome-keybinding-properties'. Il s'avère que cette petite application soignée rassemble tous les raccourcis dans un endroit pratique que les utilisateurs peuvent modifier.

Puisqu'il n'existe aucun outil d'exportation / importation en un clic pour les liaisons de clé dans Ubuntu, j'en ai écrit un en python:

Voici un lien vers le script

Une exportation extrait les paramètres du système. Essentiellement, il contient une liste de tous les emplacements de liaison de clé est codé en dur dans un dictionnaire dans le script. Le script énumère la liste et exécute la commande "gconftool-2 --get [emplacement]" pour chaque clé et stocke la valeur dans le dictionnaire avec la clé. Ensuite, lorsque vous spécifiez l'emplacement d'enregistrement des paramètres, le dictionnaire est enregistré dans le fichier au format JSON.

Un script d'importation inverse ce processus. Il charge le dictionnaire à partir du fichier json. Ensuite, il énumère ces éléments et exécute la commande "gconftool-2 --type string --set [location] [valeur]" pour restaurer tous les paramètres enregistrés.

Un coup à chaque extrémité et il enregistre / restaure chaque raccourci clavier sans toucher aucun des autres paramètres de configuration du système.

Les seules dépendances pour ces scripts sont:

  • python (testé et fonctionnant en 2.6, 2.7 et 3.1)
  • gconftool-2 (livré en standard avec une installation Ubuntu)
  • zenity (livré en standard avec une installation Ubuntu)

Python est nécessaire pour exécuter le script, gconftool-2 est utilisé pour obtenir / définir les paramètres, zenity est nécessaire pour les dialogues de chargement / enregistrement de fichiers.

J'ai créé une entrée sur Ubuntu Brainstorm et je progresse maintenant pour que cette fonctionnalité soit introduite dans le menu de l'interface graphique «gnome-keybinding-properties».

Mise à jour:

J'ai mis à jour la combinaison des scripts d'importation et d'exportation en un, ajouté une fonctionnalité de ligne de commande complète (y compris --help info) et rendu compatible les logiciels python2x et python3k. Également ajouté le lien vers l'idée de brainstorming Ubuntu.

Evan Plaice
la source
Le brainstorming n'est guère un bon point de départ pour les améliorations effectives d'Ubuntu - seuls les 10 problèmes principaux retiennent réellement l'attention des développeurs. Je vous suggère de rechercher la page du tableau de bord gnome-keybinding-propertieset de publier un correctif avec votre script.
Oxwivi
Votre script convient aux raccourcis répertoriés dans / gérés par gconftool-2 / gconf-editor ... et je suppose que cela dépend de ce que l’on appelle un raccourci clavier GNOME ... mais cela ne prend pas les raccourcis utilisateur globaux ajoutés au système. par Keyboard Shortcutsexemple. gnome-keybinding-properties... ni d’autres raccourcis clavier ajoutés, par exemple Xbindkeys... je suppose donc que gconf 'ne se trouve pas là où les raccourcis systémiques sont "stockés", mais que c’est une interface vers quelque chose / quelque chose de plus profond ... (I 'ai été à la recherche de cet endroit .. :). peut-être qu'il me faut juste garder 3 listes 'exportées' pour l'instant ...
Peter.O11
@ fred.bear Je suis presque sûr qu'ils sont tous stockés dans gconf, mais je constate que de nouvelles associations de touches sont ajoutées à gnome-keybinding-properties lorsque vous modifiez les valeurs par défaut dans le panneau de configuration. Le script en cours utilisera les raccourcis par défaut trouvés dans l'interface graphique, mais il ne pourra pas prendre en charge tous les raccourcis sans une intégration plus étroite dans l'interface graphique. Il y a déjà un modèle pour cela, donc j'essaie d'entrer en contact avec l'autre développeur qui a proposé cela pour en savoir plus sur le tableau de bord. Pour l'instant ... ça marche.
Evan Plaice
3

Dans 11.10, sous Gnome classic, j'ai trouvé un ensemble de répertoires (Custom0, Custom1 ...) sous

$HOME/.gconf/desktop/gnome/keybindings

J'ai copié ces répertoires dans le même dossier dans une nouvelle installation 12.04 (exécutée à nouveau avec Gnome fallback), déconnecté et reconnecté. Les raccourcis clavier se sont un peu brouillés en transition (il est arrivé quelque chose de drôle au modificateur SUPER), mais sinon ils étaient là.

EntropyReduction
la source
2

La réponse acceptée pose un léger problème, car elle ne peut pas gérer les commandes personnalisées contenant des guillemets. J'ai seulement modifié le traitement des commandes personnalisées pour générer une sortie correcte.

#!/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
la source
Excellente première réponse sur AskUbuntu! Félicitations!
Fabby
J'ai intégré vos modifications dans la réponse acceptée.
Stephen Ostermiller