Wo werden GNOME-Tastaturkürzel gespeichert?

53

Normalerweise lade ich für jedes Release eine neue Version, um mein Betriebssystem auf dem neuesten Stand zu halten und gleichzeitig die letzte Version auf einer anderen Partition als Backup zu behalten. Ich verwende auch viele benutzerdefinierte Tastenzuordnungen.

Ich habe bisher herausgefunden, wie ich den größten Teil meiner Konfiguration auf verschiedene Systeme übertragen kann, kann aber nicht herausfinden, wo die benutzerdefinierten Tastaturkürzel gespeichert sind.

Weiß jemand, wo der Gnom diese abstellt? Gibt es separate Benutzer-Konfigurationsdateien (zB ~ /) und System-Konfigurationsdateien (zB / etc)?

Evan Scholle
quelle
2
Wie haben Sie die Einstellungen geändert? Verwenden Sie den GConf Editor? Ich vermute, Sie wollen gconftool-2 --dump /apps/metacityoder so etwas.
Mikel
1
@Mikel Vielen Dank für diesen Kommentar. Nach dem, was ich in gconf-editor feststellen kann, sind die meisten Tastenkombinationen unter / apps / metacity gespeichert, während der Rest verteilt ist. Momentan schreibe ich Import / Export-Python-Skripte, um das Sichern / Wiederherstellen von Tastenkombinationen mit einem Klick zu ermöglichen.
Evan Plaice
Related: askubuntu.com/questions/17626/…
Ciro Santilli

Antworten:

45

Ubuntu hat sich geändert, seit andere Antworten auf diese Frage geschrieben wurden.

Tastenkombinationen wurden von gconf zu dconf verschoben. Gconf speichert seine Daten in XML-Dateien und wurde von gconf-editorund zugegriffen gconf-tool2. Dconf speichert seine Daten in einem binären Format und greift auf dconf-editorund zu gsettings.

Die Anzahl der Speicherorte für Tastenkombinationen wird verringert. Es gibt jetzt einen zentralisierten dconf-Pfad zum Speichern von Window Manager-Tastenkombinationen ( org.gnome.desktop.wm.keybindings). Das Verzeichnis enthält Zuordnungsdateien /usr/share/gnome-control-center/keybindings/, die zeigen, wie diese auf der Grundlage des Fenstermanagers angewendet werden, den Sie tatsächlich verwenden (compiz oder metacity).

Ein zweiter Satz von Tastenbelegungen, die sich nicht auf Window Manager beziehen, wird im Pfad dconf gespeichert org.gnome.settings-daemon.plugins.media-keys

Es gibt einen dritten Satz von Tastenkombinationen in Bezug auf Netzschalter, die im dconf-Pfad gespeichert sind org.gnome.settings-daemon.plugins.power. Derzeit gibt es einen Fehler in der GUI, mit dem Sie Tastenkombinationen konfigurieren können. Es kennt diese Einstellungen nicht. Ich habe eine "Schlaf" -Taste auf meiner Tastatur. Wenn ich es anderen Funktionen zuweisen möchte, muss ich die Einstellung org.gnome.settings-daemon.plugins.powermanuell deaktivieren . Die GUI erledigt das nicht für mich (obwohl sie die neue Funktionalität gut zuweist).

Die andere Falte sind benutzerdefinierte Tastenkombinationen. Diese werden mit einem verschiebbaren Schema in dconf gespeichert. Es ist so gemacht, weil es eine willkürliche Anzahl von ihnen gibt. Ein vernünftiger Ansatz, der es jedoch schwieriger macht, sie über die Befehlszeile aufzulisten oder zu ändern, als es eigentlich sein sollte.

Ich habe auch herausgefunden, dass die GUI, mit der Sie Tastenkombinationen zuweisen können, in einer Weise eingeschränkt ist, die mich ärgert. Über die GUI kann jeder Aktion genau EINE Tastenkombination zugewiesen werden. In dconf können Sie ein Array von Bindungen für eine einzelne Aktion festlegen. Das ist nützlich für mich. Zum Beispiel möchte ich, dass die Aktion "Fenster schließen" sowohl dem traditionellen Alt-F4 als auch einem einfacher zu bedienenden Knopf auf meiner Tastatur zugewiesen wird.

