टर्मिनल से कस्टम कीबोर्ड शॉर्टकट कैसे सेट करें?


56

विभिन्न लिनक्स संस्करणों के लिए टर्मिनल से कस्टम कीबोर्ड शॉर्टकट कैसे सेट करें?

मूल रूप से मैं जानना चाहता हूं कि लिनक्स कीबोर्ड शॉर्टकट फ़ाइलों को कहाँ संग्रहीत करता है और इसे कैसे संपादित किया जा सकता है।

मेरे शोध पर मुझे एक फ़ाइल मिली, ~/.config/compiz-1/compizconfigलेकिन जब मैंने इसे खोलने की कोशिश की तो यह अधिक या एन्क्रिप्टेड की तरह था nano


ध्यान दें, XFCE / Xubuntu सिस्टम का पहले से ही यहाँ
उलद कासच

जवाबों:


62

कमांड लाइन से दो चरणों में शॉर्टकट कीबाइंडिंग जोड़ना (14.04+)

कमांड लाइन से कस्टम शॉर्टकट जोड़ना हो सकता है, लेकिन थोड़ा जटिल है; इसे कीबाइंडिंग के कुछ चरणों में किया जाना चाहिए। दूसरी ओर, यह है बिल्कुल स्पष्ट है और अगर आप किसी भी तरह कमांड लाइन (उस सवाल, सही था?) से करना चाहते हैं बहुत अच्छी तरह से पटकथा जा सकता है।

जैसे आपके इंटरफ़ेस (सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"), कस्टम कीबोर्ड शॉर्टकट दो चरणों में कमांड लाइन से बनाए जाते हैं:

  1. कमांड द्वारा दी गई सूची को संपादित करके (जोड़कर) सूची में कीबाइंडिंग बनाएँ:

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

    (डबल कोट्स पर ध्यान दें)

    एनबी को यह कहने की आवश्यकता नहीं है कि सूची में उल्लेख (उदाहरण 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
बहुत बढ़िया जवाब। मुझे उस स्क्रिप्ट के लिए 100 बटनों की आवश्यकता है। ;)
आनंदु एम दास

@JacobVlijm क्या आप कुंजी संयोजन भाग पर थोड़ी व्याख्या कर सकते हैं ? वह <प्राथमिक> टैग क्या दर्शाता है? और पत्र जी के बजाय मैं किसी भी पत्र को बदल सकता हूं जो मुझे लगता है, आरआईटी?
बेनामी प्लैटिपस

1
@VladK ai, xubuntu, हो सकता है कि xml फ़ाइल में xubuntu के शॉर्टकट (अभी भी) सेट हों। मुझे देखना पड़ेगा। यदि हां, तो हमें आपके प्रश्न को फिर से खोलने की आवश्यकता है, जिसे xubuntu- विशिष्ट के रूप में टैग किया गया है।
जैकब व्लिजम

1
धन्यवाद, @JacobVlijm, मैंने इसे आज़माया है। और मुझे सिर्फ यह पता है कि मेरी गलती एक गलती थी। यहाँ वास्तव में कुछ मुश्किल है। custom-keybindingस्कीमा के अंदर होने पर अंत में "s" नहीं होना चाहिए। लेकिन, इसमें कुंजी या पथ के रूप में कार्य करने पर "s" होना चाहिए। अन्यथा, "सेट" कमांड अपवाद को फेंक देगा। तो, कृपया custom-keybindingस्कीमा में "s" को हटा दें । इसके अलावा, आपकी अजगर स्क्रिप्ट को भी अपडेट करना चाहिए।
ई-क्लाउड

2
FYI करें, आपकी पायथन लिपि में एक बग है। यदि कोई कीबोर्ड शॉर्टकट स्थापित नहीं हैं, तो gsettingsरिटर्न @as []जो मूल्यांकन नहीं करता है।
सीनिइज़ १२

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 में विफल। @ जेकब व्लिजम के उत्तर और इस समुदाय विकी के बाद , आपको custom0कस्टम शॉर्टकट सूची में जोड़ना होगा, जैसे कि gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']"। मैं नहीं जानता dconf
मिगेलमोरिन

इसके अलावा एक पूरे उपपथdconf dump DIR को डंप
पाब्लो ए

10

सभी कस्टम कीबोर्ड शॉर्टकट सेटिंग्स को dconf डेटाबेस में संग्रहीत किया जाता है।

आप आसानी से उन तक पहुँच सकते हैं dconf-editor:

sudo apt-get install dconf-editor

फिर संपादक में निम्नलिखित dconf पथ पर जाएँ:

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

यहाँ छवि विवरण दर्ज करें


क्या लिनक्स के सभी संस्करणों के लिए स्थान समान है? या उबंटू के सभी संस्करणों को कम से कम?
बेनामी प्लैटिपस

1
@AnonymousPlatypus: यह 14.04 के बाद से सेटिंग्स का स्थान है (मैं अन्य डिस्ट्रो के लिए नहीं बता सकता)
सिल्वेन पिनेउ

2
यह चित्रमय विधि है, और टर्मिनल से नहीं
आनंदू एम दास

1
यदि मेरे मीडिया-कुंजी कुंजी में कस्टम-कीबाइंडिंग उपकुंजी नहीं है तो मैं क्या करूं?
ब्रैंडन कुक्ज़ेंस्की 20

सवाल जीयूआई नहीं, टर्मिनल के बारे में था, इसलिए जवाब अप्रासंगिक है
अलेक्सई मार्टीनोव

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 से अलग है। सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट", जहां तक ​​मैं देख सकता हूं, जैसे कि वे दिखाए गए हैं।
  • मैंने VirtualBox के तहत 12.04 पर स्क्रिप्ट का परीक्षण किया; इसमें परिवर्तन करने के लिए लॉग आउट / की आवश्यकता थी।
#!/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/']"

यह सही होगा अगर अगलीशॉर्टकटआईडी यह पता लगा सके कि क्या पुरानी चाबियां पहले से ही हैं (पहले से ही अन्य कार्यक्रमों द्वारा बनाई गई हैं) बस यह सुनिश्चित करने के लिए कि कोई संघर्ष नहीं है। इसके अलावा, यह देखने के लिए जांचें कि क्या कुछ और दर्ज की गई चाबियों से बंधा हुआ है।
जैक गिफिन

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"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.