วิธีตั้งค่าแป้นพิมพ์ลัดที่กำหนดเองจากเทอร์มินัล


56

จะตั้งค่าช็อตคัตคีย์บอร์ดแบบกำหนดเองจากเทอร์มินัลสำหรับรุ่น Linux ต่าง ๆ ได้อย่างไร

โดยทั่วไปฉันต้องการทราบว่า Linux เก็บไฟล์ช็อตคัตคีย์บอร์ดและวิธีแก้ไขได้อย่างไร

ในการวิจัยของฉันฉันพบไฟล์แต่มันก็มากขึ้นเช่นการเข้ารหัสหรือเมื่อฉันพยายามที่จะเปิดมันด้วย~/.config/compiz-1/compizconfignano


หมายเหตุระบบ XFCE / Xubuntu มีคำตอบอยู่ที่นี่แล้ว
Ulad Kasach

คำตอบ:


62

การเพิ่มการลัดคีย์ลัดในสองขั้นตอนจากบรรทัดคำสั่ง (14.04+)

การเพิ่มทางลัดที่กำหนดเองจากบรรทัดคำสั่งสามารถทำได้ แต่มีความซับซ้อนเล็กน้อย จำเป็นต้องทำในไม่กี่ขั้นตอนต่อการผูกคีย์ ในอีกทางหนึ่งก็คือตรงไปตรงมาสวยและสามารถเป็นอย่างดีจะ scripted อย่างใดถ้าคุณต้องการที่จะทำจากบรรทัดคำสั่ง (นั่นเป็นคำถามที่ใช่ไหม?)

เช่นเดียวกับในอินเทอร์เฟซของคุณ (การตั้งค่าระบบ> "แป้นพิมพ์"> "ทางลัด"> "ทางลัดที่กำหนดเอง") ทางลัดแป้นพิมพ์แบบกำหนดเองนั้นทำจากบรรทัดคำสั่งในสองขั้นตอน:

  1. สร้างการโยงคีย์โดยการแก้ไข (เพิ่ม to-) รายการที่ส่งคืนโดยคำสั่ง:

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

    รายการที่ส่งคืนดูเหมือนว่า (หากเป็นทางลัดเดียวเท่านั้นในปัจจุบัน):

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

    ใช้รายการที่แก้ไขโดยคำสั่ง:

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

    (ระวังคำพูดคู่)

    NBไม่จำเป็นต้องบอกว่าการพูดถึงในรายการ (เช่นcustom1, custom2) ควรจะเป็นที่ไม่ซ้ำกันอย่างใดอย่างหนึ่ง หากคุณสคริปต์สคริปต์ควรป้องกันการซ้ำซ้อน ในกรณีนี้รายการที่แก้ไขควรมีลักษณะเช่น:

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

    เมื่อต้องการเพิ่มการเชื่อมโยงคีย์เดียว: custom1

  2. ตั้งค่าคุณสมบัติ:

    • ชื่อ:

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ name '<newname>'
      
    • คำสั่ง:

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
      
    • การรวมคีย์ (ตัวอย่าง<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>'
      

ข้อมูลที่เป็นประโยชน์สามารถพบได้ที่นี่

ตัวอย่างสคริปต์เพื่อตั้งค่าทางลัดที่กำหนดเองใหม่

สคริปต์ด้านล่างนี้สามารถใช้เพื่อตั้งค่าคีย์ผสมทางลัดใหม่จากบรรทัดคำสั่ง มันสามารถใช้กับคำสั่ง (สมมติว่าการรวมคีย์มีอยู่):

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

ตัวอย่าง:

ในการตั้งค่าการรวมคีย์ลัดเพื่อเปิดgeditด้วยคีย์ผสมAlt+ 7:

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

สคริปต์:

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

วิธีใช้:

วางสคริปต์ลงในไฟล์เปล่าบันทึกเป็นset_customshortcut.pyเรียกใช้ตามที่อธิบายไว้ข้างต้น

คีย์หลักที่ใช้ส่วนใหญ่กล่าวถึงบางส่วน (พบในการทดลองโดยดูที่การเปลี่ยนแปลงวิธี GUI ที่ทำให้เป็นค่าการรวม):

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

เป็นต้น


5
คำตอบที่ยอดเยี่ยม ฉันต้องการ upvotes 100 ปุ่มสำหรับสคริปต์นั้น ;)
Anandu M Das

