Wie stelle ich benutzerdefinierte Tastaturkürzel über das Terminal ein?


56

Wie kann ich benutzerdefinierte Tastaturkürzel vom Terminal für verschiedene Linux-Versionen festlegen?

Grundsätzlich möchte ich wissen, wo Linux die Tastenkürzeldateien speichert und wie sie bearbeitet werden können.

Bei meinen Recherchen habe ich eine Datei gefunden, die ~/.config/compiz-1/compizconfigjedoch mehr oder weniger verschlüsselt war, als ich sie öffnen wollte nano.


Beachten Sie, dass XFCE / Xubuntu-Systeme hier bereits eine Antwort haben
Ulad Kasach,

Antworten:


62

Hinzufügen von Tastenkombinationen in zwei Schritten über die Befehlszeile (14.04+)

Das Hinzufügen von benutzerdefinierten Verknüpfungen über die Befehlszeile ist zwar möglich, jedoch etwas kompliziert. Dies muss pro Tastenkombination in wenigen Schritten erfolgen. Auf der anderen Seite, es ist ziemlich einfach und sehr gut scripted werden kann , wenn man es irgendwie von der Kommandozeile tun will (das war die Frage, nicht wahr?).

Wie in Ihrer Benutzeroberfläche (Systemeinstellungen> "Tastatur"> "Kurzbefehle"> "Benutzerdefinierte Kurzbefehle") werden benutzerdefinierte Kurzbefehle in zwei Schritten über die Befehlszeile erstellt:

  1. Erstellen Sie die Tastenkombination, indem Sie die vom Befehl zurückgegebene Liste bearbeiten (hinzufügen):

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

    Die zurückgegebene Liste sieht wie folgt aus (wenn es derzeit nur eine Verknüpfung gibt):

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

    Wenden Sie die bearbeitete Liste mit dem folgenden Befehl an:

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

    (Beachten Sie die doppelten Anführungszeichen)

    NB überflüssig zu erwähnen , dass die Erwähnung in der Liste (zB custom1, custom2) sollte ein einzigartiger sein. Wenn Sie ein Skript erstellen, sollte das Skript Duplikate verhindern. In diesem Fall sollte die bearbeitete Liste wie folgt aussehen:

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

    um eine Tastenkombination hinzuzufügen: custom1

  2. Setze seine Eigenschaften:

    • Name:

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

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

Nützliche Informationen finden Sie hier

Beispielskript zum Festlegen einer neuen benutzerdefinierten Verknüpfung

Mit dem folgenden Skript können Sie eine neue Tastenkombination über die Befehlszeile festlegen. Es kann mit dem Befehl verwendet werden (vorausgesetzt, die Tastenkombination ist verfügbar):

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

Ein Beispiel:

So legen Sie fest, dass eine Tastenkombination geditmit der Tastenkombination Alt+ geöffnet wird 7:

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

Das Drehbuch:

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

Wie benutzt man:

Fügen Sie das Skript in eine leere Datei ein, speichern Sie es unter set_customshortcut.pyund führen Sie es wie oben beschrieben aus.

Einige der am häufigsten verwendeten Schlüsselerwähnungen (experimentell gefunden, unter Berücksichtigung der Änderungen, die die grafische Benutzeroberfläche an dem Bindungswert vorgenommen hat):

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

usw.


5
Hervorragende Antwort. Ich brauche 100 Buttons mit Upvotes für dieses Skript. ;)
Anandu M Das

@JacobVlijm Kannst du uns bitte etwas zur Tastenkombination erklären ? Was bedeutet das <primary> -Tag? Und anstelle von Buchstabe g kann ich jeden Buchstaben ersetzen, den ich denke, ryt?
Anonym Schnabeltier

1
@VladK ai, xubuntu, könnte sein, dass die Verknüpfungen von xubuntu (noch) in einer xml-Datei festgelegt sind. Ich muss schauen. In diesem Fall müssen wir Ihre Frage mit dem Tag xubuntu- specific erneut öffnen.
Jacob Vlijm

1
Danke, @JacobVlijm, ich habe es ausprobiert. Und ich finde gerade heraus, dass meine Verlegenheit ein Fehler war. Hier gibt es einige wirklich knifflige Dinge. custom-keybindingsollte am Ende kein "s" enthalten, wenn Sie sich in einem Schema befinden. Es sollte jedoch "s" enthalten, wenn es als Schlüssel oder im Pfad fungiert. Andernfalls löst der Befehl "set" eine Ausnahme aus. Entfernen Sie daher das "s" von custom-keybindingim Schema. Außerdem sollte Ihr Python-Skript auch aktualisiert werden.
E-Cloud

2
Zu Ihrer Information, Ihr Python-Skript enthält einen Fehler. Wenn keine Tastaturkürzel installiert sind, wird gsettingszurückgegeben, @as []was nicht ausgewertet wird.
Seanny123

