Jak ustawić niestandardowe skróty klawiaturowe z terminala?

56

Jak ustawić niestandardowe skróty klawiaturowe z terminala dla różnych wersji systemu Linux?

Zasadniczo chcę wiedzieć, gdzie Linux przechowuje pliki skrótów klawiaturowych i jak można je edytować.

Podczas moich badań znalazłem plik, ~/.config/compiz-1/compizconfigale był bardziej lub bardziej zaszyfrowany, gdy próbowałem go otworzyć nano.

Anonimowy Dziobak
źródło
Uwaga, systemy XFCE / Xubuntu mają już odpowiedź tutaj
Ulad Kasach 30.04.2016

Odpowiedzi:

62

Dodawanie skrótów klawiszowych w dwóch krokach z wiersza poleceń (14.04+)

Dodawanie niestandardowych skrótów z wiersza poleceń można wykonać, ale jest to trochę skomplikowane; należy to zrobić w kilku krokach dla każdego klawisza. Z drugiej strony jest to dość proste i może być dobrze napisane w skrypcie, jeśli chcesz to zrobić z wiersza poleceń (to było pytanie, prawda?).

Podobnie jak w interfejsie (Ustawienia systemowe> „Klawiatura”> „Skróty”> „Skróty niestandardowe”), niestandardowe skróty klawiaturowe są tworzone z wiersza poleceń w dwóch krokach:

  1. utwórz skrót klawiszowy, edytując (dodając do) listę zwracaną przez polecenie:

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

    Zwrócona lista wygląda (gdyby był tylko jeden skrót):

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

    Zastosuj edytowaną listę za pomocą polecenia:

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

    (pamiętaj o podwójnych cudzysłowach)

    Uwaga Nie trzeba mówić, że wzmianka w liście (np custom1, custom2) powinna być wyjątkowa. Jeśli go wykonasz, skrypt powinien zapobiegać duplikacjom. W takim przypadku edytowana lista powinna wyglądać np .:

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

    aby dodać jedno skrót klawiszowy: custom1

  2. ustaw jego właściwości:

    • imię:

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

      gsettings set org.gnome.settings-daemon.plugins.media-keys.custom-keybinding:/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/ command '<newcommand>'
      
    • Kombinacja klawiszy (na przykład <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>'
      

Przydatne informacje można znaleźć tutaj

Przykładowy skrypt do ustawienia nowego niestandardowego skrótu

Poniższego skryptu można użyć do ustawienia nowej kombinacji klawiszy skrótu z wiersza poleceń. Można go używać z poleceniem (przy założeniu, że kombinacja klawiszy jest dostępna):

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

Przykład:

Aby ustawić kombinację klawiszy skrótu do otwierania geditza pomocą kombinacji klawiszy Alt+ 7:

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

Scenariusz:

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

Jak używać:

Wklej skrypt do pustego pliku, zapisz go jako set_customshortcut.py, uruchom go jak wyjaśniono powyżej.

Niektóre najczęściej używane kluczowe wzmianki (znalezione eksperymentalnie, analizujące zmiany wprowadzone przez GUI w wartości wiązania):

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

itp.

Jacob Vlijm
źródło
5
Doskonała odpowiedź. Potrzebuję 100 przycisków upvotes dla tego skryptu. ;)
Anandu M Das
@JacobVlijm Czy mógłbyś wyjaśnić nieco część dotyczącą kombinacji klawiszy ? Co oznacza ten znacznik <primary>? I zamiast litery g mogę zastąpić każdą literę, którą myślę, ryt?
Anonimowy Dziobak
1
@VladK ai, xubuntu, może być tak, że skróty xubuntu są (nadal) ustawione w pliku xml. Będę musiał spojrzeć. Jeśli tak, musimy ponownie otworzyć twoje pytanie, oznaczone jako specyficzne dla Xubuntu.
Jacob Vlijm,
1
Dziękuję, @JacobVlijm, wypróbowałem to. I właśnie odkryłem, że moja poprawka była błędem. Jest tu trochę naprawdę trudnych. custom-keybindingnie powinien zawierać „s” na końcu, gdy znajduje się w schemacie. Ale powinien zawierać „s”, gdy działa jako klucz lub na ścieżce. W przeciwnym razie polecenie „set” spowoduje zgłoszenie wyjątku. Więc usuń „s” ze custom-keybindingschematu. Poza tym skrypt w Pythonie również powinien zostać zaktualizowany.
e-chmura,
2
Do Twojej wiadomości, twój skrypt Python zawiera błąd. Jeśli nie ma zainstalowanych skrótów klawiaturowych, gsettingszwraca, @as []które nie są oceniane.
Seanny123
11

