Di mana pintasan keyboard GNOME disimpan?

53

Saya biasanya memuat versi baru untuk setiap rilis untuk menjaga OS saya tetap segar sambil mempertahankan versi terakhir di partisi lain sebagai cadangan. Saya juga menggunakan banyak pemetaan kunci khusus.

Saya telah menemukan cara untuk mentransfer sebagian besar konfigurasi saya di seluruh sistem sejauh ini, tetapi saya tidak tahu di mana pemetaan pintas keyboard kustom disimpan.

Apakah ada yang tahu di mana gnome meletakkan ini? Apakah ada file konfigurasi pengguna (yaitu, ~ /) dan sistem konfigurasi (yaitu / etc) yang terpisah?

Evan Plaice
sumber
2
Bagaimana Anda mengubah pengaturan? Menggunakan Editor GConf? Saya kira Anda ingin gconftool-2 --dump /apps/metacityatau sesuatu seperti itu.
Mikel
1
@Mikel Terima kasih banyak untuk komentar itu. Dari apa yang dapat saya katakan di gconf-editor, sebagian besar keybindings disimpan di / apps / metacity sementara sisanya tersebar di sekitar. Saat ini saya sedang menulis skrip python Impor / Ekspor untuk membuat backup / mengembalikan keybindings operasi satu-klik.
Evan Plaice
Terkait: askubuntu.com/questions/17626/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

45

Ubuntu telah berubah sejak jawaban lain untuk pertanyaan ini ditulis.

Gantungan kunci telah dipindahkan dari gconf ke dconf. Gconf menyimpan datanya dalam file xml dan diakses oleh gconf-editordan gconf-tool2. Dconf menyimpan datanya dalam format biner dan diakses oleh dconf-editordan gsettings.

Jumlah tempat penyimpanan gantungan kunci berkurang. Sekarang ada jalur dconf terpusat untuk menyimpan keybindings window manager ( org.gnome.desktop.wm.keybindings). Ada memetakan file dalam direktori /usr/share/gnome-control-center/keybindings/yang menunjukkan bagaimana ini diterapkan berdasarkan window manager yang sebenarnya Anda gunakan (compiz atau metacity).

Set kedua binding key terkait non-window-manager disimpan di path dconf org.gnome.settings-daemon.plugins.media-keys

Ada seperangkat ikatan kunci terkait dengan tombol daya yang disimpan di jalur dconf org.gnome.settings-daemon.plugins.power. Saat ini ada bug di GUI yang memungkinkan Anda mengkonfigurasi ikatan kunci. Tidak tahu tentang pengaturan ini. Saya memiliki tombol "tidur" di keyboard saya. Jika saya ingin menetapkan kembali ke fungsi lain, saya harus menonaktifkan pengaturan org.gnome.settings-daemon.plugins.powersecara manual. GUI tidak melakukannya untuk saya (walaupun itu memberikan fungsi baru dengan baik).

Kerutan lainnya adalah binding kunci kustom. Ini disimpan dalam dconf menggunakan skema relocatable. Ini dilakukan dengan cara ini karena ada jumlah yang sewenang-wenang dari mereka. Pendekatan yang masuk akal, tetapi membuat daftar atau memodifikasi mereka melalui baris perintah lebih sulit dari yang seharusnya.

Saya juga menemukan bahwa GUI yang memungkinkan Anda untuk menetapkan keybindings terbatas dengan cara yang mengganggu saya. GUI memungkinkan tepat SATU pengikat kunci yang ditugaskan untuk setiap tindakan. Di dconf, Anda dapat mengatur array binding untuk satu tindakan. Ini berguna bagi saya. Sebagai contoh, saya ingin memiliki tindakan "close-window" yang ditugaskan untuk Alt-F4 tradisional serta untuk menekan satu tombol pada keybord saya.

Saya telah menulis skrip Perl untuk membuang semua keybindings ke file csv, atau mengembalikannya dari file csv. Misalnya untuk membuang ikatan kunci yang mungkin Anda gunakan:

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

dan untuk mengembalikannya, Anda dapat menggunakan:

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

Ini termasuk perbaikan oleh user2589537 untuk memungkinkan perintah khusus dengan tanda kutip di dalamnya.

Stephen Ostermiller
sumber
2
Saya mengajukan dua bug terhadap pintasan keyboard gnome-control-center ubuntu. Saya menemukan mereka saat membuat skrip ini. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/… dan bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/…
Stephen Ostermiller
1
Terima kasih untuk skrip @Stephen, baru saja mencoba di Ubuntu 13.10 dan berhasil! Dibuat intisari untuk memudahkan berbagi: gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci
Kerja luar biasa dan pekerjaan bagus mendokumentasikan hal-hal spesifik.
Evan Plaice
2
Masih berfungsi di Ubuntu GNOME 3.2 - Terima kasih!
klequis
1
"bekerja" secara teknis untuk saya, tapi mungkin akan perlu untuk menonton bagian dconf berbeda untuk Ubuntu-MATE (yaitu [org/mate/marco/global-keybindings], [org/mate/marco/window-keybindings], ...)
Frank Nocke
17

Cara mencadangkan pengaturan dconf seperti pintasan keyboard

  1. Buang semuanya ke file:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Buka file itu pada editor teks dan pilih pengaturan yang Anda pedulikan:

    editor ~/.config/dconf/user.conf
    

    Jika Anda menggunakan Vim, Anda ingin highlight sintaks ini .

    Anda akan segera bertanya pada diri sendiri apa itu<Primary> .

  3. Jika Anda tidak tahu nama pengaturan, tetapi tahu cara memodifikasinya dari GUI unity-control-center, jalankan:

    dconf watch /
    

    dan kemudian memodifikasinya. Pengaturan yang tepat kemudian akan muncul di terminal.

  4. Saat Anda ingin mengembalikan pengaturan itu, jalankan:

    dconf load / <~/.config/dconf/user.conf
    
  5. Git lacak file konfigurasi untuk tidak pernah kehilangannya. https://github.com/andsens/homeshick adalah metode favorit saya saat ini.

Diuji pada Ubuntu 15.10. Kiat diadaptasi dari: http://catern.com/2014/12/21/plain-text-configuration-gnome.html

Terminal Gnome sayangnya tahan terhadap pengeditan tersebut karena ID profil yang tidak dapat diprediksi: Edit profil Gnome-Terminal dari baris perintah pada 18.04

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
15

Pintasan keyboard tidak disimpan di satu tempat

Bergantung pada versi distro Anda, aplikasi cara pintas keyboard dapat disebut hal-hal yang berbeda di GUI tetapi pada baris perintah itu harus disebut 'gnome-keybinding-properties'. Ternyata aplikasi kecil yang rapi ini membawa semua pintasan ke satu tempat yang nyaman bagi pengguna untuk mengedit.

Karena tidak ada alat ekspor / impor satu-klik ada untuk keybindings di Ubuntu, saya menulis satu dengan python:

Berikut tautan ke skrip

Ekspor menarik pengaturan dari sistem. Pada dasarnya itu berisi daftar semua lokasi pengikat kunci yang dikodekan ke dalam kamus dalam skrip. Script menghitung daftar dan menjalankan perintah "gconftool-2 - get [location]" untuk setiap kunci dan menyimpan nilai dalam kamus bersama dengan kunci. Kemudian ketika Anda menentukan lokasi untuk menyimpan pengaturan, kamus menyimpannya ke file dalam format json.

Script impor membalikkan proses ini. Ini memuat kamus dari file json. Kemudian ia menghitung melalui ini dan menjalankan perintah "gconftool-2 --type string --set [location] [value]" untuk mengembalikan semua pengaturan yang disimpan.

Satu tembakan di kedua ujung dan menyimpan / mengembalikan setiap pintasan keyboard tunggal tanpa menyentuh pengaturan konfigurasi sistem lainnya.

