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


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

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.