Jest prosty sposób na zrobienie tego za pomocą 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'"

Używanie 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'"

Musisz zwiększyć liczbę w custom0części, aby dodać więcej powiązań, tj. custom1, custom2itp.

Aby było trwałe, po prostu dodaj go .bash_profilelub podobny skrypt uruchamiany przez powłoki logowania. Tylko nie rób tego na muszli bez logowania .bashrc, ponieważ z mojego doświadczenia to dconfi gsettingsją spowolni znacząco. Zmiana / dodanie 30 powiązań zajmuje sekundę! Nie chcesz tego w powłoce niezalogowanej ( .bashrc)!

lisak
źródło
1
Oba zawodzą w Ubuntu 18.04. Po odpowiedzi @Jacob Vlijm i tej wiki społeczności musisz dodać custom0do niestandardowej listy skrótów, np gsettings set org.gnome.settings-daemon.plugins.media-keys custom-keybindings "['.../custom1/']". Za pomocą . Nie wiem, o dconf.
miguelmorin
Również dconf dump DIRdo zrzutu całego podścieżkę na standardowe wyjście. Dane wyjściowe są w formacie pliku klucza z wartościami w składni GVariant.
Pablo A
10

Wszystkie niestandardowe ustawienia skrótów klawiaturowych są przechowywane w bazie danych dconf.

Możesz łatwo uzyskać do nich dostęp za pomocą dconf-editor:

sudo apt-get install dconf-editor

Następnie przejdź do następującej ścieżki dconf w edytorze:

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

wprowadź opis zdjęcia tutaj

Sylvain Pineau
źródło
Czy lokalizacja jest taka sama dla wszystkich wersji systemu Linux? Lub przynajmniej wszystkie wersje Ubuntu?
Anonimowy Dziobak
1
@AnonymousPlatypus: to jest lokalizacja ustawień od 14.04 (nie mogę powiedzieć o innych dystrybucjach)
Sylvain Pineau
2
To metoda graficzna, a nie z terminala
Anandu M Das
1
Co mam zrobić, jeśli mój klucz multimediów nie ma podklucza niestandardowych kluczy?
Brandon Kuczenski
Pytanie dotyczyło terminala, a nie GUI, więc odpowiedź jest nieistotna
Aleksiej Martianow
6

Dodawanie skrótów klawiszowych z wiersza poleceń w 12.04

Aby zapobiec sytuacji, w której zaakceptowana odpowiedź stanie się zbyt obszerna, opublikuj osobne rozwiązanie dla 12.04.

Do (włącznie) 12.04 niestandardowe skróty klawiszowe nie są przechowywane w dconfbazie danych, ale w ~/.gconf/desktop/gnome/keybindings(w pliku xml, w podfolderach takich jak custom0itp.).

Poniższy skrypt tworzy xmlplik i jego folder zawierający automatycznie nazwane poprawnie.

Jak używać

  1. Wklej skrypt do pustego pliku i zapisz go jako set_customshortcuts_12.py
  2. Uruchom go za pomocą polecenia:

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

    key3 jest opcjonalny, komendy mogą być na przykład:

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

    lub

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

Notatki

  • zwróć uwagę, że nazywanie klawiszy różni się od edycji ustawień ustawień. Klawisze są nazywane tak, jak pokazano w Ustawieniach systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”, o ile widzę.
  • Testowałem skrypt 12.04 pod VirtualBox; do wprowadzenia zmian konieczne było wylogowanie / zalogowanie.
#!/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")
Jacob Vlijm
źródło
1

Możesz ustawić nowy niestandardowy skrót bez skryptu python, używając sed. Musisz tylko ustawić nazwę , powiązanie i akcję do wyboru w następującym skrypcie:

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
mmai
źródło
1

Napisałem do tego skrypt. Patrz poniżej.

Zobacz użycie w creatShortcutwywołaniu.

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/']"
AlikElzin-kilaka
źródło
Byłoby idealnie, gdyby nextShortcutId mógł automatycznie wykryć, czy stare klucze już tam są (już utworzone przez inne programy), aby upewnić się, że nie ma konfliktów. Sprawdź także, czy cokolwiek innego jest związane z wprowadzonymi kluczami.
Jack Giffin
0

Uważam, że odpowiedź wysłana przez @JacobVlijm jest bardzo przydatna, zwłaszcza skrypt. Przeniesiłem kod na bash. Nie uważam, że ta funkcja jest idealna, może zawierać pewne błędy, jednak działa dla mnie.

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"
}
tukusejssirs
źródło