@JacobVlijm คุณช่วยอธิบายหน่อยเกี่ยวกับส่วนของการผสมคีย์ได้ไหม? แท็ก <primary> ระบุอะไร และแทนที่จะเป็นตัวอักษรgฉันสามารถแทนที่ตัวอักษรที่ฉันคิดได้ ryt
ไม่ประสงค์ออกนาม Platypus

1
@VladK ai, xubuntu เป็นไปได้ว่าทางลัดของ xubuntu นั้นถูกตั้งค่า (ยัง) ในไฟล์ xml ฉันจะต้องดู ถ้าเป็นเช่นนั้นเราจำเป็นต้องเปิดคำถามของคุณอีกครั้งติดแท็กเป็นเฉพาะ xubuntu-
Jacob Vlijm

1
ขอบคุณ @JacobVlijm ฉันได้ลองแล้ว และฉันเพิ่งพบว่าการแก้ไขของฉันเป็นข้อผิดพลาด มีบางอย่างที่นี่ยุ่งยากจริงๆ custom-keybindingไม่ควรมี "s" ในตอนท้ายเมื่ออยู่ในสคีมา แต่ควรมี "s" เมื่อทำหน้าที่เป็นกุญแจหรือในเส้นทาง มิฉะนั้นคำสั่ง "set" จะส่งข้อยกเว้น ดังนั้นโปรดลบ "s" ของcustom-keybindingในสคีมา นอกจากนี้สคริปต์ไพ ธ อนของคุณควรอัปเดตด้วย
e-cloud

2
FYI, Python script ของคุณมีบั๊กอยู่ หากไม่มีการติดตั้งแป้นพิมพ์ลัดให้gsettingsส่งคืน@as []สิ่งที่ไม่ได้ประเมิน
Seanny123

11

มีวิธีง่ายๆในการทำเช่นนั้นโดยใช้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'"

การใช้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'"

คุณต้องเพิ่มจำนวนในcustom0ส่วนของการเพิ่มการผูกเช่น custom1, custom2ฯลฯ

หากต้องการทำให้ถาวรให้เพิ่ม.bash_profileหรือสคริปต์ที่คล้ายกันซึ่งรันโดยเชลล์ล็อกอิน เพียงอย่าทำเพื่อเชลล์ที่ไม่ใช่การเข้าสู่ระบบ.bashrcเพราะจากประสบการณ์ของฉันเหล่านี้dconfและgsettingsทำให้มันช้าลงอย่างมาก การเปลี่ยน / เพิ่มการผูก 30 ครั้งใช้เวลาแค่วินาทีเดียว! คุณไม่ต้องการสิ่งนี้ในเชลล์ที่ไม่ใช่การเข้าสู่ระบบ ( .bashrc)!


1
ทั้งสองล้มเหลวใน Ubuntu 18.04 ต่อไปนี้คำตอบ @Jacob Vlijm และวิกิพีเดียชุมชนนี้คุณจะต้องเพิ่มไปยังรายการทางลัดที่กำหนดเองเช่นกับcustom0 ผมไม่ทราบว่าเกี่ยวกับgsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']" dconf
miguelmorin

นอกจากนี้ยังมีdconf dump DIRการถ่ายโอนข้อมูล subpath ทั้ง stdout เอาต์พุตอยู่ในรูปแบบ keyfile คล้ายกับค่าในไวยากรณ์ GVariant
Pablo

10

การตั้งค่าแป้นพิมพ์ลัดที่กำหนดเองทั้งหมดจะถูกเก็บไว้ในฐานข้อมูล dconf

คุณสามารถเข้าถึงได้โดยง่ายด้วยdconf-editor:

sudo apt-get install dconf-editor

