GNOMEキーボードショートカットはどこに保存されますか?


53

通常、リリースごとに新しいバージョンをロードして、OSを最新の状態に保ちながら、別のパーティションの最後のバージョンをバックアップとして保持します。また、多くのカスタムキーマッピングを採用しています。

これまで、システムの大部分をシステム間で転送する方法を理解しましたが、カスタムキーボードショートカットマッピングがどこに保存されているかわかりません。

誰がgnomeがこれらをどこに置くか知っていますか?個別のユーザー設定(つまり〜/)ファイルとシステム設定(つまり/ etc)ファイルはありますか?


2
設定をどのように変更しましたか?GConf Editorを使用していますか?私はあなたが望むgconftool-2 --dump /apps/metacityか、そのような何かを推測しています。
ミケル

1
@Mikelそのコメントをありがとう。gconf-editorで確認できることから、ほとんどのキーバインドは/ apps / metacityの下に保存され、残りは周りに分散しています。現在、バックアップ/復元キーバインドをワンクリック操作にするためのインポート/エクスポートpythonスクリプトを書いています。
エヴァンプライス

回答:


45

この質問に対する他の回答が書かれてから、Ubuntuは変更されました。

キーバインドはgconfからdconfに移動しました。gconfのは、XMLファイルにデータを保存し、によってアクセスされたgconf-editorgconf-tool2。Dconfはバイナリ形式でそのデータを格納し、によってアクセスされるdconf-editorgsettings

キーバインドが保存される場所の数が削減されます。店のウィンドウマネージャのキーバインドに集中dconfパスが用意されました(org.gnome.desktop.wm.keybindings)。ディレクトリに/usr/share/gnome-control-center/keybindings/は、実際に使用しているウィンドウマネージャー(compizまたはmetacity)に基づいてこれらがどのように適用されるかを示すマッピングファイルがあります。

非ウィンドウマネージャ関連のキーバインディングの2番目のセットは、dconfパスに格納されます org.gnome.settings-daemon.plugins.media-keys

dconfパスに保存されている電源ボタンに関連するキーバインドの3番目のセットがありますorg.gnome.settings-daemon.plugins.power。現在、キーバインディングを設定できるバグがGUIにあります。これらの設定については知りません。キーボードに「スリープ」ボタンがあります。他の機能に再割り当てする場合、org.gnome.settings-daemon.plugins.power手動で設定を無効にする必要があります。GUIは私のためにそれをしません(ただし、新しい機能をうまく割り当てます)。

他のしわは、カスタムキーバインディングです。これらは、再配置可能なスキーマを使用してdconfに保存されます。それらは任意の数であるため、このようにしました。合理的なアプローチですが、コマンドラインを使用したリストの作成または変更が、必要以上に難しくなります。

また、キーバインドを割り当てることができるGUIが、私を悩ますような方法で制限されていることもわかりました。GUIでは、各アクションにキーバインドを1つだけ割り当てることができます。dconfでは、単一のアクションに対してバインディングの配列を設定できます。これは私にとって便利です。たとえば、従来のAlt-F4に加えて、キーボードの単一ボタンを押しやすいボタンに「ウィンドウを閉じる」アクションを割り当てたいと思っています。

すべてのキーバインドをcsvファイルにダンプするか、csvファイルから復元するPerlスクリプトを作成しました。たとえば、使用できるキーバインドをダンプするには、次のようにします。

./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のキーボードショートカットに対して2つのバグを提出しました。このスクリプトを作成中に見つけました。bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...
スティーブンOstermiller

1
スクリプト@Stephenに感謝します。Ubuntu13.10で試したところ、うまくいきました!:簡単に共有するための要旨作成gist.github.com/elgalu/8511861#file-keybindings-pl
レオGallucci

詳細を文書化する素晴らしい仕事と良い仕事。
エヴァンプライス

2
Ubuntu GNOME 3.2でも引き続き動作します-ありがとう!
klequis

1
技術的には私のために、「作品」、おそらく(すなわちUbuntuの-MATEに異なるdconfセクションを見る必要があるだろう[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

Gnomeターミナルは、予測できないプロファイルIDのために、残念ながらそのような編集に耐性があります。18.04のコマンドラインからGnome-Terminalプロファイルを編集します。


15

キーボードショートカットは1か所に保存されません

ディストリビューションのバージョンによっては、キーボードショートカットアプリケーションはGUIで異なるものと呼ばれる場合がありますが、コマンドラインでは「gnome-keybinding-properties」と呼ばれる必要があります。このきちんとした小さなアプリケーションは、すべてのショートカットをユーザーが編集するのに便利な1つの場所に持っていくことがわかります。

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が使用され、GUIダイアログのロード/保存にはZenityが必要です。

Ubuntu Brainstormにエントリを作成し、この機能を「gnome-keybinding-properties」GUIメニューに導入することを進めています。

更新:

インポートスクリプトとエクスポートスクリプトを1つにまとめて更新し、完全なコマンドライン機能(--help infoを含む)を追加し、python2xとpython3kの両方と互換性を持たせました。また、Ubuntu Brainstormアイデアへのリンクを追加しました。


BrainstormはUbuntuの実際の改善に適した場所ではありません。実際に開発者の注目を集めるのは上位10件のみです。gnome-keybinding-propertiesスクリプトのLaunchpadページを見つけて、パッチを投稿することをお勧めします。
オックスウィビ

あなたのスクリプトは、gconftool-2 / gconf-editorにリストされている/処理されているショートカットに適しています...そして、GNOMEキーボードショートカットを呼び出すものに依存すると思います...しかし、システム全体のユーザーショートカットをピックアップしていませんKeyboard Shortcutsすなわち。gnome-keybinding-properties...などによって追加された他のキーバインディングもXbindkeys...なので、gconf 'はシステム全体のショートカットが「保存」されている場所ではなく、何か/より深い場所へのインターフェースであると思われます...(私はその場所を探していた.. :)。多分私はちょうど...今の3「エクスポート」のリストを維持する必要がある
Peter.O

@ fred.bearこれらはすべてgconfに保存されていると確信していますが、コントロールパネルのデフォルトから変更すると、gnome-keybinding-propertiesに新しいキーバインディングが追加されることがわかりました。現在のスクリプトは、GUIにあるデフォルトのショートカットを実行しますが、GUIへの緊密な統合なしにすべてのショートカットをサポートすることはできません。現在、これについてはすでに青写真が公開されているので、これを提案してラウンチパッドの詳細を解決する他の開発者と連絡を取ろうとしています。今のところ...これは動作します。
エヴァンプライス

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の優れた最初の答え! おめでとうございます!
ファビー14年

変更内容を承認済みの回答に統合しました。
スティーブンオステルミラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.