ذخیره و بازآوری شورت کات های کیبورد

امین 16 سپتامبر 2023 زمان خواندن: 5 دقیقه

توجه: این مطلب قدیمی است و صرفا جهت آرشیو حفظ شده است. ممکن است امروزه برخی موارد یکسان نباشند.

اگر مثل من علاقه مند به تغییر کیبورد شورتکات های پیشفرض در دسکتاپ گنوم داشته باشید، یا خیلی شورتکات های جدید خودتون ایجاد کرده باشید، خیلی سخته که این همه تنظیمات رو بصورت حتی اتفاقی از دست بدید. شاید مجبور شده باشید سیستم جدیدی نصب کنید، اونوقت تک تک این شورتکات ها رو باید دوباره تنظیم کنید.

اما نه! لازم به این کار نیست. با یک اسکریپت perl به راحتی میتونید از شورتکات های گنوم بکاپ بگیرید و در مواقع لزوم همه اونها رو به یکباره برگردونید. منبع این اسکریپت در اینجاست. اما محض احتیاط اگر لینک منبع از بین رفت، اسکریپت رو در ادامه مطلب میذارم. روش کار هم به این شکل هست که این اسکریپت رو در یک فایل با اسم دلخواه و پسوند pl ذخیره میکنید. مثلا keybindigs.pl و بعد اون رو مشابه دستور زیر اجرا میکنید:

برای گرفتن بکاپ:

/path/to/keybindigs.pl -e ~/keybindings

و برای بازگردوندن بکاپ:

/path/to/keybindigs.pl -i ~/keybindings

فایلی به نام keybindings در فولدر home کاربریتون ایجاد میشه که حاوی این تنظیمات هست.

این اسکریپت در گنوم ۳.۲۰.۲ تست شده.  

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

اولین نفری باشید که دیدگاهی ارسال می کند!




حاصل سر و کله زدن های من با لینوکس