11

Es gibt eine einfache Möglichkeit, dies zu tun 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'"

Verwenden von 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'"

Sie müssen die Anzahl im custom0Teil erhöhen, um weitere Bindungen hinzuzufügen, d. H. custom1, custom2Usw.

Um es dauerhaft zu machen, fügen Sie es einfach .bash_profileeinem oder einem ähnlichen Skript hinzu, das von Login-Shells ausgeführt wird. Nur tun Sie es nicht für Nicht-Login - Shells , .bashrcweil aus meiner Erfahrung dieser dconfund gsettingslangsam es deutlich nach unten. Das Ändern / Hinzufügen von 30 Bindungen dauert eine Sekunde! Sie möchten dies nicht in der Nicht-Login-Shell ( .bashrc)!


1
Beide scheitern in Ubuntu 18.04. Nach der Antwort von @Jacob Vlijm und diesem Community-Wiki müssen Sie custom0der benutzerdefinierten Verknüpfungsliste hinzufügen , z gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". B. mit . Ich weiß es nicht dconf.
Miguelmorin

Auch dconf dump DIRauf eine ganze subpath zu stdout Dump. Die Ausgabe erfolgt in einem keyfile-ähnlichen Format mit Werten in GVariant-Syntax.
Pablo A

10

Alle Einstellungen für benutzerdefinierte Tastaturkürzel werden in der Datenbank dconf gespeichert.

Sie können leicht darauf zugreifen mit dconf-editor:

sudo apt-get install dconf-editor

Gehen Sie dann im Editor zu folgendem dconf-Pfad:

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

Bildbeschreibung hier eingeben


Ist der Speicherort für alle Linux-Versionen gleich? Oder zumindest alle Versionen von Ubuntu?
Anonym Schnabeltier

1
@AnonymousPlatypus: Dies ist der Ort der Einstellungen seit 14.04 (ich kann nicht für andere Distribution sagen)
Sylvain Pineau

2
Dies ist eine grafische Methode, und nicht vom Terminal
Anandu M Das

1
Was kann ich tun, wenn mein Medienschlüssel keinen Unterschlüssel für benutzerdefinierte Tastenkombinationen hat?
Brandon Kuczenski

Die Frage war über Terminal, nicht GUI, so Antwort ist irrelevant
Alexei Martianov

6

Hinzufügen von Tastenkombinationen über die Befehlszeile in 12.04

Um zu verhindern, dass die akzeptierte Antwort zu umfangreich wird, veröffentlichen Sie eine separate Lösung für den 12.04.

Bis einschließlich 12.04 werden benutzerdefinierte Tastenkombinationen nicht in der dconfDatenbank gespeichert, sondern in ~/.gconf/desktop/gnome/keybindings(in einer XML-Datei, in Unterordnern wie custom0usw.).

Das folgende Skript erstellt die xmlDatei und den zugehörigen Ordner, die automatisch korrekt benannt werden.

Wie benutzt man

  1. Fügen Sie das Skript in eine leere Datei ein und speichern Sie es unter set_customshortcuts_12.py
  2. Führen Sie es mit dem Befehl aus:

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

    key3 ist optional, Befehle können zum Beispiel sein:

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

    oder

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

Anmerkungen

  • Beachten Sie, dass sich die Benennung der Schlüssel von der Bearbeitung der Einstellungen unterscheidet. Die Tasten werden so benannt, wie sie in den Systemeinstellungen unter "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen" angezeigt werden.
  • Ich habe das Skript am 12.04 unter VirtualBox getestet; Es war eine Abmeldung / Anmeldung erforderlich, damit die Änderungen durchgeführt werden konnten.
#!/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

Sie können mithilfe von sed eine neue benutzerdefinierte Verknüpfung ohne Python-Skript festlegen. Sie müssen nur Name , Bindung und Aktion in dem folgenden Skript auf Ihre Wahl einstellen :

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

Schrieb ein Skript dafür. Siehe unten.

Siehe die Verwendung im creatShortcutAufruf.

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

Es wäre perfekt, wenn nextShortcutId automatisch erkennen könnte, ob bereits alte Schlüssel vorhanden sind (die bereits von anderen Programmen erstellt wurden), um sicherzustellen, dass keine Konflikte vorliegen. Überprüfen Sie auch, ob noch etwas an die eingegebenen Schlüssel gebunden ist.
Jack Giffin

0

Ich fand die Antwort von @JacobVlijm sehr nützlich, insbesondere das Skript. Ich habe den Code nach portiert bash. Ich bin nicht der Meinung, dass diese Funktion perfekt ist. Sie enthält möglicherweise einige Fehler, funktioniert jedoch bei mir.

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"
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.