Các phím tắt Gnome được lưu trữ ở đâu?


53

Tôi thường tải một phiên bản mới cho mỗi bản phát hành để giữ cho hệ điều hành của tôi luôn mới trong khi bảo quản phiên bản cuối cùng trên một phân vùng khác làm bản sao lưu. Tôi cũng sử dụng rất nhiều ánh xạ khóa tùy chỉnh.

Cho đến nay tôi đã tìm ra cách chuyển phần lớn cấu hình của mình qua các hệ thống nhưng tôi không thể tìm ra nơi ánh xạ phím tắt tùy chỉnh được lưu trữ.

Có ai biết gnome đặt những thứ này ở đâu không? Có các tệp cấu hình người dùng (ví dụ: ~ /) và cấu hình hệ thống (tức là / etc) không?


2
Làm thế nào bạn thay đổi các cài đặt? Sử dụng trình soạn thảo GConf? Tôi đoán bạn muốn gconftool-2 --dump /apps/metacityhoặc một cái gì đó như thế.
Mikel

1
@Mikel Cảm ơn rất nhiều cho nhận xét đó. Từ những gì tôi có thể nói trong trình soạn thảo gconf, hầu hết các tổ hợp phím được lưu trữ dưới / apps / metacity trong khi phần còn lại được trải rộng xung quanh. Tôi hiện đang viết các tập lệnh python Nhập / Xuất để tạo các bản sao lưu / khôi phục các thao tác bàn phím chỉ bằng một cú nhấp chuột.
Evan Plaice

Câu trả lời:


45

Ubuntu đã thay đổi kể từ khi câu trả lời khác cho câu hỏi này được viết.

Keybindings đã chuyển từ gconf sang dconf. Gconf lưu trữ dữ liệu của mình trong các tệp xml và được truy cập bởi gconf-editorgconf-tool2. Dconf lưu trữ dữ liệu của nó ở định dạng nhị phân và được truy cập bởi dconf-editorgsettings.

Số lượng vị trí mà keybindings được lưu trữ bị giảm. Hiện tại có một đường dẫn drc tập trung để lưu trữ keybindings của trình quản lý cửa sổ ( org.gnome.desktop.wm.keybindings). Có các tệp ánh xạ trong thư mục /usr/share/gnome-control-center/keybindings/cho biết cách chúng được áp dụng dựa trên trình quản lý cửa sổ mà bạn thực sự đang sử dụng (compiz hoặc metacity).

Một tập hợp các ràng buộc khóa không liên quan đến trình quản lý cửa sổ thứ hai được lưu trữ trong đường dẫn dconf org.gnome.settings-daemon.plugins.media-keys

Có một bộ khóa phím thứ ba liên quan đến các nút nguồn được lưu trữ trong đường dẫn dconf org.gnome.settings-daemon.plugins.power. Hiện tại có một lỗi trong GUI cho phép bạn định cấu hình các phím. Nó không biết về các cài đặt này. Tôi có nút "ngủ" trên bàn phím. Nếu tôi muốn gán lại nó cho chức năng khác, tôi phải tắt cài đặt org.gnome.settings-daemon.plugins.powertheo cách thủ công. GUI không làm điều đó cho tôi (mặc dù nó chỉ gán chức năng mới tốt).

Các nếp nhăn khác là ràng buộc quan trọng tùy chỉnh. Chúng được lưu trữ trong dconf bằng cách sử dụng lược đồ có thể định vị lại. Nó được thực hiện theo cách này bởi vì có một số lượng tùy ý của họ. Một cách tiếp cận hợp lý, nhưng nó làm cho việc liệt kê hoặc sửa đổi chúng thông qua dòng lệnh khó hơn mức cần thiết.

Tôi cũng phát hiện ra rằng GUI cho phép bạn gán keybindings bị hạn chế theo cách làm tôi khó chịu. GUI cho phép chính xác MỘT liên kết phím được gán cho mỗi hành động. Trong dconf, bạn có thể đặt một mảng các ràng buộc cho một hành động. Điều này hữu ích với tôi. Ví dụ: tôi muốn có hành động "đóng cửa sổ" được gán cho Alt-F4 truyền thống cũng như để nhấn một nút dễ dàng hơn trên bàn phím của tôi.

Tôi đã viết một tập lệnh Perl để kết xuất tất cả các keybindings vào tệp csv hoặc khôi phục chúng từ tệp csv. Ví dụ để kết xuất các phím bấm bạn có thể sử dụng:

./keybindings.pl -e /tmp/keys.csv

và để khôi phục chúng, bạn có thể sử dụng:

./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);
}

Điều này bao gồm sửa lỗi bởi user2589537 để cho phép các lệnh tùy chỉnh có dấu ngoặc kép trong đó.


2
Tôi đã nộp hai lỗi đối với các phím tắt trên bàn phím trung tâm điều khiển của Ubuntu. Tôi tìm thấy chúng trong khi tạo kịch bản này. bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/...
Stephen Ostermiller

1
Cảm ơn kịch bản @Stephen, vừa thử trên Ubuntu 13.10 và nó đã hoạt động! Tạo một ý chính để chia sẻ dễ dàng: gist.github.com/elgalu/8511861#file-keybindings-pl
Leo Gallucci

Công việc tuyệt vời và tài liệu công việc tốt các chi tiết cụ thể.
Evan Plaice

2
Vẫn hoạt động trên Ubuntu Gnome 3.2 - Cảm ơn bạn!
klequis

1
"hoạt động" về mặt kỹ thuật đối với tôi, nhưng có lẽ sẽ cần phải xem phần dconf khác nhau cho Ubuntu-MATE (ví dụ [org/mate/marco/global-keybindings], [org/mate/marco/window-keybindings]...)
Frank Nocke

17

Làm cách nào để sao lưu các cài đặt drc như phím tắt

  1. Kết xuất tất cả chúng vào một tệp:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Mở tệp đó trên trình soạn thảo văn bản và chọn cài đặt mà bạn quan tâm:

    editor ~/.config/dconf/user.conf
    

    Nếu bạn sử dụng Vim, bạn sẽ muốn cú pháp này nổi bật .

    Bạn sẽ sớm tự hỏi mình là gì<Primary> .

  3. Nếu bạn không biết tên của cài đặt, nhưng biết cách sửa đổi nó từ GUI như thế nào unity-control-center, hãy chạy:

    dconf watch /
    

    và sau đó sửa đổi chúng. Cài đặt chính xác sau đó sẽ xuất hiện trên thiết bị đầu cuối.

  4. Khi bạn muốn khôi phục các cài đặt đó, hãy chạy:

    dconf load / <~/.config/dconf/user.conf
    
  5. Git theo dõi tập tin cấu hình để không bao giờ mất nó. https://github.com/andsens/homeshick là phương pháp yêu thích hiện tại của tôi.

Đã thử nghiệm trên Ubuntu 15.10. Mẹo được điều chỉnh từ: http : // c Parent.com/2014/12/21/plain-text-configuration-gnome.html

Thiết bị đầu cuối Gnome không may chống lại các chỉnh sửa như vậy vì ID hồ sơ không thể đoán trước: Chỉnh sửa cấu hình Gnome-Terminal từ dòng lệnh vào ngày 18.04


15

Các phím tắt không được lưu trữ ở bất kỳ một nơi nào

Tùy thuộc vào phiên bản phân phối của bạn, ứng dụng phím tắt có thể được gọi là những thứ khác nhau trong GUI nhưng trên dòng lệnh, nó phải được gọi là 'gnome-keybinding-property'. Hóa ra ứng dụng nhỏ gọn này mang tất cả các phím tắt vào một nơi thuận tiện để người dùng chỉnh sửa.

Vì không có công cụ xuất / nhập một lần nhấp nào cho các tổ hợp phím trong Ubuntu, tôi đã viết một công cụ bằng python:

Đây là một liên kết đến kịch bản

Xuất khẩu kéo các cài đặt từ hệ thống. Về cơ bản, nó chứa một danh sách tất cả các vị trí gắn phím được mã hóa cứng vào một từ điển trong tập lệnh. Kịch bản liệt kê danh sách và chạy lệnh "gconftool-2 --get [location]" cho mọi khóa và lưu giá trị trong từ điển cùng với khóa. Sau đó, khi bạn chỉ định vị trí để lưu cài đặt, nó sẽ lưu từ điển vào tệp ở định dạng json.

Một kịch bản nhập khẩu đảo ngược quá trình này. Nó tải từ điển từ tập tin json. Sau đó, nó liệt kê thông qua những điều này và chạy lệnh "gconftool-2 --type chuỗi --set [location] [value]" để khôi phục tất cả các cài đặt đã lưu.

