GNOME klavye kısayolları nerede saklanır?


53

Genellikle her sürüm için yeni bir sürümü yüklerim ve işletim sistemimi taze tutarken son sürümü yedek olarak korurum. Ayrıca birçok özel anahtar eşlemesi de kullanıyorum.

Konfigürasyonumun çoğunluğunun şimdiye kadar sistemler arasında nasıl aktarılacağını öğrendim ancak özel klavye kısayol eşlemelerinin nerede depolandığını bulamıyorum.

GNOME'un nereye koyduğunu bilen var mı? Ayrı kullanıcı config (yani, ~ /) ve system config (yani / etc) dosyaları var mı?


2
Ayarları nasıl değiştirdiniz? GConf Editor'ü kullanıyor musunuz? Sanırım istediğini gconftool-2 --dump /apps/metacityya da onun gibi bir şey.
Mikel

1
@Mikel Bu yorum için bir demet teşekkürler. Gconf-editor'da söyleyebileceklerime göre, geri kalanı etrafa yayılırken çoğu bağlama / apps / metacity altında tutulur. Şu anda tek bir tıkla işleminizi geri almak / yedeklemek için python komut dosyalarını içe aktar / dışa aktarıyorum.
Evan Plaice

Yanıtlar:


45

Ubuntu, bu sorunun diğer cevapları yazıldığından beri değişti.

Anahtarlıklar gconf'tan dconf'a taşındı. Gconf xml dosyalarında verilerini depolayan ve tarafından erişilen gconf-editorve gconf-tool2. Dconf verilerini ikili biçimde saklar ve bunlara dconf-editorve gsettings.

Tuş bağlamalarının saklandığı yerlerin sayısı azalır. Pencere yöneticisi keybindings'i ( org.gnome.desktop.wm.keybindings) saklamak için artık merkezi bir dconf yolu var . /usr/share/gnome-control-center/keybindings/Dizinde, gerçekte kullandığınız pencere yöneticisine (compiz veya metacity) göre nasıl uygulandığını gösteren eşleme dosyaları vardır .

Dconf yolunda ikinci bir pencere yöneticisi olmayan ilişkili anahtar bağlantıları kümesi saklanır org.gnome.settings-daemon.plugins.media-keys

Dconf yolunda kayıtlı olan güç düğmeleri ile ilgili üçüncü bir dizi anahtarlık vardır org.gnome.settings-daemon.plugins.power. Şu anda GUI'de, tuş bağlarını yapılandırmanıza izin veren bir hata var. Bu ayarlar hakkında hiçbir şey bilmiyor. Klavyemde bir "uyku" düğmesi var. Başka bir işlevselliğe atamak istersem, ayarı org.gnome.settings-daemon.plugins.powerel ile devre dışı bırakmam gerekir. GUI benim için yapmıyor (yeni işlevselliği gayet iyi bir şekilde atamasına rağmen).

Diğer kırışıklık özel anahtar ciltleridir. Bunlar yer değiştirebilir şema kullanılarak dconf'ta saklanır. Bu şekilde yapılır, çünkü keyfi bir sayıda vardır. Makul bir yaklaşım, ancak komut satırında onları listelemeyi veya değiştirmeyi olması gerekenden daha zorlaştırır.

Ayrıca, anahtarlıklar atamanıza izin veren GUI'nin beni rahatsız edecek şekilde sınırlı olduğunu da öğrendim. GUI, her harekete tam olarak bir tane atamak için izin verir. Dconf'ta, tek bir işlem için bir dizi bağlayıcı ayarlayabilirsiniz. Bu benim için faydalıdır. Örneğin, tradertonal Alt-F4'e atanmış "pencereyi kapat" eyleminin yapılmasının yanı sıra, klavyemdeki tek bir düğmeye basmanın daha kolay olmasını istiyorum.

Tüm anahtar bağlarını bir csv dosyasına atmak ya da csv dosyasından geri yüklemek için bir Perl komut dosyası yazdım. Örneğin, kullanabileceğiniz tuş bağlamalarını atmak için:

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

