Dove sono memorizzate le scorciatoie da tastiera GNOME?


53

Di solito carico una nuova versione per ogni versione per mantenere aggiornato il mio sistema operativo preservando al contempo l'ultima versione su un'altra partizione come backup. Uso anche molte mappature dei tasti personalizzate.

Finora ho capito come trasferire la maggior parte della mia configurazione su sistemi diversi, ma non riesco a capire dove sono memorizzati i mapping personalizzati delle scorciatoie da tastiera.

Qualcuno sa dove lo gnomo mette questi? Esistono file di configurazione utente (es. ~ /) E di configurazione del sistema (es. / Etc) separati?


2
Come hai cambiato le impostazioni? Usando GConf Editor? Immagino che tu voglia gconftool-2 --dump /apps/metacityo qualcosa del genere.
Mikel,

1
@Mikel Grazie mille per quel commento. Da quello che posso dire in gconf-editor, la maggior parte delle combinazioni di tasti sono archiviate in / app / metacity mentre il resto è distribuito. Attualmente sto scrivendo gli script di importazione / esportazione di Python per rendere il backup / ripristino delle combinazioni di tasti un'operazione con un clic.
Evan Plaice,

Risposte:


45

Ubuntu è cambiato da quando sono state scritte altre risposte a questa domanda.

I tasti di scelta rapida sono passati da gconf a dconf. Gconf memorizza i suoi dati in file xml ed è stato accessibile da gconf-editore gconf-tool2. Dconf memorizza i suoi dati in un formato binario ed è accessibile da dconf-editore gsettings.

Il numero di posizioni in cui sono memorizzate le combinazioni di tasti è ridotto. Ora esiste un percorso centralizzato di dconf per memorizzare i keybindings del gestore finestre ( org.gnome.desktop.wm.keybindings). Ci sono file di mappatura nella directory /usr/share/gnome-control-center/keybindings/che mostrano come vengono applicati in base al gestore di finestre che stai effettivamente utilizzando (compiz o metacity).

Una seconda serie di associazioni di tasti relativi a non window manager è memorizzata nel percorso dconf org.gnome.settings-daemon.plugins.media-keys

Esiste un terzo set di combinazioni di tasti relative ai pulsanti di accensione memorizzato nel percorso dconf org.gnome.settings-daemon.plugins.power. Attualmente è presente un bug nella GUI che consente di configurare i tasti di scelta rapida. Non conosce queste impostazioni. Ho un pulsante "sleep" sulla mia tastiera. Se voglio riassegnarlo ad altre funzionalità, devo disabilitare l'impostazione org.gnome.settings-daemon.plugins.powermanualmente. La GUI non lo fa per me (anche se assegna bene la nuova funzionalità).

L'altra ruga è l'associazione di tasti personalizzati. Questi sono memorizzati in dconf usando lo schema riposizionabile. È fatto in questo modo perché ce ne sono un numero arbitrario. Un approccio ragionevole, ma rende l'elenco o la modifica tramite la riga di comando più difficile di quanto dovrebbe essere.

Ho anche scoperto che la GUI che ti consente di assegnare le combinazioni di tasti è limitata in un modo che mi infastidisce. La GUI consente di assegnare esattamente UNO dei tasti per ogni azione. In dconf, è possibile impostare una matrice di associazioni per una singola azione. Questo mi è utile. Ad esempio, mi piace avere l'azione "close-window" assegnata al tradizionale Alt-F4 e ad un pulsante più facile da premere sul mio keybord.

Ho scritto uno script Perl per scaricare tutte le combinazioni di tasti in un file CSV o ripristinarle dal file CSV. Ad esempio per scaricare le combinazioni di tasti che potresti usare:

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

e per ripristinarli potresti usare:

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

Ciò include la correzione dell'utente2589537 per consentire comandi personalizzati con virgolette.


2
Ho archiviato due bug contro le scorciatoie da tastiera di Ubuntu gnome-control-center. Li ho trovati durante la creazione di questo script. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/… e bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/…
Stephen Ostermiller

1
Grazie per lo script @Stephen, ho appena provato Ubuntu 13.10 e ha funzionato! Creato un riassunto per una facile condivisione: gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci,

Ottimo lavoro e buon lavoro che documentano i dettagli.
Evan Plaice,

2
Funziona ancora su Ubuntu GNOME 3.2 - Grazie!
Klequis,

1
"funziona" tecnicamente per me, ma probabilmente bisogno di guardare diverse sezioni dconf per Ubuntu-MATE (vale a dire [org/mate/marco/global-keybindings], [org/mate/marco/window-keybindings], ...)
Frank Nocke

17

Come eseguire il backup delle impostazioni di dconf come le scorciatoie da tastiera

  1. Dump tutti in un file:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Apri quel file su un editor di testo e seleziona le impostazioni che ti interessano:

    editor ~/.config/dconf/user.conf
    

    Se usi Vim, vorrai evidenziare questa sintassi .

    Ti chiederai presto cos'è<Primary> .

  3. Se non conosci il nome dell'impostazione, ma sai come modificarlo da una GUI come unity-control-center, esegui:

    dconf watch /
    

    e poi modificarli. L'impostazione esatta apparirà quindi sul terminale.

  4. Quando si desidera ripristinare tali impostazioni, eseguire:

    dconf load / <~/.config/dconf/user.conf
    
  5. Git traccia il file di configurazione per non perderlo mai. https://github.com/andsens/homeshick è il mio metodo preferito attuale.

