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

45

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

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

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

    
задан Evan Plaice 13.02.2011 в 01:07
источник

5 ответов

37

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 . В настоящее время есть ошибка в графическом интерфейсе, который позволяет настраивать привязки клавиш. Он не знает об этих настройках. У меня есть клавиша «sleep» на моей клавиатуре. Если я хочу переназначить его на другие функции, я должен отключить параметр в org.gnome.settings-daemon.plugins.power вручную. GUI не делает этого для меня (хотя он отлично назначает новую функциональность).

Другая морщина - это привязки пользовательских клавиш. Они хранятся в dconf с использованием перемещаемой схемы. Это делается так, потому что их произвольное число. Разумный подход, но он делает листинг или изменяет их с помощью командной строки сложнее, чем это должно быть.

Я также узнал, что графический интерфейс, который позволяет назначать привязки клавиш, ограничен тем, что меня раздражает. Графический интерфейс позволяет точно привязать одно ключевое слово к каждому действию. В dconf вы можете установить массив привязок для одного действия. Это полезно для меня. Например, мне нравится иметь действие «close-window», назначенное на традиционный 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) = (,,);
                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/^'(.*)'$//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 , чтобы разрешать в них настраиваемые команды с кавычками.

    
ответ дан Stephen Ostermiller 14.11.2012 в 23:00
источник
14

Ярлыки клавиш не сохраняются ни в одном месте

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

Update:

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

    
ответ дан Evan Plaice 16.02.2011 в 08:49
13

Как выполнить резервное копирование настроек 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 отслеживает конфигурационный файл, чтобы его никогда не потерять. Ссылка - мой текущий любимый метод.

Протестировано на Ubuntu 15.10. Совет адаптирован из: Ссылка

    
ответ дан Ciro Santilli 包子露宪 六四事件 法轮功 15.03.2016 в 13:30
3

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

$HOME/.gconf/desktop/gnome/keybindings

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

    
ответ дан EntropyReduction 23.03.2013 в 21:32
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) = (,,);
                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/^'(.*)'$//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 25.11.2014 в 23:33