Satu-satunya dependensi untuk skrip ini adalah:

  • python (diuji dan bekerja di 2.6, 2.7, dan 3.1)
  • gconftool-2 (standar dengan instalasi Ubuntu)
  • zenity (dilengkapi standar dengan instalasi Ubuntu)

Python diperlukan untuk menjalankan skrip, gconftool-2 digunakan untuk mendapatkan / mengatur pengaturan, zenity diperlukan untuk memuat file / menyimpan dialog gui.

Saya telah membuat entri pada Brainstorm Ubuntu dan membuat kemajuan dalam memperkenalkan fitur ini ke dalam menu GUI 'gnome-keybinding-properties'.

Memperbarui:

Saya memperbarui gabungan skrip impor dan ekspor menjadi satu, menambahkan fungsionalitas baris perintah penuh (termasuk --help info) dan membuatnya kompatibel untuk python2x dan python3k. Juga, tambahkan tautan ke ide Brainstorm Ubuntu.

Evan Plaice
sumber
Brainstorm bukanlah tempat yang baik untuk peningkatan Ubuntu yang sebenarnya - hanya 10 masalah teratas yang benar-benar mendapat perhatian pengembang. Saya sarankan Anda menemukan halaman Launchpad untuk gnome-keybinding-propertiesdan memposting tambalan dengan skrip Anda.
Oxwivi
Skrip Anda baik untuk pintasan yang terdaftar di / ditangani oleh gconftool-2 / gconf-editor ... dan saya kira itu tergantung pada apa yang disebut pintasan keyboard GNOME ... tetapi tidak mengambil pintasan pengguna di seluruh sistem yang ditambahkan oleh Keyboard Shortcutsyaitu. gnome-keybinding-properties... atau ikatan kunci lainnya ditambahkan oleh, misalnya Xbindkeys... jadi saya curiga bahwa gconf 'bukan tempat pintasan lebar sysetem mereka "disimpan", tetapi itu adalah antarmuka untuk sesuatu / tempat yang lebih dalam ... (saya Sudah mencari tempat itu .. :). mungkin saya hanya perlu menyimpan 3 daftar 'diekspor' untuk saat ini ...
Peter.O
@ fred.bear Saya cukup yakin mereka semua disimpan di gconf tapi saya menemukan bahwa keybindings baru ditambahkan ke gnome-keybinding-properties ketika Anda mengubah dari default di panel kontrol. Script saat ini akan melakukan cara pintas default yang ditemukan di GUI tetapi tidak akan dapat mendukung semua cara pintas tanpa integrasi yang lebih ketat ke dalam GUI. Saat ini sudah ada cetak biru yang terbuka untuk ini, jadi saya mencoba menghubungi pengembang lain yang mengusulkan ini untuk mengerjakan rincian di launchpad. Untuk sekarang ... ini berfungsi.
Evan Plaice
3

Di 11.10 menjalankan Gnome classic saya menemukan satu set direktori (Custom0, Custom1 ...) di bawah

$HOME/.gconf/desktop/gnome/keybindings

Saya menyalin direktori-direktori itu ke folder yang sama dalam instalasi bersih 12,04 (lagi-lagi berjalan dengan Gnome fallback), keluar dan masuk lagi. Gantungan kunci agak kacau dalam transisi (sesuatu yang lucu terjadi pada SUPER modifier) ​​tetapi sebaliknya mereka ada di sana.

Pengurangan Entropi
sumber
2

Ada sedikit masalah dengan jawaban yang diterima, karena tidak dapat menangani perintah khusus dengan tanda kutip di dalamnya. Saya hanya mengubah pemrosesan perintah khusus untuk menghasilkan output yang benar.

#!/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
sumber
Jawaban pertama yang luar biasa pada AskUbuntu! Selamat!
Fabby
Saya telah mengintegrasikan perubahan Anda ke dalam jawaban yang diterima.
Stephen Ostermiller