Где хранятся сочетания клавиш GNOME?
Я обычно загружаю новую версию для каждого выпуска, чтобы сохранить мою ОС свежей, сохраняя последнюю версию в другом разделе в качестве резервной копии. Я также использую много пользовательских комбинаций клавиш.
Я выяснил, как перенести большую часть моей конфигурации между системами, но не могу понять, где хранятся пользовательские сочетания клавиш.
Кто-нибудь знает, куда гном кладет их? Существуют ли отдельные файлы пользовательских настроек (например, ~/) и системных настроек (например, /etc)?
5 ответов
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);
}
Это включает исправление Jordan Weitz, разрешающее использование пользовательских команд с кавычками в них.
Как сделать резервную копию настроек dconf, таких как сочетания клавиш
Скопируйте их все в файл:
dconf dump / >~/.config/dconf/user.conf
Откройте этот файл в текстовом редакторе и выберите нужные параметры:
editor ~/.config/dconf/user.conf
Если вы используете Vim, вам понадобится эта подсветка синтаксиса.
Вы скоро спросите себя, что
<Primary>
,Если вы не знаете название параметра, но знаете, как изменить его с помощью графического интерфейса, например
unity-control-center
, бежать:dconf watch /
а затем изменить их. Точная настройка появится на терминале.
Когда вы хотите восстановить эти настройки, запустите:
dconf load / <~/.config/dconf/user.conf
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 из командной строки.
Сочетания клавиш не хранятся ни в одном месте
В зависимости от версии вашего дистрибутива приложение сочетаний клавиш может называться по-разному в графическом интерфейсе, но в командной строке оно должно называться "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.
Сохранить пользовательские сочетания клавиш
Вы можете сохранять / создавать резервные копии / экспортировать пользовательские ярлыки / ставки, используя только 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
выводит только значения, отличные от значений по умолчанию - Чтобы сделать резервную копию, вы хотите использовать
custom-shortcuts-$(date -I).ini
Проверьте его работу, сбросив настройки по умолчанию перед импортом.
gsettings reset-recursively org.gnome.settings-daemon.plugins.media-keys
В 11.10 под управлением Gnome classic я нашел набор каталогов (Custom0, Custom1...) под
$HOME/.gconf/desktop/gnome/keybindings
Я скопировал эти каталоги в ту же папку в чистой установке 12.04 (снова работает с резервным Gnome), вышел из системы и снова вошел в систему. Комбинации клавиш немного запутались при переходе (что-то смешное случилось с модификатором SUPER), но в остальном они были там.
Существует небольшая проблема с принятым ответом в том, что он не может обрабатывать пользовательские команды с кавычками в них. Я только изменил обработку пользовательских команд для генерации правильного вывода.
#!/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);
}