67 votes

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

J'ai l'habitude de charger une nouvelle version à chaque sortie pour garder mon OS frais tout en préservant la dernière version sur une autre partition comme sauvegarde. J'utilise également beaucoup de mappages de touches personnalisés.

J'ai réussi à transférer la majorité de ma configuration d'un système à l'autre, mais je n'arrive pas à trouver où sont stockés les mappages des raccourcis clavier personnalisés.

Quelqu'un sait-il où gnome les met ? Existe-t-il des configurations utilisateur distinctes (c'est-à-dire, ~/ ) et la configuration du système (c'est-à-dire /etc ) ?

56voto

Stephen Ostermiller Points 3783

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

Les raccourcis clavier ont été déplacés de gconf à dconf. Gconf stocke ses données dans des fichiers xml et était accédé par gconf-editor y gconf-tool2 . Dconf stocke ses données dans un format binaire et on y accède par dconf-editor y gsettings .

Le nombre d'endroits où sont stockés les raccourcis clavier est réduit. Il y a maintenant un chemin dconf centralisé pour stocker les raccourcis clavier du gestionnaire de fenêtres ( org.gnome.desktop.wm.keybindings ). Il existe des fichiers de cartographie dans le répertoire /usr/share/gnome-control-center/keybindings/ qui montrent comment ils sont appliqués en fonction du gestionnaire de fenêtres que vous utilisez actuellement (compiz ou metacity).

Un deuxième ensemble de liaisons de touches non liées au gestionnaire de fenêtres est stocké dans le chemin dconf org.gnome.settings-daemon.plugins.media-keys

Il existe un troisième ensemble de combinaisons de touches liées aux boutons d'alimentation qui est stocké dans le chemin dconf. org.gnome.settings-daemon.plugins.power . Il y a actuellement un bogue dans l'interface graphique qui vous permet de configurer les combinaisons de touches. Elle ne connaît pas ces paramètres. J'ai un bouton "veille" sur mon clavier. Si je veux le réaffecter à une autre fonctionnalité, je dois désactiver le paramètre dans le menu org.gnome.settings-daemon.plugins.power manuellement. L'interface graphique ne le fait pas pour moi (bien qu'elle attribue la nouvelle fonctionnalité sans problème).

L'autre problème est la personnalisation des touches. Celles-ci sont stockées dans dconf en utilisant un schéma relocalisable. Il est fait de cette façon parce qu'il y a un nombre arbitraire d'entre eux. C'est une approche raisonnable, mais cela rend leur énumération ou leur modification via la ligne de commande plus difficile qu'elle ne devrait l'être.

J'ai également découvert que l'interface graphique qui vous permet d'assigner des raccourcis clavier est limitée d'une manière qui m'ennuie. L'interface graphique permet d'assigner exactement UNE combinaison de touches à chaque action. Dans dconf, vous pouvez définir un tableau de combinaisons pour une seule action. Ceci est utile pour moi. Par exemple, j'aime avoir l'action "fermer-fenêtre" assignée à la traditionnelle Alt-F4 ainsi qu'à un bouton unique plus facile à frapper sur mon clavier.

J'ai écrit un script Perl pour vider tous les keybindings dans un fichier csv, ou les restaurer à partir du fichier csv. Par exemple pour vider les keybindings 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 la correction par utilisateur2589537 pour autoriser les commandes personnalisées contenant des guillemets.

28voto

Comment sauvegarder les paramètres de dconf comme 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 cette coloration syntaxique .

    Vous vous demanderez bientôt 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 telle que unity-control-center , cours :

    dconf watch /

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

  4. Quand vous voulez restaurer ces paramètres, exécutez :

    dconf load / < ~/.config/dconf/user.conf
  5. Git track le fichier de configuration pour ne jamais le perdre. Homeshick est ma méthode préférée actuellement.

Testé sur Ubuntu 15.10. Conseil adapté de aquí .

Le terminal Gnome est malheureusement résistant à de telles modifications. à cause des ID de profil imprévisibles .

En rapport : Comment puis-je rétablir les raccourcis clavier par défaut ?

3voto

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

$HOME/.gconf/desktop/gnome/keybindings

J'ai copié ces répertoires dans le même dossier d'une installation 12.04 propre (fonctionnant à nouveau avec Gnome fallback), je me suis déconnecté et reconnecté. Les raccourcis clavier se sont un peu mélangés dans la transition (quelque chose de bizarre est arrivé au modificateur SUPER) mais sinon ils étaient là.

3voto

Jordan Weitz Points 31

Il y a un léger problème avec la réponse acceptée, dans la mesure où 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);
}

3voto

Pablo Bianchi Points 10158

Sauvegarder les raccourcis clavier personnalisés

Vous pouvez sauvegarder/sauvegarder/exporter des raccourcis/liens clés personnalisés en utilisant seulement dconf y sed

Exportation

dconf dump / | sed -n '/\[org.gnome.settings-daemon.plugins.media-keys/,/^$/p' > custom-shortcuts.conf # Export

La différence avec la réponse habituelle est que cela va conserver dans le fichier le chemin vers les paramètres dconf, ce qui facilite l'importation. dconf load / < file .

Importation

dconf load / < custom-shortcuts.conf # Import

Notes

  • Sur la base de La réponse de Ciro (également aquí )

  • Seulement pour les raccourcis personnalisés ajoutés

  • Notez que dconf ne décharge que les valeurs qui ne sont pas par défaut

  • Pour la sauvegarde, vous pouvez utiliser custom-shortcuts-$(date -I).conf

  • Testez si cela fonctionne en réinitialisation des valeurs par défaut avant l'importation

    gsettings reset-recursively org.gnome.settings-daemon.plugins.media-keys

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X