Как установить пользовательские сочетания клавиш из терминала?

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 тоже должен обновиться.
Электронное облако
2
К вашему сведению, ваш скрипт на 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.
Мигельморин
Также 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 (я не могу сказать о других дистрибутивах)
Сильвен Пино
2
Это графический метод, а не из терминала
Ананду М Дас
1
Что мне делать, если у моего ключа мультимедийных клавиш нет подраздела настраиваемых сочетаний клавиш?
Брэндон Кученски
Вопрос был о терминале, а не о графическом интерфейсе, поэтому ответ не имеет значения
Алексей Мартианов
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 
    

Примечания

  • Обратите внимание, что наименование клавиш отличается от редактирования настроек. Насколько я вижу, клавиши называются так, как они отображаются в Системных настройках> «Клавиатура»> «Сочетания клавиш»> «Пользовательские сочетания клавиш».
  • Я тестировал скрипт 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
mmai
источник
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/']"
AlikElzin-kilaka
источник
Было бы идеально, если бы 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"
}
tukusejssirs
источник