Ich habe ein Perl-Skript geschrieben, um alle Tastenkombinationen in eine CSV-Datei zu schreiben oder sie aus der CSV-Datei wiederherzustellen. Um beispielsweise die Tastenkombinationen zu sichern, die Sie verwenden könnten:

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

und um sie wiederherzustellen, könnten Sie verwenden:

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

Dies schließt die Korrektur durch user2589537 ein , um benutzerdefinierte Befehle mit Anführungszeichen zuzulassen.

Stephen Ostermiller
quelle
2
Ich habe zwei Bugs gegen Ubuntu Gnome-Control-Center-Tastaturkürzel eingereicht. Ich habe sie beim Erstellen dieses Skripts gefunden. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/... und bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...
Stephen Ostermiller
1
Danke für das Skript @Stephen, habe es gerade mit Ubuntu 13.10 ausprobiert und es hat einfach funktioniert! Erstellt eine Übersicht zum einfachen Teilen: gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci
Tolle Arbeit und gute Arbeit beim Dokumentieren der Details.
Evan Plaice,
2
Funktioniert immer noch auf Ubuntu GNOME 3.2 - Vielen Dank!
Klequis
1
„Werke“ technisch für mich, aber würde wahrscheinlich anders dconf Abschnitte für Ubuntu-MATE (dh sehen müssen [org/mate/marco/global-keybindings], [org/mate/marco/window-keybindings]...)
Frank Nocke
17

So sichern Sie dconf-Einstellungen wie Tastaturkürzel

  1. Gib sie alle in eine Datei:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Öffnen Sie diese Datei in einem Texteditor und wählen Sie die gewünschten Einstellungen aus:

    editor ~/.config/dconf/user.conf
    

    Wenn Sie Vim verwenden, möchten Sie diese Syntaxhervorhebung .

    Sie werden sich bald fragen, was ist<Primary> .

  3. Wenn Sie den Namen der Einstellung nicht kennen, aber wissen, wie Sie sie von einer GUI aus ändern können, führen Sie Folgendes aus unity-control-center:

    dconf watch /
    

    und ändern Sie sie dann. Die genaue Einstellung wird dann auf dem Terminal angezeigt.

  4. Wenn Sie diese Einstellungen wiederherstellen möchten, führen Sie Folgendes aus:

    dconf load / <~/.config/dconf/user.conf
    
  5. Verfolge die Konfigurationsdatei, um sie niemals zu verlieren. https://github.com/andsens/homeshick ist meine derzeitige Lieblingsmethode.

Getestet unter Ubuntu 15.10. Tipp angepasst von: http://catern.com/2014/12/21/plain-text-configuration-gnome.html

Das Gnome-Terminal kann solche Änderungen leider nicht ausführen, da die Profil-IDs nicht vorhersehbar sind: Bearbeiten Sie das Gnome-Terminal-Profil über die Befehlszeile am 18.04

Ciro Santilli ist ein Schauspieler
quelle
15

Die Tastaturkürzel werden nicht an einem einzigen Ort gespeichert

Abhängig von Ihrer Distributionsversion werden die Tastaturkürzel in der GUI möglicherweise als unterschiedliche Dinge bezeichnet, in der Befehlszeile sollten sie jedoch als "gnome-keybinding-properties" bezeichnet werden. Es stellt sich heraus, dass diese kleine Anwendung alle Verknüpfungen an einem praktischen Ort für die Benutzer zum Bearbeiten bringt.

Da es in Ubuntu kein Ein-Klick-Export- / Import-Tool für Tastenkombinationen gibt, habe ich eines in Python geschrieben:

Hier ist ein Link zum Skript

Ein Export ruft die Einstellungen aus dem System ab. Im Wesentlichen enthält es eine Liste aller Tastenkombinationen, die in einem Wörterbuch im Skript fest codiert sind. Das Skript zählt die Liste auf und führt den Befehl "gconftool-2 --get [location]" für jeden Schlüssel aus und speichert den Wert zusammen mit dem Schlüssel im Wörterbuch. Wenn Sie dann den Speicherort für die Einstellungen angeben, wird das Wörterbuch im json-Format in der Datei gespeichert.

Ein Importskript kehrt diesen Vorgang um. Es lädt das Wörterbuch aus der JSON-Datei. Anschließend werden diese aufgelistet und der Befehl "gconftool-2 --type string --set [location] [value]" ausgeführt, um alle gespeicherten Einstellungen wiederherzustellen.

