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

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

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

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

62
задан 27 February 2011 в 13:55

6 ответов

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 , позволяющее настраивать команды с кавычками.

51
ответ дан 27 February 2011 в 13:55

Как сделать резервную копию настроек dconf, таких как сочетания клавиш

  1. Выгрузить их все в файл:

     dconf dump /  > ~ / .config / dconf / user.conf
     
  2. Откройте этот файл в текстовом редакторе и выберите нужные вам настройки:

     редактор ~ / .config / dconf / user.conf
     

    Если вы используете Vim, вам понадобится эта подсветка синтаксиса .

    Вы скоро спросите себя , что такое .

  3. Если вы не используете Не знаю название настройки, но знаю, как изменить его из графического интерфейса, например unity-центр управления , запустите:

     dconf watch /
     

    , а затем измените их. Затем точная настройка появится на терминале.

  4. Если вы хотите восстановить эти настройки, запустите:

     dconf load / <~ / .config / dconf / user.conf
     
  5. Git отслеживает конфигурационный файл, чтобы не потерять его. Homeshick - мой текущий любимый метод.

Протестировано на Ubuntu 15.10. Совет адаптирован из здесь .

Терминал Gnome, к сожалению, устойчив к подобным изменениям из-за непредсказуемых идентификаторов профилей .

Связано: Как я могу восстановить сочетания клавиш по умолчанию ?

23
ответ дан 27 February 2011 в 13:55

Сочетания клавиш не хранятся в каком-либо одном месте

В зависимости от версии вашего дистрибутива приложение сочетаний клавиш может быть вызывает разные вещи в графическом интерфейсе, но в командной строке он должен называться '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 , и я продвигаюсь к внедрению этой функции в меню графического интерфейса «gnome-keybinding-properties».

Обновление:

Я обновил объединенные сценарии импорта и экспорта в один, добавил полную функциональность командной строки (включая --help info) и сделал ее совместимой с python2x и python3k. Также добавлена ​​ссылка на идею Ubuntu Brainstorm.

15
ответ дан 27 February 2011 в 13:55

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

#!/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);
}
2
ответ дан 27 February 2011 в 13:55

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

$HOME/.gconf/desktop/gnome/keybindings

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

3
ответ дан 27 February 2011 в 13:55

Сохранение пользовательских сочетаний клавиш

Вы можете сохранять / создавать резервные копии / экспортировать пользовательские сочетания клавиш / назначения клавиш, используя только dconf и sed

Экспорт

dconf dump / | sed -n '/\[org.gnome.settings-daemon.plugins.media-keys/,/^$/p' > custom-shortcuts.ini # Export

Импорт

dconf load / < custom-shortcuts.ini # Import
  • На основе ответа Чиро (также здесь )
  • Только для добавленных пользовательских ярлыков
  • Обратите внимание, что dconf выводит только значения, отличные от значений по умолчанию.
  • Для резервного копирования вы хотите использовать пользовательские ярлыки - $ (date -I) .ini
  • Протестируйте его работу, сбросив на значения по умолчанию перед импортом

     настроек gsettings, рекурсивно сброшенных org.gnome.settings-daemon.plugins.media-keys
     
1
ответ дан 5 January 2021 в 23:56

Другие вопросы по тегам:

Похожие вопросы: