Где хранятся сочетания клавиш GNOME?

53

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

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

Кто-нибудь знает, куда гном кладет их? Существуют ли отдельные файлы пользовательских настроек (например, ~ /) и системных настроек (например, / etc)?

Эван Плейс
источник
2
Как вы изменили настройки? Используете редактор GConf? Я предполагаю, что вы хотите gconftool-2 --dump /apps/metacityили что-то в этом роде.
Микель
1
@Mikel Спасибо большое за этот комментарий. Из того, что я могу сказать в gconf-editor, большинство комбинаций клавиш хранятся в / apps / metacity, а остальные распространяются вокруг. В настоящее время я пишу сценарии импорта / экспорта Python, чтобы сделать резервное копирование / восстановление сочетаний клавиш одним щелчком мыши.
Эван Плейс,
Связанный: askubuntu.com/questions/17626/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

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вручную. Графический интерфейс не делает это для меня (хотя он назначает новую функциональность просто отлично).

Другая складка - это пользовательские привязки клавиш. Они хранятся в 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 устойчив к таким изменениям из-за непредсказуемых идентификаторов профилей: 18.04. Редактировать профиль Gnome-Terminal из командной строки.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
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 необходим для диалоговых окон загрузки файлов / сохранения файлов.

Я создал запись в Ubuntu Brainstorm и делаю успехи во введении этой функции в меню GUI «gnome-keybinding-properties».

Обновить:

Я обновил объединенные сценарии импорта и экспорта, добавил полную функциональность командной строки (включая информацию --help) и сделал его совместимым как для 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-properties, когда вы переходите с настроек по умолчанию на панели управления. Текущий скрипт будет использовать ярлыки по умолчанию, найденные в графическом интерфейсе, но он не сможет поддерживать все ярлыки без более тесной интеграции с графическим интерфейсом. В настоящее время уже есть готовый проект для этого, поэтому я пытаюсь связаться с другим разработчиком, который предложил это, чтобы проработать детали на панели запуска. На данный момент ... это работает.
Эван Плейс
3

В 11.10 под управлением Gnome classic я нашел набор каталогов (Custom0, Custom1 ...) под

$HOME/.gconf/desktop/gnome/keybindings

Я скопировал эти каталоги в ту же папку в чистой установке 12.04 (снова работает с резервным Gnome), вышел из системы и снова вошел в систему. Комбинации клавиш немного запутались при переходе (что-то смешное случилось с модификатором SUPER), но в остальном они были там.

EntropyReduction
источник
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! Congrats!
Fabby
Я включил ваши изменения в принятый ответ.
Стивен Остермиллер