Terminalden özel klavye kısayolları nasıl ayarlanır?


56

Farklı Linux sürümleri için terminalden özel klavye kısayolları nasıl ayarlanır?

Temel olarak Linux'un klavye kısayol dosyalarını nerede sakladığını ve nasıl düzenlenebileceğini bilmek istiyorum.

Araştırmamda bir dosya buldum ~/.config/compiz-1/compizconfigama açmaya çalıştığımda daha fazla ya da şifreli gibiydi nano.


Dikkat, XFCE / Xubuntu sistemleri zaten burada bir cevabı var
Ulad Kasach

Yanıtlar:


62

Kısayol tuş bağlamalarını komut satırından iki adımda ekleme (14.04+)

Komut satırından özel kısayollar eklenebilir, ancak biraz karmaşıktır; Her bir tuşa basma işleminde birkaç adımda yapılması gerekir. Öte yandan, bu ise oldukça basit ve bir şekilde komut satırında (bu doğru, soruydu?) Onu yapmak istiyorsanız çok iyi komut dosyası olabilir.

Arayüzünüzde olduğu gibi (Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar"), Özel klavye kısayolları komut satırından iki adımda yapılır:

  1. Komutun döndürdüğü listeyi düzenleyerek (ekleyerek) keybinding oluşturun:

    gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings
    

    Döndürülen liste şuna benziyor (şu anda yalnızca bir kısayol olsaydı):

    ['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/']
    

    Düzenlenen listeyi komutla uygulayın:

    gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "[<altered_list>]"
    

    (çift tırnak aklınızda olsun)

    Not : Listedeki (örn custom1. custom2) İfadenin benzersiz olması gerektiğini söylemeye gerek yoktur . Komut dosyasını kopyalarsanız, komut dosyası kopyaları engellemelidir. Bu durumda, düzenlenen liste örneğin;

    ['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/']
    

    bir anahtarlık eklemek için: custom1

  2. özelliklerini ayarla:

    • isim:

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ name '<newname>'
      
    • komut:

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
      
    • Tuş kombinasyonu (örneğin <Primary><Alt>g):

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ binding '<key_combination>'
      

Yararlı bilgiler burada bulunabilir

Yeni bir özel kısayol ayarlamak için örnek komut dosyası

Aşağıdaki komut dosyası, komut satırından yeni bir kısayol tuşu birleşimi ayarlamak için kullanılabilir. Komutla kullanılabilir (tuş kombinasyonunun mevcut olduğu varsayılarak):

python3 /path/to/script.py '<name>' '<command>' '<key_combination>'

Bir örnek:

Kısayol gedittuşu birleşimini Alt+ tuş birleşimi ile açılacak şekilde ayarlamak için 7:

python3 /path/to/script.py 'open gedit' 'gedit' '<Alt>7'

Senaryo:

#!/usr/bin/env python3
import subprocess
import sys

# defining keys & strings to be used
key = "org.gnome.settings-daemon.plugins.media-keys custom-keybindings"
subkey1 = key.replace(" ", ".")[:-1]+":"
item_s = "/"+key.replace(" ", "/").replace(".", "/")+"/"
firstname = "custom"
# get the current list of custom shortcuts
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
array_str = get("gsettings get "+key)
# in case the array was empty, remove the annotation hints
command_result = array_str.lstrip("@as")
current = eval(command_result)
# make sure the additional keybinding mention is no duplicate
n = 1
while True:
    new = item_s+firstname+str(n)+"/"
    if new in current:
        n = n+1
    else:
        break
# add the new keybinding to the list
current.append(new)
# create the shortcut, set the name, command and shortcut key
cmd0 = 'gsettings set '+key+' "'+str(current)+'"'
cmd1 = 'gsettings set '+subkey1+new+" name '"+sys.argv[1]+"'"
cmd2 = 'gsettings set '+subkey1+new+" command '"+sys.argv[2]+"'"
cmd3 = 'gsettings set '+subkey1+new+" binding '"+sys.argv[3]+"'"

for cmd in [cmd0, cmd1, cmd2, cmd3]:
    subprocess.call(["/bin/bash", "-c", cmd])

Nasıl kullanılır:

Komut dosyasını boş bir dosyaya yapıştırın, kaydedin set_customshortcut.py, yukarıda açıklandığı şekilde çalıştırın.

En çok kullanılan anahtar kelimelerden bazıları (deneysel olarak bulunan, bağlanma değerinde yapılan GUI yolundaki değişikliklere bakarak):

Super key:                 <Super>
Control key:               <Primary> or <Control>
Alt key:                   <Alt>
Shift key:                 <Shift>
numbers:                   1 (just the number)
Spacebar:                  space
Slash key:                 slash
Asterisk key:              asterisk (so it would need `<Shift>` as well)
Ampersand key:             ampersand (so it would need <Shift> as well)

a few numpad keys:
Numpad divide key (`/`):   KP_Divide
Numpad multiply (Asterisk):KP_Multiply
Numpad number key(s):      KP_1
Numpad `-`:                KP_Subtract

vb.


5
Mükemmel cevap O senaryo için 100 düğme yükseltme lazım. ;)
Anandu M Das

