我通常会为每个发行版加载一个新版本,以保持操作系统最新,同时将最新版本保留在另一个分区上作为备份。我还使用了许多自定义键映射。
到目前为止,我已经找到了如何在系统之间转移大部分配置的方法,但是我无法确定自定义键盘快捷键映射的存储位置。
有人知道侏儒把这些放在哪里吗?是否有单独的用户配置(即〜/)和系统配置(即/ etc)文件?
我通常会为每个发行版加载一个新版本,以保持操作系统最新,同时将最新版本保留在另一个分区上作为备份。我还使用了许多自定义键映射。
到目前为止,我已经找到了如何在系统之间转移大部分配置的方法,但是我无法确定自定义键盘快捷键映射的存储位置。
有人知道侏儒把这些放在哪里吗?是否有单独的用户配置(即〜/)和系统配置(即/ etc)文件?
Answers:
自从编写了针对该问题的其他答案以来,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
。GUI中当前存在一个错误,可让您配置键绑定。它不知道这些设置。我的键盘上有一个“睡眠”按钮。如果我想将其重新分配给其他功能,则必须org.gnome.settings-daemon.plugins.power
手动禁用该设置。GUI不能为我做这件事(尽管它可以很好地分配新功能)。
另一个难题是自定义键绑定。这些文件使用可重定位架构存储在dconf中。之所以这样做是因为其中有任意数量。这是一种合理的方法,但是它使通过命令行列出或修改它们比应做的困难。
我还发现,允许您分配键绑定的GUI在某种程度上受到限制,这使我很烦。GUI允许将一个键绑定分配给每个动作。在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进行的修复,以允许使用带引号的自定义命令。
[org/mate/marco/global-keybindings]
,[org/mate/marco/window-keybindings]
...)
如何备份dconf设置(如键盘快捷键)
将它们全部转储到文件中:
dconf dump / >~/.config/dconf/user.conf
在文本编辑器上打开该文件,然后选择您关心的设置:
editor ~/.config/dconf/user.conf
如果使用Vim,则需要突出显示此语法。
您很快就会问自己是什么<Primary>
。
如果您不知道设置的名称,但是知道如何从GUI修改它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
不幸的是,由于无法预测的概要文件ID,Gnome终端无法进行此类编辑:从命令行上的18.04编辑Gnome-Terminal概要文件
键盘快捷键未存储在任何一个地方
根据发行版的不同,键盘快捷方式应用程序在GUI中可能被称为其他事物,但在命令行上应将其称为“ gnome-keybinding-properties”。事实证明,这个小巧的应用程序将所有快捷方式带到了一个方便用户编辑的地方。
由于在Ubuntu中不存在用于键绑定的一键式导出/导入工具,因此我在python中编写了一个:
导出会从系统中提取设置。本质上,它包含所有按键绑定位置的列表,这些列表在脚本中硬编码为字典。该脚本将枚举列表,并为每个键运行命令“ gconftool-2 --get [location]”,并将值与键一起存储在字典中。然后,当您指定保存设置的位置时,它将字典保存为json格式的文件。
导入脚本将逆转此过程。它从json文件加载字典。然后枚举这些内容,并运行命令“ gconftool-2 --type字符串--set [位置] [值]”以恢复所有已保存的设置。
任一端拍摄一次,它可以保存/恢复每个键盘快捷键,而无需触摸其他任何系统配置设置。
这些脚本的唯一依赖项是:
执行该脚本需要Python,gconftool-2用于获取/设置设置,文件加载/保存gui对话框需要zenity。
我已经在Ubuntu Brainstorm上创建了一个条目,并且在将该功能引入“ gnome-keybinding-properties” GUI菜单方面正在取得进展。
更新:
我进行了更新,将导入和导出脚本合并为一个,添加了完整的命令行功能(包括--help info),并使其与python2x和python3k兼容。另外,将链接添加到Ubuntu Brainstorm想法。
gnome-keybinding-properties
并使用脚本发布补丁。
Keyboard Shortcuts
。gnome-keybinding-properties
...也不添加其他键绑定,例如Xbindkeys
...因此,我怀疑gconf'并不是“存储”系统级快捷方式的地方,而是它是更深层次的接口……(我一直在寻找那个地方.. :)。也许我现在只需要保留3个“导出的”列表...
可接受的答案存在一个小问题,因为它无法处理带有引号的自定义命令。我只更改了自定义命令的处理以生成正确的输出。
#!/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);
}
gconftool-2 --dump /apps/metacity
这样的东西。