Bagaimana cara mengatur pintasan keyboard khusus dari terminal?


56

Bagaimana cara mengatur pintasan keyboard khusus dari terminal untuk berbagai versi Linux?

Pada dasarnya saya ingin tahu di mana Linux menyimpan file cara pintas keyboard dan bagaimana itu bisa diedit.

Pada penelitian saya, saya menemukan file ~/.config/compiz-1/compizconfigtetapi lebih atau seperti dienkripsi ketika saya mencoba membukanya nano.


Catatan, sistem XFCE / Xubuntu sudah memiliki jawaban di sini
Ulad Kasach

Jawaban:


62

Menambahkan keybindings pintas dalam dua langkah dari baris perintah (14.04+)

Menambahkan pintasan khusus dari baris perintah dapat dilakukan, tetapi agak rumit; itu perlu dilakukan dalam beberapa langkah per keybinding. Di sisi lain, itu adalah cukup sederhana dan dapat sangat baik scripted jika Anda entah bagaimana ingin melakukannya dari baris perintah (yang adalah pertanyaan, kan?).

Sama seperti di antarmuka Anda (Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Khusus"), pintasan keyboard khusus dibuat dari baris perintah dalam dua langkah:

  1. buat keybinding dengan mengedit (menambahkan ke-) daftar yang dikembalikan oleh perintah:

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

    Daftar yang dikembalikan terlihat seperti (jika saat ini hanya satu pintasan):

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

    Terapkan daftar yang diedit dengan perintah:

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

    (keberatan kutip ganda)

    NB Tidak perlu mengatakan bahwa penyebutan dalam daftar (misalnya custom1, custom2) harus unik. Jika Anda skrip, skrip harus mencegah duplikat. Dalam hal ini daftar yang diedit akan terlihat seperti misalnya:

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

    untuk menambahkan satu keybinding: custom1

  2. atur propertinya:

    • nama:

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

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
      
    • Kombinasi tombol (misalnya <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>'
      

Informasi yang berguna dapat ditemukan di sini

Contoh skrip untuk menetapkan pintasan khusus baru

Script di bawah ini dapat digunakan untuk mengatur kombinasi tombol jalan pintas baru dari baris perintah. Ini dapat digunakan dengan perintah (dengan asumsi kombinasi tombol tersedia):

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

Sebuah contoh:

Untuk mengatur kombinasi tombol cara pintas agar terbuka geditdengan kombinasi tombol Alt+ 7:

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

Naskah:

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

Cara Penggunaan:

Rekatkan skrip ke file kosong, simpan sebagai set_customshortcut.py, jalankan seperti dijelaskan di atas.

Beberapa kunci kunci yang paling banyak digunakan (ditemukan secara eksperimental, melihat ke dalam perubahan cara GUI dibuat menjadi nilai yang mengikat):

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

dll.


5
Jawaban yang sangat bagus. Saya perlu 100 tombol upvotes untuk skrip itu. ;)
Anandu M Das

@ JacobVlijm Bisakah Anda jelaskan sedikit pada bagian Kombinasi kunci ? Apa yang ditunjukkan oleh tag <primary>? Dan alih-alih huruf g saya dapat mengganti huruf apa pun yang saya pikir, ryt?
Anonymous Platypus

1
@VladK ai, xubuntu, bisa jadi pintasan xubuntu (masih) diset dalam file xml. Saya harus melihat. Jika demikian, kami perlu membuka kembali pertanyaan Anda, yang ditandai sebagai spesifik xubuntu.
Jacob Vlijm

1
Terima kasih, @JacobVlijm, saya sudah mencobanya. Dan saya baru tahu bahwa perbaikan saya adalah kesalahan. Ada beberapa yang sangat sulit di sini. custom-keybindingseharusnya tidak mengandung "s" di akhir ketika di dalam skema. Tapi, itu harus mengandung "s" ketika bertindak sebagai kunci atau di jalur. Jika tidak, perintah "set" akan melempar pengecualian. Jadi, harap hapus "s" custom-keybindingdalam skema. Selain itu, skrip python Anda juga harus diperbarui.
e-cloud

2
FYI, skrip Python Anda memiliki bug di dalamnya. Jika tidak ada pintasan keyboard yang terpasang, gsettingskembalikan @as []yang tidak mengevaluasi.
Seanny123

11

Jelas ada cara sederhana untuk melakukan itu menggunakan 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'"

Menggunakan 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'"

Anda perlu menambah angka di custom0bagian untuk menambahkan lebih banyak binding, yaitu. custom1,, custom2dll.

Untuk membuatnya permanen, tambahkan saja ke .bash_profileatau skrip serupa yang dijalankan oleh shell login. Hanya saja, jangan lakukan itu untuk shell non-login .bashrckarena dari pengalaman saya dconfdan gsettingsmemperlambatnya secara signifikan. Mengubah / Menambahkan 30 binding membutuhkan waktu sebentar! Anda tidak ingin ini di shell non-login ( .bashrc)!


1
Keduanya gagal di Ubuntu 18.04. Mengikuti jawaban @Jacob Vlijm dan wiki komunitas ini , Anda perlu menambahkan custom0ke daftar pintasan khusus, misalnya dengan gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". Saya tidak tahu dconf.
miguelmorin

Juga dconf dump DIRuntuk Dump seluruh jalan setapak ke stdout. Outputnya dalam format keyfile-like, dengan nilai-nilai dalam sintaks GVariant.
Pablo A

10

Semua pengaturan pintasan keyboard khusus disimpan dalam basis data dconf.

Anda dapat dengan mudah mengaksesnya dengan dconf-editor:

sudo apt-get install dconf-editor

Lalu pergi ke path dconf berikut di editor:

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

masukkan deskripsi gambar di sini


Apakah lokasinya sama untuk semua versi Linux? Atau setidaknya semua versi Ubuntu?
Anonim Platypus

1
@AnonymousPlatypus: ini adalah lokasi pengaturan sejak 14.04 (saya tidak tahu untuk distro lain)
Sylvain Pineau

2
Ini adalah metode grafis, dan bukan dari terminal
Anandu M Das

1
Apa yang harus saya lakukan jika kunci tombol media saya tidak memiliki subkunci ikatan kunci kustom?
Brandon Kuczenski

Pertanyaannya adalah tentang terminal, bukan GUI, jadi jawabannya tidak relevan
Alexei Martianov

6

Menambahkan keybindings pintas dari baris perintah di 12.04

Untuk mencegah jawaban yang diterima menjadi terlalu luas, memposting solusi terpisah untuk 12,04.

Sampai (dan termasuk) 12.04, keybindings khusus tidak disimpan dalam dconfdatabase, tetapi di ~/.gconf/desktop/gnome/keybindings(dalam file xml, dalam subfolder seperti custom0dll).

Script di bawah ini membuat xmlfile dan folder containgnya, secara otomatis dinamai dengan benar.

Cara Penggunaan

  1. Rekatkan skrip ke file kosong, simpan sebagai set_customshortcuts_12.py
  2. Jalankan dengan perintah:

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

    key3 bersifat opsional, perintah dapat berupa:

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

    atau

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

Catatan

  • perhatikan bahwa penamaan tombol berbeda dari mengedit gsettings. Tombol diberi nama seperti yang ditampilkan di Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Khusus", sejauh yang dapat saya lihat.
  • Saya menguji skrip pada 12,04 di bawah VirtualBox; dibutuhkan logout / in agar perubahan dapat terjadi.
#!/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

Anda dapat mengatur pintasan khusus baru tanpa skrip python, dengan menggunakan sed. Anda hanya perlu menetapkan nama , pengikatan , dan tindakan sesuai pilihan Anda dalam skrip berikut:

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

Menulis skrip untuk itu. Lihat di bawah.

Lihat penggunaan dalam creatShortcutdoa.

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/']"

Akan sempurna jika nextShortcutId dapat secara otomatis mendeteksi jika kunci lama sudah ada (sudah dibuat oleh program lain) hanya untuk memastikan bahwa tidak ada konflik. Juga, periksa untuk melihat apakah ada hal lain yang terikat pada kunci yang dimasukkan.
Jack Giffin

0

Saya menemukan jawaban yang diposting oleh @JacobVlijm sangat berguna, terutama skrip. Saya mengirim kode ke bash. Saya tidak fungsi ini sempurna, mungkin mengandung beberapa bug, namun, itu berfungsi untuk saya.

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"
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.