@JocobVlijm Lütfen Key kombinasyonunda biraz açıklama yapabilir misiniz ? Bu <primary> etiketi ne anlama geliyor? Ve g harfi yerine, düşündüğüm herhangi bir harfi değiştirebilirim, değil mi?
Anonim Platypus

1
@VladK ai, xubuntu, xubuntu kısayollarının (hala) bir xml dosyasında ayarlanmış olması olabilir. Bakmam gerekecek. Öyleyse, xubuntu'ya özel olarak etiketlenen sorunuzu yeniden açmamız gerekiyor.
Jacob Vlijm

1
Teşekkürler, @JacobVlijm, Denedim. Ve sadece fikrimin bir hata olduğunu öğrendim. Burada bazı gerçekten zor var. custom-keybindingBir şemanın içindeyken sonunda "s" içermemelidir. Ancak, anahtar olarak veya yolda hareket ederken "s" içermelidir. Aksi takdirde, "set" komutu istisna atar. Bu nedenle, lütfen custom-keybindingşemadaki "s" yi kaldırın . Ayrıca, python betiğin de güncellenmeli.
e-cloud

2
Bilginize, Python betiğinizde bir hata var. Yüklü klavye kısayolu yoksa, değerlendirme yapmayan gsettingsdöndürür @as [].
Seanny123

11

Bunu yapmanın basit bir yolu var dconf:

dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/command "'move-window.sh'"
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding "'<Primary><Alt>Page_Down'"
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/name "'move-window'"

Kullanarak gsettings:

gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ name "'move-window'"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ binding "'<Primary><Alt>Page_Down'"
gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/ command "'/usr/local/bin/move-window.sh'"

Daha custom0fazla cilt eklemek için bölümdeki sayıyı artırmanız gerekir , örn. custom1, custom2Vb

Kalıcı yapmak için, sadece .bash_profilegiriş kabukları tarafından çalıştırılan benzer bir betiğe ekleyin . Sadece oturum açma kabukları için yapmayın .bashrcçünkü deneyimlerime göre bunlar dconfve bunları gsettingsyavaşlatıyor. Değiştirme / 30 ciltleme bir saniye sürer! Bunu giriş yapmayan kabukta ( .bashrc) istemiyorsunuz !


1
Her ikisi de 18.04 Ubuntu'da başarısız oldu. @Jocob Vlijm'in cevabını ve bu topluluk wiki'sini takip ederek custom0, örneğin ile gibi özel kısayol listesine eklemeniz gerekir gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". Bilmiyorum dconf.
miguelmorin

Ayrıca dconf dump DIRetmek Stdout'a bütün bir alt yolunu boşalt. Çıktı, GVariant sözdizimindeki değerlerle birlikte anahtar dosya biçiminde.
Pablo A,

10

Tüm özel klavye kısayolları ayarları dconf veritabanında saklanır.

