Où sont stockés les raccourcis clavier de GNOME?

46

Je charge généralement une nouvelle version pour chaque version afin de conserver mon système d'exploitation tout en conservant la dernière version sur une autre partition en tant que sauvegarde. J'utilise également beaucoup de mappages de touches personnalisés.

J'ai compris comment transférer la majorité de ma configuration sur tous les systèmes jusqu'à présent, mais je ne peux pas savoir où sont stockés les mappages de raccourcis clavier personnalisés.

Quelqu'un sait-il où gnome les met? Existe-t-il des fichiers de configuration utilisateur distincts (à savoir, ~ /) et de configuration du système (par exemple / etc)?

    
posée Evan Plaice 13.02.2011 - 01:07
la source

5 réponses

40

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é accédé par gconf-editor et gconf-tool2 . Dconf stocke ses données dans un format binaire et est accessible par dconf-editor et gsettings .

Le nombre d’espaces de stockage des raccourcis clavier est réduit. Il existe désormais un chemin dconf centralisé pour stocker les raccourcis clavier du gestionnaire de fenêtres ( org.gnome.desktop.wm.keybindings ). Il existe des fichiers de mappage dans le répertoire /usr/share/gnome-control-center/keybindings/ qui montrent comment ceux-ci sont appliqués en fonction du gestionnaire de fenêtres que vous utilisez (compiz ou metacity).

Un deuxième ensemble de liaisons de clés non liées à un gestionnaire de fenêtre est stocké dans le chemin dconf org.gnome.settings-daemon.plugins.media-keys

Il existe un troisième ensemble de raccourcis clavier associés aux boutons d’alimentation qui sont stockés dans le chemin dconf org.gnome.settings-daemon.plugins.power . Il y a actuellement un bug dans l'interface graphique qui vous permet de configurer les raccourcis clavier. Il ne connaît pas ces paramètres. J'ai un bouton "sommeil" sur mon clavier. Si je veux le réaffecter à d'autres fonctionnalités, je dois désactiver le paramètre dans org.gnome.settings-daemon.plugins.power manuellement. L’interface graphique ne le fait pas pour moi (bien qu’elle attribue très bien la nouvelle fonctionnalité).

L’autre des rides est la création de raccourcis clavier. Ceux-ci sont stockés dans dconf en utilisant un schéma déplaçable. C'est fait de cette façon car il y en a un nombre arbitraire. Une approche raisonnable, mais il est plus difficile de les lister 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 d'une manière qui m'agace. L'interface utilisateur graphique vous permet d'affecter UN SEUL raccourci à chaque action. Dans dconf, vous pouvez définir un tableau de liaisons pour une action unique. Ceci est utile pour moi. Par exemple, j'aime avoir l'action "fermer la fenêtre" assignée à la traditionnelle Alt-F4, ainsi qu'un simple bouton sur mon clavier.

J'ai écrit un script Perl pour transférer tous les raccourcis vers un fichier csv ou 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) = (,,);
                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);
}

Cela inclut le correctif de user2589537 pour autoriser les commandes personnalisées avec des guillemets.

    
réponse donnée Stephen Ostermiller 14.11.2012 - 23:00
la source
15

Les raccourcis clavier ne sont stockés dans aucun endroit unique

Selon la version de votre distribution, l’application des raccourcis clavier peut être appelée différentes choses dans l’interface graphique, mais sur la ligne de commande, elle doit être appelée «gnome-keybinding-properties». Il s’avère que cette petite application soignée met tous les raccourcis au même endroit pour les éditer.

Comme aucun outil d’exportation / d’importation en un seul clic n’existe pour les raccourcis dans Ubuntu, j’en ai écrit un en python:

Voici un lien vers le script

Une exportation extrait les paramètres du système. Il contient essentiellement une liste de tous les emplacements de raccourcis clavier codés en dur dans un dictionnaire du script. Le script énumère la liste et exécute la commande "gconftool-2 --get [location]" pour chaque clé et stocke la valeur dans le dictionnaire avec la clé. Ensuite, lorsque vous spécifiez l'emplacement pour enregistrer les paramètres, il enregistre le dictionnaire 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 à travers ces commandes et exécute la commande "gconftool-2 --type string --set [location] [value]" pour restaurer tous les paramètres enregistrés.

Une prise de vue à chaque extrémité et enregistre / restaure chaque raccourci clavier sans toucher aux 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 (est 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, la zénité est nécessaire pour les boîtes de dialogue de chargement / sauvegarde de fichiers.

J'ai créé une entrée sur Ubuntu Brainstorm et progresse dans l’introduction de cette fonctionnalité dans Menu de l'interface graphique de keybinding-properties.

Mise à jour:

J'ai mis à jour les scripts d’importation et d’exportation en un seul, ajouté la fonctionnalité de ligne de commande complète (y compris les informations --help) et rendu ce dernier compatible à la fois avec python2x et python3k. En outre, le lien vers l’idée Ubuntu Brainstorm a été ajouté.

    
réponse donnée Evan Plaice 16.02.2011 - 08:49
la source
14

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

  1. Videz-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 cette syntaxe .

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

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

    dconf watch /
    

    puis modifiez-les. 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. lien est ma méthode favorite actuelle.

Testé sur Ubuntu 15.10. Conseil adapté de: lien

    
la source
3

En 11.10, en cours d'exécution de 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 installation propre 12.04 (à nouveau exécutée avec Gnome fallback), déconnectée et connectée à nouveau. Les raccourcis ont été un peu perturbés lors de la transition (quelque chose de drôle est arrivé au modificateur SUPER), mais sinon ils étaient là.

    
réponse donnée EntropyReduction 23.03.2013 - 21:32
la source
2

La réponse acceptée présente un léger problème, car elle ne permet pas de gérer les commandes personnalisées avec 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) = (,,);
                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);
}
    
réponse donnée Jordan Weitz 25.11.2014 - 23:33
la source

Lire d'autres questions sur les étiquettes