Làm cách nào để đặt phím tắt tùy chỉnh từ thiết bị đầu cuối?


56

Làm cách nào để đặt phím tắt tùy chỉnh từ thiết bị đầu cuối cho các phiên bản Linux khác nhau?

Về cơ bản tôi muốn biết Linux lưu trữ các tập tin phím tắt ở đâu và làm thế nào để chỉnh sửa nó.

Trong nghiên cứu của tôi, tôi đã tìm thấy một tập tin ~/.config/compiz-1/compizconfignhưng nó giống hoặc được mã hóa hơn khi tôi cố gắng mở nó với nano.


Lưu ý, các hệ thống XFCE / Xubfox đã có câu trả lời tại đây
Ulad Kasach

Câu trả lời:


62

Thêm các phím tắt trong hai bước từ dòng lệnh (14.04+)

Thêm phím tắt tùy chỉnh từ dòng lệnh có thể được thực hiện, nhưng hơi phức tạp; nó cần được thực hiện trong một vài bước cho mỗi lần gõ phím. Mặt khác, nó khá đơn giản và rất tốt có thể được kịch bản nếu bạn nào đó muốn làm điều đó từ dòng lệnh (đó là câu hỏi, phải không?).

Giống như trong giao diện của bạn (Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh"), các phím tắt tùy chỉnh được tạo từ dòng lệnh theo hai bước:

  1. tạo keybinding bằng cách chỉnh sửa (thêm vào-) danh sách được trả về bởi lệnh:

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

    Danh sách trả về trông giống như (nếu hiện tại chỉ có một phím tắt):

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

    Áp dụng danh sách đã chỉnh sửa bằng lệnh:

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

    (nhớ các trích dẫn kép)

    NB Không cần phải nói rằng đề cập đến trong danh sách (ví dụ custom1, custom2) nên một độc đáo. Nếu bạn kịch bản nó, kịch bản sẽ ngăn chặn trùng lặp. Trong trường hợp này, danh sách được chỉnh sửa sẽ trông giống như:

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

    để thêm một liên kết phím: custom1

  2. đặt thuộc tính của nó:

    • Tên:

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

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
      
    • Tổ hợp phím (ví dụ <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>'
      

Thông tin hữu ích có thể được tìm thấy ở đây

Tập lệnh mẫu để đặt lối tắt tùy chỉnh mới

Tập lệnh bên dưới có thể được sử dụng để đặt tổ hợp phím tắt mới từ dòng lệnh. Nó có thể được sử dụng với lệnh (giả sử có tổ hợp phím có sẵn):

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

Một ví dụ:

Để đặt tổ hợp phím tắt để mở geditbằng tổ hợp phím Alt+ 7:

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

Kịch bản:

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

Cách sử dụng:

Dán tập lệnh vào một tập tin trống, lưu nó dưới dạng set_customshortcut.py, chạy nó như được giải thích ở trên.

Một số đề cập chính được sử dụng nhiều nhất (được tìm thấy bằng thực nghiệm, xem xét các thay đổi theo cách GUI được thực hiện thành giá trị ràng buộc):

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

Vân vân.


5
Câu trả lời tuyệt vời. Tôi cần 100 nút upvote cho kịch bản đó. ;)
Anandu M Das 17/03/2015

@JacobVlijm Bạn có thể vui lòng giải thích một chút về phần kết hợp Key không? Thẻ <chính> đó biểu thị điều gì? Và thay vì chữ g tôi có thể thay thế bất kỳ chữ nào tôi nghĩ, ryt?
Thú mỏ vịt vô danh

1
@VladK ai, xubfox, có thể là các phím tắt của xubfox được (vẫn) được đặt trong một tệp xml. Tôi sẽ phải nhìn. Nếu vậy, chúng tôi cần mở lại câu hỏi của bạn, được gắn thẻ là xubfox- cụ thể.
Jacob Vlijm

1
Cảm ơn bạn, @JacobVlijm, tôi đã dùng thử. Và tôi chỉ phát hiện ra rằng sửa chữa của tôi là một sai lầm. Có một số thực sự khó khăn ở đây. custom-keybindingkhông nên chứa "s" ở cuối khi ở trong lược đồ. Nhưng, nó nên chứa "s" khi đóng vai trò là khóa hoặc trong đường dẫn. Nếu không, lệnh "set" sẽ ném ngoại lệ. Vì vậy, vui lòng xóa "s" của custom-keybindinglược đồ. Bên cạnh đó, kịch bản python của bạn cũng nên cập nhật.
đám mây điện tử

2
FYI, tập lệnh Python của bạn có một lỗi trong đó. Nếu không có phím tắt nào được cài đặt, gsettingstrả về @as []mà không đánh giá.
Seanny123

11

Có một cách đơn giản để làm điều đó bằng cách sử dụng 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'"

Sử dụng 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'"

Bạn cần tăng số lượng trong custom0phần để thêm nhiều ràng buộc hơn, tức là. custom1, custom2v.v.

Để làm cho nó vĩnh viễn, chỉ cần thêm nó vào .bash_profilehoặc một tập lệnh tương tự được chạy bởi shell đăng nhập. Chỉ không làm điều đó cho shell không đăng nhập .bashrcbởi vì theo kinh nghiệm của tôi những điều này dconfgsettingslàm chậm nó đáng kể. Thay đổi / Thêm 30 ràng buộc mất một giây! Bạn không muốn điều này trong shell không đăng nhập ( .bashrc)!


1
Cả hai đều thất bại trong Ubuntu 18.04. Theo câu trả lời của @Jacob Vlijm và wiki cộng đồng này , bạn cần thêm custom0vào danh sách phím tắt tùy chỉnh, ví dụ như với gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". Tôi không biết về dconf.
Miguelmorin

Ngoài ra dconf dump DIRđể kết xuất toàn bộ đường dẫn đến thiết bị xuất chuẩn. Đầu ra có định dạng giống như keyfile, với các giá trị theo cú pháp GVariant.
Pablo A

10

Tất cả các cài đặt phím tắt tùy chỉnh được lưu trữ trong cơ sở dữ liệu dconf.

Bạn có thể dễ dàng truy cập chúng với dconf-editor:

sudo apt-get install dconf-editor

Sau đó đi đến đường dẫn dcs sau trong trình chỉnh sửa:

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

nhập mô tả hình ảnh ở đây


Là vị trí giống nhau cho tất cả các phiên bản của Linux? Hoặc ít nhất là tất cả các phiên bản của Ubuntu?
Thú mỏ vịt vô danh

1
@AnonymousPlatypus: đây là vị trí của các cài đặt kể từ 14.04 (Tôi không thể nói cho các bản phân phối khác)
Sylvain Pineau

2
Đây là phương pháp đồ họa, chứ không phải từ thiết bị đầu cuối
Anandu M Das

1
Tôi phải làm gì nếu khóa phím phương tiện của tôi không có khóa con khóa tùy chỉnh?
Brandon Kuc chụcki

Câu hỏi là về thiết bị đầu cuối, không phải GUI, vì vậy câu trả lời là không liên quan
Alexei Martianov

6

Thêm các phím tắt từ dòng lệnh trong 12.04

Để ngăn câu trả lời được chấp nhận trở nên quá rộng rãi, hãy đăng một giải pháp riêng cho ngày 12.04.

Cho đến khi (và bao gồm) 12.04, các phím bấm tùy chỉnh không được lưu trữ trong dconfcơ sở dữ liệu, nhưng trong ~/.gconf/desktop/gnome/keybindings(trong tệp xml, trong các thư mục con như custom0vv).

Kịch bản bên dưới tạo xmltệp và thư mục conta của nó, tự động được đặt tên chính xác.

Cách sử dụng

  1. Dán tập lệnh vào một tập tin trống, lưu nó dưới dạng set_customshortcuts_12.py
  2. Chạy nó với lệnh:

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

    key3 là tùy chọn, các lệnh có thể là ví dụ:

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

    hoặc là

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

Ghi chú

  • lưu ý rằng việc đặt tên của các phím khác với chỉnh sửa cài đặt gs. Các phím được đặt tên giống như chúng hiển thị trong Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh", theo như tôi có thể thấy.
  • Tôi đã thử nghiệm tập lệnh vào ngày 12.04 trong VirtualBox; nó cần đăng xuất / đăng nhập để thay đổi diễn ra.
#!/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

Bạn có thể đặt lối tắt tùy chỉnh mới mà không cần tập lệnh python, bằng cách sử dụng sed. Bạn chỉ cần đặt tên , ràng buộchành động cho lựa chọn của bạn trong tập lệnh sau:

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

Đã viết một kịch bản cho điều đó. Xem bên dưới.

Xem cách sử dụng trong creatShortcutlời mời.

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

Sẽ thật hoàn hảo nếu nextShortcutId có thể tự động phát hiện nếu các khóa cũ đã có sẵn (đã được tạo bởi các chương trình khác) chỉ để đảm bảo rằng không có xung đột. Ngoài ra, kiểm tra xem liệu có gì khác bị ràng buộc với các phím đã nhập không.
Jack Giffin

0

Tôi thấy câu trả lời được đăng bởi @JacobVlijm rất hữu ích, đặc biệt là kịch bản. Tôi chuyển mã đến bash. Tôi không có chức năng này là hoàn hảo, nó có thể chứa một số lỗi, tuy nhiên, nó hoạt động với tôi.

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"
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.