ve onları geri yüklemek için kullanabilirsiniz:

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

Bu, içinde tırnak işaretleri bulunan özel komutlara izin vermek için user2589537 tarafından yapılan düzeltmeyi içerir .


2
Ubuntu gnome-kontrol merkezi klavye kısayollarına karşı iki hata yaptım. Bu betiği oluştururken onları buldum. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/… ve bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/…
Stephen Ostermiller

1
Senaryo @Stephen için teşekkürler, sadece Ubuntu 13.10'u denedim ve işe yaradı! Kolay paylaşım için bir fikir oluşturdu: gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci

Müthiş iş ve özelliklerini belgeleyen iyi iş.
Evan Plaice

2
Hala Ubuntu GNOME 3.2'de çalışıyor - Teşekkürler!
klequis

1
Benim için teknik olarak "çalışır", ama muhtemelen Ubuntu-MATE (yani farklı dconf bölümleri izlemek gerekir [org/mate/marco/global-keybindings], [org/mate/marco/window-keybindings]...)
Frank Nocke

17

Klavye kısayolları gibi dconf ayarları nasıl yedeklenir

  1. Hepsini bir dosyaya boşaltın:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Bu dosyayı bir metin düzenleyicide açın ve ilgilendiğiniz ayarları seçin:

    editor ~/.config/dconf/user.conf
    

    Vim kullanıyorsanız, bu sözdiziminin vurgulanmasını istersiniz .

    Yakında kendinize ne olduğunu<Primary> soracaksınız .

  3. Ayarın adını bilmiyorsanız, ancak bunu bir GUI'den nasıl değiştireceğinizi biliyorsanız unity-control-center, şunu çalıştırın:

    dconf watch /
    

    ve sonra bunları değiştirin. Kesin ayar terminalde görünecektir.

  4. Bu ayarları geri yüklemek istediğinizde, şunu çalıştırın:

    dconf load / <~/.config/dconf/user.conf
    
  5. Git asla kaybetmemek için config dosyasını takip et. https://github.com/andsens/homeshick şu anki favori yöntemim.

Ubuntu 15.10'da test edilmiştir. Uyarlanan ipucu: http://catern.com/2014/12/21/plain-text-configuration-gnome.html

Gnome terminali ne yazık ki tahmin edilemeyen profil kimlikleri nedeniyle bu tür düzenlemelere karşı dirençli: 18.04 tarihinde Gnome-Terminal profilini komut satırından düzenle


15

Klavye kısayolları herhangi bir yerde saklanmaz

Dağıtım sürümünüze bağlı olarak, klavye kısayolları uygulamasına GUI'de farklı şeyler denebilir, ancak komut satırında 'gnome-keybinding-properties' olarak adlandırılmalıdır. Bu temiz küçük uygulamanın, tüm kısayolları kullanıcıların düzenlemesi için uygun bir yere getirdiği anlaşılıyor.

Ubuntu’daki tuş bağlamaları için tek tıklatmalı dışa aktarma / içe aktarma aracı olmadığından python'da bir tane yazdım:

İşte betiğin bağlantısı

Dışa aktarma, ayarları sistemden çeker. Temel olarak, tüm anahtar bağlama konumlarının bir listesini içeren kodda bir sözlükte kodlanmış. Betik listeyi sıralar ve her anahtar için "gconftool-2 --get [location]" komutunu çalıştırır ve değeri anahtarla birlikte sözlükte saklar. Sonra ayarları kaydedeceğiniz yeri belirlediğinizde, sözlüğü json formatında dosyaya kaydeder.

Bir içe aktarma komut dosyası bu işlemi tersine çevirir. Sözlüğü json dosyasından yükler. Daha sonra bunlar arasında numaralandırılır ve kaydedilmiş tüm ayarları geri yüklemek için "gconftool-2 --type string --set [location] [value]" komutunu çalıştırır.