Bunlara kolayca erişebilirsiniz dconf-editor:

sudo apt-get install dconf-editor

Ardından düzenleyicide aşağıdaki dconf yoluna gidin:

/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/

görüntü tanımını buraya girin


Konum tüm Linux sürümleri için aynı mı? Veya en az Ubuntu'nun tüm sürümlerini mi?
Anonim Platypus

1
@AnonymousPlatypus: 14.04'ten bu yana ayarların yeri burası (diğer dağıtım için söyleyemem)
Sylvain Pineau

2
Bu grafiksel bir yöntemdir ve terminalden değil
Anandu M Das

1
Medya tuşları anahtarımda özel bir anahtarlıklar alt anahtarı yoksa ne yapmalıyım?
Brandon Kuczenski

Soru GUI ile değil terminalle ilgiliydi, bu yüzden cevap ilgisiz
Alexei Martianov

6

12.04'te komut satırından kısayol tuşları ekleme

Kabul edilen yanıtın çok kapsamlı olmasını önlemek için, 12.04 için ayrı bir çözüm gönderin.

12.04'e kadar (ve dahil), özel anahtarlıklar dconfveritabanında değil, ~/.gconf/desktop/gnome/keybindings(xml dosyasında, custom0vb. Gibi alt klasörlerde ) depolanır .

Aşağıdaki komut xmldosyası otomatik olarak doğru şekilde adlandırılan dosya ve dosya oluşturma klasörünü oluşturur .

Nasıl kullanılır

  1. Komut dosyasını boş bir dosyaya yapıştırın, olarak kaydedin. set_customshortcuts_12.py
  2. Komutu ile çalıştırın:

    python /path/to/set_customshortcuts_12.py <name> <command> <key1> <key2> <key3>
    

    key3 isteğe bağlıdır, komutlar örneğin olabilir:

    python /path/to/set_customshortcuts_12.py run_browser firefox Primary 7 
    

    veya

    python /path/to/set_customshortcuts_12.py run_texteditor gedit Primary Alt 3 
    

notlar

  • Anahtarların adının, ayarların düzenlenmesinden farklı olduğunu unutmayın. Anahtarlar, gördüğüm kadarıyla Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar" da gösterdikleri gibi adlandırılır.
  • Komut dosyasını 12.04'te VirtualBox altında test ettim; değişikliklerin gerçekleşmesi için oturumu kapatıp / kapatması gerekiyordu.
#!/usr/bin/env python
import os
import sys

home = os.environ["HOME"]
name = sys.argv[1]
command = sys.argv[2]
keys = sys.argv[3:]

keyfile = [
    '<?xml version="1.0"?>',
    '<gconf>',
    '\t<entry name="action" mtime="1427791732" type="string">',
    '\t\t<stringvalue>'+command+'</stringvalue>',
    '\t</entry>',
    '\t<entry name="name" mtime="1427791732" type="string">',
    '\t\t<stringvalue>'+name+'</stringvalue>',
    '\t</entry>',
    '\t<entry name="binding" mtime="1427791736" type="string">',
    '\t</entry>',
    '</gconf>',
    ]

if len(keys) == 2:
    keyfile.insert(9, '\t\t<stringvalue>&lt;'+keys[0]+'&gt;'+keys[1]+'</stringvalue>')
else:
    keyfile.insert(9, '\t\t<stringvalue>&lt;'+keys[0]+'&gt;&lt;'+keys[1]+'&gt;'+keys[2]+'</stringvalue>')

n = 0
while True:
    check = home+"/"+".gconf/desktop/gnome/keybindings/custom"+str(n)
    if os.path.exists(check):
        n = n+1
    else:
        newdir = check
        newfile = check+"/"+"%gconf.xml"
        break

os.makedirs(newdir)
with open(newfile, "wt") as shortcut:
    for l in keyfile:
        shortcut.write(l+"\n")

1