Ein Schuss auf beiden Seiten und es speichert / stellt jede einzelne Tastenkombination wieder her, ohne eine der anderen Systemkonfigurationseinstellungen zu berühren.

Die einzigen Abhängigkeiten für diese Skripte sind:

  • Python (getestet und lauffähig in 2.6, 2.7 und 3.1)
  • gconftool-2 (wird standardmäßig mit einer Ubuntu-Installation geliefert)
  • Zenity (wird standardmäßig mit einer Ubuntu-Installation geliefert)

Zum Ausführen des Skripts wird Python benötigt, zum Abrufen / Festlegen der Einstellungen wird gconftool-2 verwendet, für die GUI-Dialoge zum Laden / Speichern von Dateien ist Zenity erforderlich.

Ich habe einen Eintrag in Ubuntu Brainstorm erstellt und mache Fortschritte bei der Einführung dieser Funktion in das GUI-Menü 'gnome-keybinding-properties'.

Aktualisieren:

Ich habe die Import- und Export-Skripte zu einem zusammengefasst, die volle Befehlszeilenfunktionalität (einschließlich --help info) hinzugefügt und sie für python2x und python3k kompatibel gemacht. Außerdem wurde der Link zur Ubuntu Brainstorm-Idee hinzugefügt.

Evan Scholle
quelle
Brainstorm ist kaum ein guter Ort für tatsächliche Verbesserungen von Ubuntu - nur die 10 wichtigsten Probleme erregen die Aufmerksamkeit der Entwickler. Ich würde vorschlagen, dass Sie die Launchpad-Seite für suchen gnome-keybinding-propertiesund einen Patch mit Ihrem Skript veröffentlichen.
Oxwivi
Ihr Skript eignet sich für Verknüpfungen, die in gconftool-2 / gconf-editor aufgelistet sind / von dort verwaltet werden ... und es hängt vermutlich davon ab, wie man eine GNOME-Tastenkombination nennt ... aber es werden keine systemweiten Benutzerkombinationen hinzugefügt von Keyboard Shortcutsie. gnome-keybinding-properties... oder andere Tastenkombinationen, die zum Beispiel von Xbindkeys... hinzugefügt wurden, also vermute ich, dass gconf 'nicht dort ist, wo die systemweiten Verknüpfungen "gespeichert" sind, sondern dass es sich um eine Schnittstelle zu etwas / irgendwo Tieferem handelt ... (I hab diesen ort gesucht .. :). Vielleicht muss ich nur 3 'exportierte' Listen für den
Moment
@ fred.bear Ich bin mir ziemlich sicher, dass sie alle in gconf gespeichert sind, aber ich stelle fest, dass neue Tastenkombinationen zu den Eigenschaften von gnome-keybinding hinzugefügt werden, wenn Sie die Standardeinstellungen in der Systemsteuerung ändern. Das aktuelle Skript führt die in der GUI gefundenen Standardverknüpfungen aus, kann jedoch nicht alle Verknüpfungen ohne eine engere Integration in die GUI unterstützen. Derzeit ist bereits eine Blaupause dafür offen, daher versuche ich, Kontakt mit dem anderen Entwickler aufzunehmen, der dies vorgeschlagen hat, um die Details auf dem Launchpad zu erarbeiten. Fürs Erste ... das funktioniert.
Evan Plaice
3

In 11.10 mit Gnome classic habe ich eine Reihe von Verzeichnissen (Custom0, Custom1 ...) unter gefunden

$HOME/.gconf/desktop/gnome/keybindings

Ich habe diese Verzeichnisse in einer sauberen 12.04-Installation in denselben Ordner kopiert (wieder mit Gnome-Fallback ausgeführt), mich abgemeldet und wieder angemeldet. Die Tastenkombinationen sind beim Übergang etwas durcheinander geraten (etwas Komisches ist mit dem SUPER-Modifikator passiert), aber ansonsten waren sie da.

EntropyReduction
quelle
2

Es gibt ein kleines Problem mit der akzeptierten Antwort, da es keine benutzerdefinierten Befehle mit Anführungszeichen verarbeiten kann. Ich habe nur die Verarbeitung von benutzerdefinierten Befehlen geändert, um eine korrekte Ausgabe zu generieren.

#!/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
quelle
Ausgezeichnete erste Antwort auf AskUbuntu! Glückwunsch!
Fabby
Ich habe Ihre Änderungen in die akzeptierte Antwort integriert.
Stephen Ostermiller