Де зберігаються комбінації клавіш GNOME?


53

Зазвичай я завантажую нову версію для кожного випуску, щоб зберегти операційну систему свіжою, зберігаючи останню версію на іншому розділі як резервну копію. Я також використовую багато спеціальних відображень ключів.

Я досі зрозумів, як перенести більшість моєї конфігурації в усі системи, але не можу зрозуміти, де зберігаються спеціальні відображення ярликів на клавіатурі.

Хтось знає, куди їх кладе гном? Чи існують окремі файли конфігурації користувача (тобто ~ /) та файли конфігурації системи (тобто / тощо)?


2
Як ви змінили налаштування? Використовуєте редактор GConf? Я здогадуюсь, ти хочеш gconftool-2 --dump /apps/metacityчи щось подібне.
Мікель

1
@Mikel Дякую за зауваження. З того, що я можу сказати в gconf-редакторі, більшість зв'язків клавіш зберігаються під / apps / metacity, а решта поширюються навколо. В даний час я пишу сценарії імпорту / експорту python, щоб зробити резервне копіювання / відновлення клавіш операцією одним клацанням миші.
Еван Плейс

Відповіді:


45

Ubuntu змінився з моменту написання інших відповідей на це питання.

Клавіатурні зв’язки перейшли від gconf до dconf. Gconf зберігає свої дані у xml-файлах, до них звертається gconf-editorта gconf-tool2. Dconf зберігає свої дані у двійковому форматі та має доступ до dconf-editorта gsettings.

Кількість місць, в яких зберігаються клавіші, зменшується. Зараз існує централізований шлях dconf для зберігання зв'язків ключів менеджера вікон ( org.gnome.desktop.wm.keybindings). У каталозі є файли відображення, /usr/share/gnome-control-center/keybindings/які показують, як вони застосовуються на основі вікна-менеджера, який ви фактично використовуєте (compiz або metacity).

Другий набір ключів, що не пов'язані з вікном, пов'язані з ключем, зберігається у шляху dconf org.gnome.settings-daemon.plugins.media-keys

Існує третій набір клавішних зв’язків, пов’язаний з кнопками живлення, які зберігаються в dconf шляху org.gnome.settings-daemon.plugins.power. Наразі в графічному інтерфейсі є помилка, яка дозволяє вам налаштувати прив'язки клавіш. Про ці налаштування він не знає. У мене на клавіатурі є кнопка "сон". Якщо я хочу передати його іншому функціоналу, я мушу відключити налаштування org.gnome.settings-daemon.plugins.powerвручну. GUI не робить це для мене (хоча він призначає нову функціональність просто чудово).

Інша зморшка - це спеціальні прив’язки ключів. Вони зберігаються в dconf за допомогою переїзної схеми. Це зроблено таким чином, оскільки їх існує довільна кількість. Розумний підхід, але він перераховує або модифікує їх за допомогою командного рядка складніше, ніж це має бути.

Я також з’ясував, що графічний інтерфейс, який дозволяє призначити прив'язки клавіш, обмежений таким чином, який мене дратує. Графічний інтерфейс дозволяє призначати рівно ОДНУ прив'язку клавіш до кожної дії. У dconf ви можете встановити масив прив’язок для однієї дії. Це мені корисно. Наприклад, мені подобається, щоб дія "закритого вікна" була призначена для традиційного Alt-F4, а також легше натиснути на одну кнопку на моїй клавіатурі.

Я написав сценарій Perl, щоб скинути всі прив'язки клавіш до файлу csv або відновити їх з файлу csv. Наприклад, щоб скинути прив'язки клавіш, які ви можете використовувати:

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

і відновити їх ви можете:

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

Це включає в себе виправлення, user2589537 , щоб призначені для користувача команди з цитатами в них.


2
Я подав дві помилки на ярлики клавіатури ubuntu gnome-control-center. Я знайшов їх під час створення цього сценарію. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/… та bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/…
Стівен Остерміллер

1
Дякую за сценарій @Stephen, тільки що спробував на Ubuntu 13.10, і він просто працював! Створено суть для простого обміну: gist.github.com/elgalu/8511861#file-keybindings-pl
Лев

Чудова робота та хороша робота з документуванням специфіки.
Еван Плейс

2
Все ще працює на Ubuntu GNOME 3.2 - Дякую!
klequis

1
«Працює» технічно для мене, але , ймовірно , повинні були б спостерігати різні секції dconf для Ubuntu-MATE (тобто [org/mate/marco/global-keybindings], [org/mate/marco/window-keybindings]...)
Франк Nocke

17

Як створити резервну копію параметрів dconf, таких як ярлики клавіатури

  1. Завантажте їх у файл:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Відкрийте цей файл у текстовому редакторі та виберіть потрібні вам налаштування:

    editor ~/.config/dconf/user.conf
    

    Якщо ви використовуєте Vim, вам потрібна ця синтаксична підсвітка .

    Ви незабаром запитаєте себе, що таке<Primary> .

  3. Якщо ви не знаєте ім'я налаштування, але знаєте, як його змінити на зразок графічного інтерфейсу unity-control-center, запустіть:

    dconf watch /
    

    а потім модифікувати їх. Точне налаштування з’явиться на терміналі.

  4. Коли ви хочете відновити ці налаштування, запустіть:

    dconf load / <~/.config/dconf/user.conf
    
  5. Git відстежує конфігураційний файл, щоб ніколи його не втрачати. https://github.com/andsens/homeshick - мій поточний улюблений метод.