Testato su Ubuntu 15.10. Suggerimento adattato da: http://catern.com/2014/12/21/plain-text-configuration-gnome.html

Purtroppo il terminale Gnome è resistente a tali modifiche a causa degli ID profilo imprevedibili: modifica il profilo Gnome-Terminal dalla riga di comando il 18.04


15

Le scorciatoie da tastiera non sono memorizzate in un unico posto

A seconda della versione della distro, l'applicazione delle scorciatoie da tastiera potrebbe essere chiamata cose diverse nella GUI, ma sulla riga di comando dovrebbe essere chiamata 'gnome-keybinding-properties'. Si scopre che questa piccola e accurata applicazione porta tutte le scorciatoie in un posto conveniente per la modifica da parte degli utenti.

Poiché non esiste uno strumento di esportazione / importazione con un clic per le combinazioni di tasti in Ubuntu, ne ho scritto uno in Python:

Ecco un link allo script

Un'esportazione estrae le impostazioni dal sistema. Essenzialmente contiene un elenco di tutte le posizioni di legatura dei tasti è codificato in un dizionario nello script. Lo script elenca l'elenco ed esegue il comando "gconftool-2 --get [posizione]" per ogni chiave e memorizza il valore nel dizionario insieme alla chiave. Quindi, quando si specifica la posizione in cui salvare le impostazioni, il dizionario viene salvato nel file nel formato json.

Uno script di importazione inverte questo processo. Carica il dizionario dal file json. Quindi enumera attraverso questi ed esegue il comando "gconftool-2 --type string --set [posizione] [valore]" per ripristinare tutte le impostazioni salvate.

Uno scatto alle due estremità e salva / ripristina ogni singola scorciatoia da tastiera senza toccare nessuna delle altre impostazioni di configurazione del sistema.

Le uniche dipendenze per questi script sono:

  • python (testato e funzionante in 2.6, 2.7 e 3.1)
  • gconftool-2 (viene fornito di serie con un'installazione Ubuntu)
  • zenity (viene fornito di serie con un'installazione Ubuntu)

Python è necessario per eseguire lo script, gconftool-2 è usato per ottenere / impostare le impostazioni, zenity è necessario per le finestre di dialogo di caricamento / salvataggio del file gui.

Ho creato una voce su Ubuntu Brainstorm e sto facendo progressi nell'introdurre questa funzione nel menu della GUI 'gnome-keybinding-properties'.

Aggiornare:

Ho aggiornato combinando gli script di importazione ed esportazione in uno, ho aggiunto la funzionalità completa della riga di comando (comprese le informazioni --help) e l'ho reso compatibile sia per python2x che per python3k. Inoltre, è stato aggiunto il collegamento all'idea di Brainstorm di Ubuntu.


Brainstorm non è certo un buon posto per i miglioramenti effettivi di Ubuntu: solo i 10 problemi principali attirano l'attenzione degli sviluppatori. Ti suggerirei di trovare la pagina Launchpad per gnome-keybinding-propertiese pubblicare una patch con il tuo script.
Oxwivi,

Il tuo script è buono per le scorciatoie elencate in / gestite da gconftool-2 / gconf-editor ... e suppongo che dipenda da ciò che si chiama una scorciatoia da tastiera GNOME ... ma non sta raccogliendo le scorciatoie dell'utente a livello di sistema aggiunte di Keyboard Shortcutsie. gnome-keybinding-properties... né altre combinazioni di tasti aggiunte da, per esempio Xbindkeys... quindi ho il sospetto che gconf 'non sia dove le scorciatoie del sistema sono "memorizzate", ma che è un'interfaccia per qualcosa / da qualche parte più in profondità ... (I ho cercato quel posto .. :). forse per ora ho solo bisogno di conservare 3 elenchi "esportati" ...
Peter

@ fred.bear Sono abbastanza sicuro che siano tutti archiviati in gconf ma sto scoprendo che nuove combinazioni di tasti vengono aggiunte a gnome-keybinding-properties quando si cambia dalle impostazioni predefinite nel pannello di controllo. Lo script corrente eseguirà le scorciatoie predefinite trovate nella GUI ma non sarà in grado di supportare tutte le scorciatoie senza una più stretta integrazione nella GUI. Al momento esiste già un progetto aperto per questo, quindi sto cercando di mettermi in contatto con l'altro sviluppatore che lo ha proposto per elaborare i dettagli sul launchpad. Per ora ... funziona.
Evan Plaice,

3

In 11.10 con Gnome classic ho trovato un set di directory (Custom0, Custom1 ...) sotto

$HOME/.gconf/desktop/gnome/keybindings

Ho copiato quelle directory nella stessa cartella in un'installazione pulita 12.04 (di nuovo in esecuzione con il fallback di Gnome), disconnesso e riconnesso. Le combinazioni di tasti si sono un po 'incasinate durante la transizione (è successo qualcosa di divertente al modificatore SUPER) ma per il resto erano lì.


2

C'è un leggero problema con la risposta accettata, in quanto non è in grado di gestire comandi personalizzati con virgolette. Ho modificato solo l'elaborazione dei comandi personalizzati per generare un output corretto.

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

Ottima prima risposta su AskUbuntu! Congratulazioni!
Fabby,

Ho integrato le tue modifiche nella risposta accettata.
Stephen Ostermiller,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.