Onde os atalhos de teclado do GNOME são armazenados?

46

Eu geralmente carrego uma nova versão para cada versão para manter meu SO atualizado enquanto preservo a última versão em outra partição como backup. Eu também uso muitos mapeamentos de teclas personalizados.

Eu descobri como transferir a maior parte da minha configuração entre sistemas até agora, mas não consigo descobrir onde os mapeamentos de atalhos de teclado personalizados estão armazenados.

Alguém sabe onde o gnome coloca isso? Existem arquivos separados de configuração do usuário (por exemplo, ~ /) e configuração do sistema (ou seja, / etc)?

    
por Evan Plaice 13.02.2011 / 01:07

5 respostas

38

O Ubuntu mudou desde que outras respostas a essa pergunta foram escritas.

Keybindings foram movidos do gconf para o dconf. O Gconf armazena seus dados em arquivos xml e foi acessado por gconf-editor e gconf-tool2 . O Dconf armazena seus dados em um formato binário e é acessado por dconf-editor e gsettings .

O número de locais em que as combinações de teclas são armazenadas é reduzido. Existe agora um caminho centralizado do dconf para armazenar atalhos de teclado do gerenciador de janelas ( org.gnome.desktop.wm.keybindings ). Há arquivos de mapeamento no diretório /usr/share/gnome-control-center/keybindings/ que mostram como eles são aplicados com base no gerenciador de janelas que você está usando (compiz ou metacity).

Um segundo conjunto de ligações de teclas não relacionadas ao gerenciador de janelas é armazenado no caminho do dconf org.gnome.settings-daemon.plugins.media-keys

Há um terceiro conjunto de atalhos de teclado relacionados aos botões de energia armazenados no caminho do dconf org.gnome.settings-daemon.plugins.power . Atualmente, há um bug na GUI que permite configurar atalhos de teclado. Não sabe sobre essas configurações. Eu tenho um botão "sleep" no meu teclado. Se eu quiser reatribuir a outra funcionalidade, tenho que desabilitar a configuração em org.gnome.settings-daemon.plugins.power manualmente. A GUI não faz isso por mim (embora atribua a nova funcionalidade muito bem).

A outra ruga é a combinação de teclas personalizadas. Estes são armazenados em dconf usando esquema relocável. É feito assim porque há um número arbitrário deles. Uma abordagem razoável, mas torna mais difícil listá-los ou modificá-los por meio da linha de comando do que deveria.

Eu também descobri que a interface gráfica que permite que você atribua atalhos de teclado é limitada de uma forma que me irrita. A GUI permite que exatamente uma tecla de atalho seja atribuída a cada ação. No dconf, você pode definir uma matriz de ligações para uma única ação. Isso é útil para mim. Por exemplo, eu gosto de ter a ação "close-window" atribuída ao traditonal Alt-F4, bem como a facilidade de apertar um botão no meu teclado.

Eu escrevi um script Perl para despejar todos os atalhos de teclado em um arquivo csv ou restaurá-los do arquivo csv. Por exemplo, para descarregar as combinações de teclas que você pode usar:

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

e para restaurá-los você pode usar:

./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) = (,,);
                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/^'(.*)'$//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);
}

Isso inclui a correção de user2589537 para permitir comandos personalizados com aspas nelas.

    
por Stephen Ostermiller 14.11.2012 / 23:00
15

Os atalhos de teclado não são armazenados em um único local

Dependendo da versão da sua distribuição, o aplicativo de atalhos de teclado pode ser chamado de coisas diferentes na GUI, mas na linha de comando ele deve ser chamado de 'gnome-keybinding-properties'. Acontece que esta pequena aplicação traz todos os atalhos em um lugar conveniente para os usuários editarem.

Como não existe uma ferramenta de importação / exportação de um clique para as combinações de teclas no Ubuntu, eu escrevi uma em python:

Aqui está um link para o script

Uma exportação puxa as configurações do sistema. Essencialmente, ele contém uma lista de todos os locais de atalhos de teclado que são codificados em um dicionário no script. O script emita a lista e executa o comando "gconftool-2 --get [location]" para cada chave e armazena o valor no dicionário juntamente com a chave. Então, quando você especifica o local para salvar as configurações, ele salva o dicionário no arquivo no formato json.

Um script de importação reverte esse processo. Ele carrega o dicionário do arquivo json. Em seguida, ele enumera por meio deles e executa o comando "gconftool-2 - string do tipo --set [location] [value]" para restaurar todas as configurações salvas.

Um tiro em cada extremidade e salva / restaura todos os atalhos de teclado sem tocar em nenhuma das outras configurações do sistema.

As únicas dependências para esses scripts são:

  • python (testado e funcionando em 2.6, 2.7 e 3.1)
  • gconftool-2 (vem de fábrica com uma instalação do Ubuntu)
  • zenity (vem de fábrica com uma instalação do Ubuntu)

O Python é necessário para executar o script, o gconftool-2 é usado para obter / definir as configurações, o zenity é necessário para os diálogos de GUI de carregamento / salvamento de arquivos.

Eu criei uma entrada no Ubuntu Brainstorm e estou fazendo progresso para que esse recurso seja introduzido no 'gnome- menu da GUI keybinding-properties.

Atualização:

Eu atualizei os scripts de importação e exportação em um, adicionei a funcionalidade completa da linha de comando (incluindo --help info) e fiz com que fosse compatível tanto para python2x quanto para python3k. Além disso, adicionou o link para a idéia do Ubuntu Brainstorm.

    
por Evan Plaice 16.02.2011 / 08:49
14

Como fazer backup das configurações do dconf, como atalhos de teclado

  1. Descarregue todos eles em um arquivo:

    dconf dump / >~/.config/dconf/user.conf
    
  2. Abra esse arquivo em um editor de texto e selecione as configurações que você gosta:

    editor ~/.config/dconf/user.conf
    

    Se você usar o Vim, desejará este destaque de sintaxe .

    Em breve, você se perguntará o que é <Primary> .

  3. Se você não sabe o nome da configuração, mas sabe como modificá-lo de uma GUI como unity-control-center , execute:

    dconf watch /
    

    e depois modifique-os. A configuração exata aparecerá no terminal.

  4. Quando você quiser restaurar essas configurações, execute:

    dconf load / <~/.config/dconf/user.conf
    
  5. Git rastreie o arquivo de configuração para nunca perdê-lo. O link é o meu método favorito atual.

Testado no Ubuntu 15.10. Dica adaptada de: link

    
3

No 11.10 executando o Gnome classic eu encontrei um conjunto de diretórios (Custom0, Custom1 ...) sob

$HOME/.gconf/desktop/gnome/keybindings

Copiei esses diretórios para a mesma pasta em uma instalação 12.04 limpa (novamente executando com fallback do Gnome), efetuei o logout e login novamente. As combinações de teclas ficaram um pouco confusas na transição (algo engraçado aconteceu com o modificador SUPER), mas de outra forma elas estavam lá.

    
por EntropyReduction 23.03.2013 / 21:32
2

Há um pequeno problema com a resposta aceita, pois ele não pode manipular comandos personalizados com aspas neles. Eu só mudei o processamento de comandos personalizados para gerar saída correta.

#!/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) = (,,);
                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/^'(.*)'$//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);
}
    
por Jordan Weitz 25.11.2014 / 23:33