Тестовано на Ubuntu 15.10. Порада адаптована з: http://catern.com/2014/12/21/plain-text-configuration-gnome.html

На жаль, термінал Gnome стійкий до таких змін через непередбачувані ідентифікатори профілю: Змінити профіль Gnome-Terminal з командного рядка 18.04


15

Комбінації клавіш не зберігаються в жодному одному місці

Залежно від версії дистрибутива, додаток для клавіатурних скорочень може називатися різними речами в графічному інтерфейсі, але в командному рядку його слід називати "gnome-keybinding-properties". Виявляється, це акуратне маленьке додаток приносить усі ярлики в одне зручне місце для редагування користувачами.

Оскільки в Ubuntu не існує інструмента експорту / імпорту одним натисканням клавіш, я написав його в python:

Ось посилання на сценарій

Експорт витягує налаштування з системи. По суті, він містить список усіх місць сполучення клавіш, які жорстко закодовані у словник у сценарії. Сценарій перераховує список і виконує команду "gconftool-2 --get [location]" для кожного ключа і зберігає значення у словнику разом з ключем. Потім, коли ви вказуєте місце для збереження налаштувань, він зберігає словник у файл у форматі json.

Сценарій імпорту скасовує цей процес. Він завантажує словник з файлу json. Потім він перераховує через них і виконує команду "gconftool-2 - type string --set [location] [value]", щоб відновити всі збережені налаштування.

Один знімок на будь-якому кінці, і він зберігає / відновлює кожну комбінацію клавіш, не торкаючись жодного з інших параметрів конфігурації системи.

Єдині залежності для цих сценаріїв:

  • python (перевірено та працює в 2.6, 2.7 та 3.1)
  • gconftool-2 (постачається в комплекті з установкою Ubuntu)
  • zenity (стандартний з установкою Ubuntu)

Python потрібен для виконання сценарію, gconftool-2 використовується для отримання / встановлення налаштувань, zenity потрібен для діалогового вікна завантаження / збереження файлів gui.

Я створив запис про Ubuntu Brainstorm і просунувся, коли цю функцію вводять у меню GUI 'gnome-keybinding-properties'.

Оновлення:

Я оновив комбіновані сценарії імпорту та експорту в один, додав повну функціональність командного рядка (включаючи - допомогу інформації) і зробив його сумісним як для python2x, так і для python3k. Також додано посилання на ідею Ubuntu Brainstorm.


Мозковий штурм навряд чи є вдалим місцем для фактичних удосконалень Ubuntu - лише 10 кращих питань фактично привертають увагу розробника. Я б запропонував вам знайти сторінку Launchpad для gnome-keybinding-propertiesта опублікувати виправлення зі своїм сценарієм.
Oxwivi

Ваш сценарій хороший для ярликів, перелічених / оброблених gconftool-2 / gconf-editor ... і я вважаю, що це залежить від того, хто викликає ярлик клавіатури GNOME ... але він не збирає додані ярлики для користувачів системи, додані по Keyboard Shortcutsт. е. gnome-keybinding-properties... ні інші клавіші, додані, наприклад Xbindkeys... так що я підозрюю, що gconf '- це не те, де їх "зберігають" ярлики для всіх систем, але це інтерфейс до чогось / десь глибшого ... (я я шукав це місце .. :). можливо, мені просто потрібно зберегти 3 "експортовані" списки наразі ...
Peter.O

@ fred.bear Я впевнений, що всі вони зберігаються в gconf, але я знаходжу, що нові зміни клавіатури додаються до властивостей gnome-keybinding, коли ви змінюєтесь за замовчуванням на панелі керування. Поточний сценарій виконає ярлики за замовчуванням, знайдені в графічному інтерфейсі, але він не зможе підтримати всі ярлики без більш жорсткої інтеграції в графічний інтерфейс. Зараз для цього вже відкритий план, тому я намагаюся зв’язатися з іншим розробником, який запропонував це розробити деталі на панелі запуску. Поки що ... це працює.
Еван Плейс

3

У 11.10 під керуванням класики Gnome я знайшов набір каталогів (Custom0, Custom1 ...) під

$HOME/.gconf/desktop/gnome/keybindings

Я скопіював ці каталоги в ту саму папку в чистій установці 12.04 (знову працює з Gnome backback), вийшов із системи та ввійшов знову. Клавіатурні зв'язки трохи переплуталися під час переходу (щось смішне трапилось із модифікатором SUPER), але в іншому випадку вони були там.


2

Існує невелика проблема з прийнятою відповіддю, оскільки вона не може обробляти власні команди з цитатами. Я змінив лише обробку спеціальних команд для отримання правильного результату.

#!/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! Вітаю!
Fabby

Я інтегрував ваші зміни до прийнятої відповіді.
Стівен Остерміллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.