Một lần chụp ở hai đầu và nó lưu / khôi phục mọi phím tắt đơn mà không chạm vào bất kỳ cài đặt cấu hình hệ thống nào khác.

Các phụ thuộc duy nhất cho các tập lệnh này là:

  • python (đã thử nghiệm và làm việc trong 2.6, 2.7 và 3.1)
  • gconftool-2 (đi kèm tiêu chuẩn với bản cài đặt Ubuntu)
  • zenity (đi kèm tiêu chuẩn với cài đặt Ubuntu)

Python là cần thiết để thực thi tập lệnh, gconftool-2 được sử dụng để nhận / thiết lập các cài đặt, cần thiết cho các hộp thoại tải / lưu gui.

Tôi đã tạo một mục trên Ubuntu Brainstorm và đang đạt được tiến bộ về việc đưa tính năng này vào menu GUI 'gnome-keybinding-property'.

Cập nhật:

Tôi đã cập nhật kết hợp các tập lệnh nhập và xuất thành một, thêm chức năng dòng lệnh đầy đủ (bao gồm thông tin --help) và làm cho nó tương thích với cả python2x và python3k. Ngoài ra, đã thêm liên kết đến ý tưởng Ubuntu Brainstorm.


Brainstorm hầu như không phải là nơi tốt để cải tiến thực tế Ubuntu - chỉ 10 vấn đề hàng đầu mới thực sự được nhà phát triển chú ý. Tôi khuyên bạn nên tìm trang Launchpad gnome-keybinding-propertiesvà đăng một bản vá với tập lệnh của bạn.
Oxwivi

Kịch bản của bạn phù hợp với các phím tắt được liệt kê trong / xử lý bởi gconftool-2 / gconf-Editor ... và tôi cho rằng nó phụ thuộc vào những gì người ta gọi là phím tắt Gnome ... nhưng nó không chọn các phím tắt người dùng trên toàn hệ thống được thêm vào bởi Keyboard Shortcutsnghĩa. gnome-keybinding-properties... cũng như các khóa khác được thêm vào, chẳng hạn Xbindkeys... vì vậy tôi nghi ngờ rằng gconf 'không phải là nơi các phím tắt trên toàn hệ thống mà chúng được "lưu trữ", mà đó là giao diện cho một cái gì đó / ở đâu đó sâu hơn ... (Tôi Tôi đã tìm kiếm nơi đó .. :). có lẽ tôi chỉ cần giữ 3 danh sách 'xuất' bây giờ ...
Peter.O

@ fred.bear Tôi khá chắc chắn rằng tất cả chúng đều được lưu trữ trong gconf nhưng tôi thấy rằng các tổ hợp phím mới được thêm vào thuộc tính gnome-keybinding khi bạn thay đổi từ mặc định trong bảng điều khiển. Kịch bản hiện tại sẽ thực hiện các phím tắt mặc định được tìm thấy trong GUI nhưng nó sẽ không thể hỗ trợ tất cả các phím tắt mà không tích hợp chặt chẽ hơn vào GUI. Hiện tại đã có một kế hoạch chi tiết mở cho việc này vì vậy tôi đang cố gắng liên lạc với nhà phát triển khác, người đã đề xuất việc này để tìm ra các chi tiết trên launchpad. Bây giờ ... điều này hoạt động.
Evan Plaice

3

Trong 11.10 đang chạy Gnome classic, tôi đã tìm thấy một tập hợp các thư mục (Custom0, Custom1 ...) bên dưới

$HOME/.gconf/desktop/gnome/keybindings

Tôi đã sao chép các thư mục đó vào cùng một thư mục trong bản cài đặt 12.04 sạch (một lần nữa chạy với dự phòng Gnome), đăng xuất và đăng nhập lại. Các keybindings đã bị rối một chút trong quá trình chuyển đổi (điều gì đó buồn cười đã xảy ra với công cụ sửa đổi SUPER) nhưng nếu không thì chúng đã ở đó.


2

Có một vấn đề nhỏ với câu trả lời được chấp nhận, trong đó nó không thể xử lý các lệnh tùy chỉnh với dấu ngoặc kép trong đó. Tôi chỉ thay đổi việc xử lý các lệnh tùy chỉnh để tạo đầu ra chính xác.

#!/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);
}

Câu trả lời đầu tiên tuyệt vời trên AskUbfox! Chúc mừng!
Fabby

Tôi đã tích hợp các thay đổi của bạn vào câu trả lời được chấp nhận.
Stephen Ostermiller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.