Sed kullanarak bir python betiği olmadan yeni bir özel kısayol ayarlayabilirsiniz. Sadece ayarlamak zorunda adını , bağlama ve harekete aşağıdaki komut seçtiğiniz için:

name="myaction"
binding="<CTRL><ALT>v"
action="/usr/local/bin/myaction"

media_keys=org.gnome.settings-daemon.plugins.media-keys
custom_kbd=org.gnome.settings-daemon.plugins.media-keys.custom-keybinding
kbd_path=/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/$name/
new_bindings=`gsettings get $media_keys custom-keybindings | sed -e"s>'\]>','$kbd_path']>"| sed -e"s>@as \[\]>['$kbd_path']>"`
gsettings set $media_keys custom-keybindings "$new_bindings"
gsettings set $custom_kbd:$kbd_path name $name
gsettings set $custom_kbd:$kbd_path binding $binding
gsettings set $custom_kbd:$kbd_path command $action

1

Bunun için bir senaryo yazdı. Aşağıya bakınız.

Kullanımdaki kullanıma bakın creatShortcut.

export nextShortcutId=0
function creatShortcut() {
    name="$1"
    commandToRun="$2"
    binding="$3"
    path="/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${nextShortcutId}"
    nextShortcutId=$nextShortcutId+1
    dconf write "$path/name" "'""$name""'"
    dconf write "$path/command" "'""$commandToRun""'"
    dconf write "$path/binding" "'""$binding""'"
}

# dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/binding '"<Primary><Shift>exclam"'
creatShortcut 'copyq show' 'copyq show' '<Primary><Shift>exclam'
creatShortcut 'System Monitor' 'gnome-system-monitor' '<Primary><Alt>m'
creatShortcut 'Suspend' 'systemctl suspend -i' '<Super>d'
creatShortcut 'Volume Up' 'amixer -D pulse sset Master 5%+' '<Super>Page_Up'
creatShortcut 'Volume Down' 'amixer -D pulse sset Master 5%-' '<Super>Page_Down'

overallbindings=""
for ((i = 0 ; i < $nextShortcutId ; i++ ));
do
    overallbindings="$overallbindings, '$customindingPathPrefix$i/'"
done
overallbindings="[${overallbindings:2}]" # Delete the first 2 chars: " ," - space and comma
# echo $overallbindings

# Update the list of bindings for the shortcuts to work
dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings "$overallbindings"
# dconf write /org/gnome/settings-daemon/plugins/media-keys/custom-keybindings "['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom2/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom3/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom4/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom5/']"

NextShortcutId, eski anahtarlar zaten varsa (zaten başka programlar tarafından oluşturulmuş) çakışma olmadığından emin olmak için otomatik olarak algılayabilirse mükemmel olurdu. Ayrıca, girilen tuşlara başka bir şey bağlı olup olmadığını kontrol edin.
Jack Giffin

0

Cevabı buldum çok faydalı @JacobVlijm, özellikle komut dosyası tarafından yayınlanmıştır. Kodu taşıdım bash. Bu işlev mükemmel değil, bazı hatalar içerebilir, ancak benim için çalışıyor.

function set_shortcuts(){
    # Usage: set_shortcuts [name] [command] [shortcut]
    unset num i name command shortcut value test value_new
    local name="$1"
    local command="$2"
    local shortcut="$3"
    local value=$(gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings)
    local test=$(echo $value | sed "s/\['//;s/', '/,/g;s/'\]//" - | tr ',' '\n' | grep -oP ".*/custom\K[0-9]*(?=/$)")

    if [ "$(echo "$value" | grep -o "@as")" = "@as" ]; then
        local num=0
        local value_new="['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/']"
    else
        local i=1
        until [ "$num" != "" ]; do
            if [ "$(echo $test | grep -o $i)" != "$i" ]; then
                local num=$i
            fi
            i=$(echo 1+$i | bc);
        done
        local value_new=$(gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings | sed "s#']\$#', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/']#" -)
    fi

    gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "$value_new"
    gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ name "$name"
    gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ command "$command"
    gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom${num}/ binding "$shortcut"
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.