GNOME键盘快捷键存储在哪里?


53

我通常会为每个发行版加载一个新版本,以保持操作系统最新,同时将最新版本保留在另一个分区上作为备份。我还使用了许多自定义键映射。

到目前为止,我已经找到了如何在系统之间转移大部分配置的方法,但是我无法确定自定义键盘快捷键映射的存储位置。

有人知道侏儒把这些放在哪里吗?是否有单独的用户配置(即〜/)和系统配置(即/ etc)文件?


2
您如何更改设置?使用GConf编辑器?我猜你想要gconftool-2 --dump /apps/metacity这样的东西。
Mikel

1
@Mikel非常感谢您的评论。根据我在gconf-editor中的了解,大多数按键绑定都存储在/ apps / metacity下,而其余部分则散布在周围。我目前正在编写Import / Export python脚本,以使备份/还原键绑定成为一键式操作。
伊万·普赖斯

Answers:


45

自从编写了针对该问题的其他答案以来,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进行的修复,以允许使用带引号的自定义命令。


2
我针对ubuntu gnome-control-center键盘快捷键提交了两个错误。我在创建此脚本时找到了它们。bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...
斯蒂芬Ostermiller

1
感谢您提供@Stephen脚本,它仅在Ubuntu 13.10上试用过,并且可以正常工作!创建了一个易于共享的要点:gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci

出色的工作和出色的工作记录了细节。
Evan Plaice 2015年

2
仍可在Ubuntu GNOME 3.2上使用-谢谢!
klequis '16

1
“作品”在技术上对我来说,但很可能需要看不同的dconf部分为Ubuntu-MATE(即[org/mate/marco/global-keybindings][org/mate/marco/window-keybindings]...)
弗兰克Nocke

17

如何备份dconf设置(如键盘快捷键)

  1. 将它们全部转储到文件中:

    dconf dump / >~/.config/dconf/user.conf
    
  2. 在文本编辑器上打开该文件,然后选择您关心的设置:

    editor ~/.config/dconf/user.conf
    

    如果使用Vim,则需要突出显示此语法

    您很快就会问自己是什么<Primary>

  3. 如果您不知道设置的名称,但是知道如何从GUI修改它unity-control-center,请运行:

    dconf watch /
    

    然后修改它们。确切的设置将出现在终端上。

  4. 要还原这些设置时,请运行:

    dconf load / <~/.config/dconf/user.conf
    
  5. 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概要文件


15

键盘快捷键未存储在任何一个地方

根据发行版的不同,键盘快捷方式应用程序在GUI中可能被称为其他事物,但在命令行上应将其称为“ gnome-keybinding-properties”。事实证明,这个小巧的应用程序将所有快捷方式带到了一个方便用户编辑的地方。

由于在Ubuntu中不存在用于键绑定的一键式导出/导入工具,因此我在python中编写了一个:

这是脚本的链接

导出会从系统中提取设置。本质上,它包含所有按键绑定位置的列表,这些列表在脚本中硬编码为字典。该脚本将枚举列表,并为每个键运行命令“ gconftool-2 --get [location]”,并将值与键一起存储在字典中。然后,当您指定保存设置的位置时,它将字典保存为json格式的文件。

导入脚本将逆转此过程。它从json文件加载字典。然后枚举这些内容,并运行命令“ gconftool-2 --type字符串--set [位置] [值]”以恢复所有已保存的设置。

任一端拍摄一次,它可以保存/恢复每个键盘快捷键,而无需触摸其他任何系统配置设置。

这些脚本的唯一依赖项是:

  • python(经过测试并在2.6、2.7和3.1中工作)
  • gconftool-2(在Ubuntu安装中成为标准配置)
  • zenity(在Ubuntu安装中成为标准配置)

执行该脚本需要Python,gconftool-2用于获取/设置设置,文件加载/保存gui对话框需要zenity。

我已经在Ubuntu Brainstorm上创建了一个条目,并且在将该功能引入“ gnome-keybinding-properties” GUI菜单方面正在取得进展。

更新:

我进行了更新,将导入和导出脚本合并为一个,添加了完整的命令行功能(包括--help info),并使其与python2x和python3k兼容。另外,将链接添加到Ubuntu Brainstorm想法。


头脑风暴几乎不是对Ubuntu进行实际改进的好地方-只有十大问题才引起开发人员的注意。我建议您在其中找到“启动板”页面,gnome-keybinding-properties并使用脚本发布补丁。
Oxwivi 2011年

您的脚本非常适合gconftool-2 / gconf-editor中列出/处理的快捷方式...我想它取决于一个叫GNOME键盘快捷方式的人...但它不会获取系统范围内的用户快捷方式通过Keyboard Shortcutsgnome-keybinding-properties...也不添加其他键绑定,例如Xbindkeys...因此,我怀疑gconf'并不是“存储”系统级快捷方式的地方,而是它是更深层次的接口……(我一直在寻找那个地方.. :)。也许我现在只需要保留3个“导出的”列表...
Peter.O 2011年

@ fred.bear我很确定它们都存储在gconf中,但是当您从控制面板中的默认值更改时,我发现新的键绑定已添加到gnome-keybinding-properties中。当前脚本将执行在GUI中找到的默认快捷方式,但是如果不更紧密地集成到GUI中,它将无法支持所有快捷方式。当前已经为此打开了一个蓝图,因此我正尝试与提出该问题的其他开发人员联系,以在启动板上找到详细信息。目前...这有效。
Evan Plaice

3

在11.10运行Gnome classic中,我在下面找到了一组目录(Custom0,Custom1 ...)

$HOME/.gconf/desktop/gnome/keybindings

我将这些目录复制到干净的12.04安装中的同一文件夹中(再次运行Gnome后备),然后注销并再次登录。这些键绑定在过渡过程中有些混乱(SUPER修饰符发生了一些有趣的变化),但否则它们在那里。


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) = ($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);
}

关于AskUbuntu的出色的第一答案! 恭喜!
Fabby 2014年

我已将您的更改整合到接受的答案中。
斯蒂芬·奥斯特米勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.