그놈 키보드 단축키는 어디에 저장됩니까?


53

나는 다른 파티션의 마지막 버전을 백업으로 유지하면서 OS를 최신 상태로 유지하기 위해 모든 릴리스마다 새 버전을로드합니다. 또한 많은 사용자 정의 키 매핑을 사용합니다.

지금까지 시스템 전체에서 대부분의 구성을 전송하는 방법을 알아 냈지만 사용자 정의 키보드 단축키 매핑이 저장된 위치는 알 수 없습니다.

그놈이 어디에 넣었는지 아는 사람 있나요? 별도의 사용자 구성 (예 : ~ /) 및 시스템 구성 (예 : / etc) 파일이 있습니까?


2
설정을 어떻게 변경 했습니까? GConf 편집기를 사용하십니까? 나는 당신이 원 gconftool-2 --dump /apps/metacity하거나 그런 것을 추측하고 있습니다 .
Mikel

1
@Mikel이 의견에 감사드립니다. gconf-editor에서 알 수 있듯이 대부분의 키 바인딩은 / apps / metacity에 저장되고 나머지는 퍼져 있습니다. 현재 백업 / 복원 키 바인딩을 한 번의 클릭으로 가져 오기 위해 가져 오기 / 내보내기 파이썬 스크립트를 작성하고 있습니다.
Evan Plaice

답변:


45

이 질문에 대한 다른 답변이 작성된 후 우분투가 변경되었습니다.

키 바인딩이 gconf에서 dconf로 이동했습니다. GConf를 XML 파일에 데이터를 저장하고 액세스 한 gconf-editorgconf-tool2. Dconf 이진 포맷으로 데이터를 저장 및 액세스된다 dconf-editor하고 gsettings.

키 바인딩이 저장되는 장소 수가 줄어 듭니다. 이제 창 관리자 키 바인딩 ( org.gnome.desktop.wm.keybindings) 을 저장하기위한 중앙 집중식 dconf 경로가 있습니다 . 디렉토리 /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에 할당하고 키보드의 단일 버튼을 누르기 쉽도록 할당하고 싶습니다.

모든 키 바인딩을 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
우분투 그놈 제어 센터 키보드 단축키에 대해 두 가지 버그를 제기했습니다. 이 스크립트를 만드는 동안 찾았습니다. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...
스티븐 Ostermiller

1
@Stephen 스크립트에 감사드립니다. 우분투 13.10에서 시도해 보았습니다. 쉬운 공유를 위해 요점을 만들었습니다 : gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci

세부 사항을 기록하는 멋진 일과 좋은 일.
Evan Plaice

2
여전히 우분투 그놈 3.2에서 작동합니다-감사합니다!
klequis

1
나를 위해 기술적으로 "작동", 그러나 아마 우분투-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. 힘내 설정 파일을 잃어 버리지 않도록 추적하십시오. https://github.com/andsens/homeshick 은 내가 가장 좋아하는 방법입니다.

우분투 15.10에서 테스트되었습니다. 팁 : http://catern.com/2014/12/21/plain-text-configuration-gnome.html

그놈 터미널은 예측할 수없는 프로파일 ID 때문에 불행히도 이러한 편집에 저항력이 있습니다 : 18.04의 명령 행에서 그놈 터미널 프로파일 편집


15

키보드 단축키는 한곳에 저장되지 않습니다

배포판 버전에 따라 키보드 단축키 응용 프로그램은 GUI에서 다른 것으로 불릴 수 있지만 명령 줄에서는 'gnome-keybinding-properties'라고합니다. 이 깔끔한 작은 응용 프로그램은 모든 바로 가기를 사용자가 편집 할 수있는 편리한 장소로 가져옵니다.

우분투에는 키 바인딩에 대한 원 클릭 내보내기 / 가져 오기 도구가 없으므로 파이썬으로 작성했습니다.

다음은 스크립트에 대한 링크입니다

내보내기는 시스템에서 설정을 가져옵니다. 기본적으로 모든 키 바인딩 위치 목록이 스크립트의 사전에 하드 코딩되어 있습니다. 스크립트는 목록을 에뮬레이트하고 모든 키에 대해 "gconftool-2 --get [location]"명령을 실행하고 키와 함께 사전에 값을 저장합니다. 그런 다음 설정을 저장할 위치를 지정하면 사전이 파일에 json 형식으로 저장됩니다.

가져 오기 스크립트는이 프로세스를 반대로합니다. json 파일에서 사전을로드합니다. 그런 다음 이들을 열거하고 "gconftool-2 --type string --set [location] [value]"명령을 실행하여 저장된 모든 설정을 복원합니다.

한쪽 끝을 한 번에 촬영하면 다른 시스템 구성 설정을 건드리지 않고 모든 단일 키보드 단축키를 저장 / 복원합니다.

이 스크립트에 대한 유일한 종속성은 다음과 같습니다.

  • Python (2.6, 2.7 및 3.1에서 테스트 및 작업)
  • gconftool-2 (우분투 설치시 표준으로 제공)
  • zenity (Ubuntu 설치시 표준으로 제공됨)

Python은 스크립트를 실행하는 데 필요하고 gconftool-2는 설정을 가져 오거나 설정하는 데 사용되며 파일로드 / 저장 GUI 대화 상자에는 정력이 필요합니다.

Ubuntu Brainstorm에서 항목을 만들었으며이 기능을 'gnome-keybinding-properties'GUI 메뉴에 도입하는 작업을 진행하고 있습니다.

최신 정보:

가져 오기 및 내보내기 스크립트를 하나로 통합하고 전체 명령 행 기능 (--help info 포함)을 추가하고 python2x 및 python3k에 모두 호환되도록했습니다. 또한 우분투 브레인 스토밍 아이디어에 대한 링크를 추가했습니다.


브레인 스토밍은 우분투를 실제로 개선하기에 좋은 장소는 아닙니다. 실제로 10 가지 주요 이슈 만 개발자의 관심을 끌게됩니다. 런치 패드 페이지를 찾아 gnome-keybinding-properties스크립트와 함께 패치를 게시하는 것이 좋습니다 .
Oxwivi

스크립트는 gconftool-2 / gconf-editor에 나열 / 처리 된 단축키에 적합하며 그놈 키보드 단축키를 호출하는 항목에 따라 다릅니다.하지만 시스템 전체의 사용자 단축키를 선택하지 않습니다. 으로는 Keyboard Shortcuts예. gnome-keybinding-properties... 또는 예를 들어 추가 된 다른 키 바인딩 Xbindkeys... 그래서 나는 gconf '가 sysetem 전체 단축키가 "저장된"위치가 아니라 무언가 / 더 깊은 곳의 인터페이스라고 생각합니다 ... (I 그 곳을 찾고 있었어요 .. :). 아마도 지금은 3 개의 '내 보낸'목록을 유지해야 할 것입니다.
Peter.O

@ 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 폴백으로 다시 실행)에서 해당 디렉토리를 동일한 폴더에 복사하고 로그 아웃했다가 다시 로그인했습니다. 키 바인딩은 전환시 약간 엉망이되었습니다 (슈퍼 수정 자에게 재미있는 일이 발생했습니다). 그렇지 않으면 거기에있었습니다.


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

승인 된 답변에 변경 사항을 통합했습니다.
Stephen Ostermiller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.