จากนั้นไปที่เส้นทาง dconf ต่อไปนี้ในโปรแกรมแก้ไข:

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

ป้อนคำอธิบายรูปภาพที่นี่


ที่ตั้งเดียวกันสำหรับ Linux ทุกรุ่นหรือไม่ หรืออย่างน้อยทุกรุ่นของ Ubuntu?
ผู้ไม่ประสงค์ออกนาม Platypus

1
@AnonymousPlatypus: นี่คือที่ตั้งของการตั้งค่าตั้งแต่ 14.04 (ฉันไม่สามารถบอกได้ว่าคนอื่น distro)
Sylvain Pineau

2
นี่เป็นวิธีกราฟิกและไม่ใช่จากเทอร์มินัล
Anandu M Das

1
ฉันจะทำอย่างไรถ้าคีย์สื่อ - คีย์ของฉันไม่มีคีย์ย่อยการผูกคีย์แบบกำหนดเอง
Brandon Kuczenski

คำถามเกี่ยวกับเทอร์มินัลไม่ใช่ GUI ดังนั้นคำตอบไม่เกี่ยวข้อง
Alexei Martianov

6

การเพิ่มการลัดคีย์ลัดจากบรรทัดคำสั่งใน 12.04

เพื่อป้องกันคำตอบที่ยอมรับให้กว้างขวางเกินไปให้โพสต์โซลูชันแยกต่างหากสำหรับ 12.04

จนกระทั่ง (และรวมถึง) 12.04 การโยงคีย์ที่กำหนดเองจะไม่ถูกเก็บไว้ในdconfฐานข้อมูล แต่ใน~/.gconf/desktop/gnome/keybindings(ในไฟล์ xml ในโฟลเดอร์ย่อยเช่นcustom0ฯลฯ )

สคริปต์ด้านล่างสร้างxmlไฟล์และโฟลเดอร์ที่ต่อเนื่องตั้งชื่ออย่างถูกต้องโดยอัตโนมัติ

วิธีใช้

  1. วางสคริปต์ลงในไฟล์เปล่าแล้วบันทึกเป็น set_customshortcuts_12.py
  2. รันด้วยคำสั่ง:

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

    key3 เป็นทางเลือกคำสั่งสามารถเป็นตัวอย่างได้:

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

    หรือ

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

หมายเหตุ

  • โปรดทราบว่าการตั้งชื่อของคีย์นั้นแตกต่างจากการแก้ไข gsettings ปุ่มเหล่านี้มีชื่อเหมือนที่ปรากฏในการตั้งค่าระบบ> "แป้นพิมพ์"> "ทางลัด"> "ทางลัดที่กำหนดเอง" เท่าที่ฉันเห็น
  • ฉันทดสอบสคริปต์ใน 12.04 ภายใต้ VirtualBox; มันต้องออกจากระบบ / ในการเปลี่ยนแปลงที่จะเกิดขึ้น
#!/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 คุณเพียงแค่ต้องตั้งชื่อ , ที่มีผลผูกพันและการดำเนินการเลือกในบทต่อไปนี้:

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

เขียนสคริปต์สำหรับสิ่งนั้น ดูด้านล่าง

ดูการใช้งานในการ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 สามารถตรวจจับอัตโนมัติถ้ามีคีย์เก่าอยู่แล้ว (สร้างโดยโปรแกรมอื่นแล้ว) เพื่อให้แน่ใจว่าไม่มีข้อขัดแย้ง นอกจากนี้ให้ตรวจสอบเพื่อดูว่ามีสิ่งอื่นใดผูกกับปุ่มที่ป้อนหรือไม่
Jack Giffin

0

ฉันพบคำตอบที่ @JacobVlijm โพสต์มีประโยชน์มากโดยเฉพาะสคริปต์ bashฉันรังเพลิงรหัสเพื่อ ฉันไม่ได้ฟังก์ชั่นนี้สมบูรณ์แบบมันอาจมีข้อบกพร่องบางอย่าง แต่มันเหมาะกับฉัน

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"
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.