Her iki uçta birer çekim yapılır ve diğer sistem yapılandırma ayarlarına dokunmadan her bir klavye kısayolunu kaydeder / geri yükler.

Bu komut dosyalarının tek bağımlılıkları:

  • python (2.6, 2.7 ve 3.1'de test edildi ve çalışıyor)
  • gconftool-2 (bir Ubuntu kurulumunda standart olarak gelir)
  • zenity (bir Ubuntu kurulumu ile standart olarak gelir)

Komut dosyasını çalıştırmak için Python, ayarları almak / ayarlamak için gconftool-2, dosya yükleme / kaydetme gui diyalogları için ayarlamalar gereklidir.

Ubuntu Beyin Fırtınası'na bir giriş yaptım ve bu özelliğin 'gnome-keybinding-properties' GUI menüsüne tanıtılması için ilerleme kaydediyorum.

Güncelleme:

İçeri aktarma ve dışa aktarma komut dosyalarını bir araya getirdim, tam komut satırı işlevi (--help bilgisi dahil) ekledim ve hem python2x hem de python3k ile uyumlu hale getirdim. Ayrıca, bağlantıyı Ubuntu Beyin Fırtınası fikrine de ekledi.


Beyin fırtınası Ubuntu'nun gerçek iyileştirmeleri için pek iyi bir yer değildir - yalnızca en önemli 10 konu aslında geliştiricinin dikkatini çeker. gnome-keybinding-propertiesKomut dosyanızla birlikte bir düzeltme eki için Launchpad sayfasını bulmanızı ve göndermenizi öneririm .
Oxwivi

Komut dosyanız gconftool-2 / gconf-editor tarafından listelenen / işlenen kısayollar için iyidir ... ve galiba GNOME klavye kısayolunu ne çağırdığına bağlı ... ama sistem genelinde kullanıcı kısayolları eklemiyor. tarafından Keyboard Shortcutsyani. gnome-keybinding-properties... ya da örneğin başka anahtarlıklar da eklenmedi Xbindkeys... bu yüzden gconf'un, sistem genelindeki kısayolların "depolandıkları" yerlerde olmadığı, ancak daha derin bir yer / bir yerin arayüzü olduğu şüphesi ... (I o yeri arıyordum .. :). belki şu an için 3 'ihraç' listesini tutmam gerekiyor ...
Peter.O

@ fred.bear Hepsinin gconf içinde depolandığından eminim ama kontrol panelindeki varsayılan ayarlardan değiştirdiğinizde gnome-keybinding özelliklerine yeni tuş bağları eklendiğini buluyorum. Geçerli komut GUI'de bulunan varsayılan kısayolları yapar, ancak GUI'ye daha sıkı entegrasyon olmadan tüm kısayolları destekleyemez. Şu anda bunun için açık bir plan zaten var, bu yüzden bunu fırlatma panelinde ayrıntıları öğrenmek için öneren diğer geliştiriciyle iletişim kurmaya çalışıyorum. Şimdilik ... bu işe yarıyor.
Evan Plaice,

3

11.10'da çalışan Gnome classic altında bir dizi dizin buldum (Custom0, Custom1 ...)

$HOME/.gconf/desktop/gnome/keybindings

Bu dizinleri temiz bir 12.04 kurulumunda (tekrar Gnome geri dönüşü ile çalışıyor) aynı klasöre kopyaladım, çıkış yaptım ve tekrar giriş yaptım. Anahtar sözcükler geçiş sırasında biraz dağıldı (SUPER değiştiricisine komik bir şey oldu), ancak aksi halde oradaydılar.


2

Kabul edilen cevabın ufak bir problemi var, çünkü içerisinde özel komutları tırnak içinde kullanamıyor. Özel çıktıların işlenmesini yalnızca doğru çıktı üretmek için değiştirdim.

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

AskUbuntu'da mükemmel ilk cevap! Tebrikler!
Fabby

Değişikliklerinizi kabul edilen cevaba ekledim.
Stephen Ostermiller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.