问题描述
我通常为每个版本加载一个新版本,以保持我的操作系统新鲜,同时保留另一个分区上的最后一个版本作为备份。我还使用了很多自定义键映射。
到目前为止,我已经想出了如何跨系统传输我的大部分配置,但我无法弄清楚自定义键盘快捷键映射的存储位置。
有人知道gnome把这些放在哪里吗?是否有单独的用户配置(即〜/)和系统配置(即/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)应用这些文件。
第二组non-window-manager相关的键绑定存储在dconf路径org.gnome.settings-daemon.plugins.media-keys
中
存在于dconf路径org.gnome.settings-daemon.plugins.power
中的第三组与电源按钮相关的键绑定。 GUI中目前存在一个错误,允许您配置键绑定。它不知道这些设置。我的键盘上有一个”sleep”按钮。如果我想将其重新分配给其他功能,我必须手动禁用org.gnome.settings-daemon.plugins.power
中的设置。 GUI不会为我做这件事(虽然它可以很好地分配新功能)。
另一个皱纹是自定义键绑定。这些使用可重定位模式存储在dconf中。它是这样做的,因为它们有任意数量。一种合理的方法,但它通过命令行列出或修改它们比它应该更难。
我还发现允许您分配键绑定的GUI受到限制,令我烦恼。 GUI允许为每个动作分配一个键绑定。在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) = ($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修复以允许带引号的自定义命令。
次佳解决思路
键盘快捷键不会存储在任何一个地方
根据您的发行版本,键盘快捷键应用程序可能在GUI中被称为不同的东西,但在命令行上它应该被称为’gnome-keybinding-properties’。事实证明,这个简洁的小应用程序将所有快捷方式带入一个方便用户编辑的地方。
由于在Ubuntu中没有用于键绑定的one-click导出/导入工具,我在python中写了一个:
导出从系统中提取设置。基本上它包含所有键绑定位置的列表是hard-coded到脚本中的字典。该脚本枚举列表并为每个键运行命令“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用于获取/设置设置,文件加载/保存gui对话框需要zenity。
I have created an entry on Ubuntu Brainstorm并且正在将此功能引入’gnome-keybinding-properties’ GUI菜单方面取得进展。
更新:
我更新了将导入和导出脚本合并为一个,添加了完整的命令行功能(包括–help info),并使其兼容python2x和python3k。另外,添加了Ubuntu Brainstorm想法的链接。
第三种解决思路
如何备份键盘快捷键等dconf设置
-
将它们全部转储到文件中:
dconf dump / >~/.config/dconf/user.conf
-
在文本编辑器上打开该文件,然后选择您关心的设置:
editor ~/.config/dconf/user.conf
如果您使用Vim,您将需要this syntax highlight。
你很快就会问自己什么是
<Primary>
。 -
如果您不知道设置的名称,但知道如何从
unity-control-center
等GUI进行修改,请运行: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经典的11.10中,我发现了一组目录(Custom0,Custom1 …)
$HOME/.gconf/desktop/gnome/keybindings
我将这些目录复制到干净的12.04安装中的同一文件夹(再次运行Gnome fallback),注销并再次登录。在转换过程中,键绑定有点混乱(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);
}