Я обычно загружаю новую версию для каждого выпуска, чтобы сохранить мою ОС свежей, сохраняя последнюю версию в другом разделе в качестве резервной копии. Я также использую много пользовательских сопоставлений клавиш.
Я выяснил, как перенести большую часть моей конфигурации между системами, но я не могу понять, где хранятся пользовательские сочетания клавиш.
Кто-нибудь знает, куда гном кладет их? Существуют ли отдельные файлы конфигурации пользователя (т.е. ~ /) и конфигурации системы (например, / etc)?
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 , позволяющее настраивать команды с кавычками.
Как сделать резервную копию настроек dconf, таких как сочетания клавиш
Выгрузить их все в файл:
dconf dump / > ~ / .config / dconf / user.conf
Откройте этот файл в текстовом редакторе и выберите нужные вам настройки:
редактор ~ / .config / dconf / user.conf
Если вы используете Vim, вам понадобится эта подсветка синтаксиса .
Вы скоро спросите себя , что такое
.
Если вы не используете Не знаю название настройки, но знаю, как изменить его из графического интерфейса, например unity-центр управления
, запустите:
dconf watch /
, а затем измените их. Затем точная настройка появится на терминале.
Если вы хотите восстановить эти настройки, запустите:
dconf load / <~ / .config / dconf / user.conf
Git отслеживает конфигурационный файл, чтобы не потерять его. Homeshick - мой текущий любимый метод.
Протестировано на Ubuntu 15.10. Совет адаптирован из здесь .
Терминал Gnome, к сожалению, устойчив к подобным изменениям из-за непредсказуемых идентификаторов профилей .
Связано: Как я могу восстановить сочетания клавиш по умолчанию ?
Сочетания клавиш не хранятся в каком-либо одном месте
В зависимости от версии вашего дистрибутива приложение сочетаний клавиш может быть вызывает разные вещи в графическом интерфейсе, но в командной строке он должен называться 'gnome-keybinding-properties'. Оказывается, это аккуратное маленькое приложение объединяет все ярлыки в одно удобное место для редактирования пользователями.
Поскольку в Ubuntu не существует инструмента экспорта / импорта одним щелчком мыши для привязки клавиш, я написал его на python:
Экспорт забирает настройки из системы. По сути, он содержит список всех мест привязки клавиш, жестко закодированный в словаре сценария. Сценарий эмулирует список и запускает команду «gconftool-2 --get [location]» для каждого ключа и сохраняет значение в словаре вместе с ключом. Затем, когда вы указываете место для сохранения настроек, он сохраняет словарь в файле в формате json.
Сценарий импорта меняет этот процесс. Он загружает словарь из файла json. Затем он перечисляет их и запускает команду "gconftool-2 --type string --set [location] [value]", чтобы восстановить все сохраненные настройки.
Один выстрел с обеих сторон, и он сохраняет / восстанавливает все до единого. сочетание клавиш, не касаясь других параметров конфигурации системы.
Эти сценарии зависят только от следующих:
Python необходим для выполнения скрипт gconftool-2 используется для получения / установки настроек, zenity необходим для диалоговых окон GUI загрузки / сохранения файлов.
Я создал запись в Ubuntu Brainstorm , и я продвигаюсь к внедрению этой функции в меню графического интерфейса «gnome-keybinding-properties».
Обновление:
Я обновил объединенные сценарии импорта и экспорта в один, добавил полную функциональность командной строки (включая --help info) и сделал ее совместимой с python2x и python3k. Также добавлена ссылка на идею Ubuntu Brainstorm.
Есть небольшая проблема с принятым ответом, заключающаяся в том, что он не может обрабатывать пользовательские команды с кавычками. Я изменил обработку пользовательских команд только для правильного вывода.
#!/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);
}
В 11.10, запущенном Gnome classic, я нашел набор каталогов (Custom0, Custom1 ...) в
$HOME/.gconf/desktop/gnome/keybindings
. Я скопировал эти каталоги в ту же папку в чистой установке 12.04 (снова работает с резервным Gnome), вышел из системы и снова вошел в систему. . Комбинации клавиш немного испортились при переходе (что-то забавное произошло с модификатором SUPER), но в остальном они были там.
Вы можете сохранять / создавать резервные копии / экспортировать пользовательские сочетания клавиш / назначения клавиш, используя только 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