Як встановити спеціальні ярлики клавіатури з терміналу?


56

Як встановити спеціальні ярлики клавіатури з терміналу для різних версій Linux?

В основному я хочу знати, де Linux зберігає файли ярликів клавіатури та як їх можна редагувати.

Під час мого дослідження я знайшов файл, ~/.config/compiz-1/compizconfigале він був більше або схожий на зашифрований, коли я намагався відкрити його nano.


Зверніть увагу, що системи XFCE / Xubuntu вже є відповідь тут
Улад Kasach

Відповіді:


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

    (майте на увазі подвійні цитати)

    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
Відмінна відповідь. Для цього сценарію мені потрібно 100 кнопок. ;)
Ананду М Дас

@JacobVlijm Не могли б ви пояснити трохи про частину комбінації клавіш ? Що означає цей тег <primary>? І замість літери g я можу замінити будь-яку букву, яку я думаю, риту?
Анонімний Платипус

1
@VladK ai, xubuntu, може бути, що ярлики xubuntu (все-таки) встановлені у файлі xml. Мені доведеться шукати. Якщо так, нам потрібно знову відкрити ваше запитання, позначене як xubuntu.
Яків Влійм

1
Дякую, @JacobVlijm, я спробував це. І я просто дізнаюся, що моя помилка була помилкою. Тут є справді хитрість. custom-keybindingне повинен містити "s" в кінці, коли всередині схеми. Але він повинен містити "s", коли він виступає в якості ключа або в шляху. В іншому випадку команда "set" викине виняток. Отже, будь ласка, видаліть "s" custom-keybindingу схемі. Крім того, ваш сценарій python також повинен бути оновлений.
e-хмара

2
FYI, у вашому скрипті Python є помилка. Якщо не встановлено комбінації клавіш, 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щоб дамп всього подконтура на стандартний висновок. Вихід у форматі, подібному до ключових файлів, зі значеннями у синтаксисі GVariant.
Пабло А

10

Усі налаштування користувацьких комбінацій клавіш зберігаються в базі даних dconf.

Ви можете легко отримати доступ до них за допомогою dconf-editor:

sudo apt-get install dconf-editor

Потім перейдіть до наступного шляху dconf у редакторі:

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

введіть тут опис зображення


Чи розташування однакове для всіх версій Linux? Або принаймні всі версії Ubuntu?
Анонімний Платипус

1
@AnonymousPlatypus: це місце налаштувань з 14.04 (я не можу сказати для іншого дистрибутива)
Sylvain Pineau

2
Це графічний метод, а не з терміналу
Anandu M Das

1
Що робити, якщо на моїй клавіші медіа-клавіш немає підрозділу прив'язки клавіш?
Брендон Куценський

Питання стосувалося терміналу, а не GUI, тому відповідь не має значення
Олексій Мартьянов

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

Ви можете встановити новий спеціальний ярлик без сценарію python, використовуючи 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 міг автоматично виявити, якщо старі ключі вже є (вже створені іншими програмами), щоб переконатися, що немає конфліктів. Також перевірте, чи немає нічого іншого, пов'язаного із введеними клавішами.
Джек Гіффін

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.