Как установить пользовательские сочетания клавиш из терминала?
Как настроить пользовательские сочетания клавиш из терминала для разных версий Linux?
В основном я хочу знать, где Linux хранит файлы сочетаний клавиш и как их можно редактировать.
На моем исследовании я нашел файл ~/.config/compiz-1/compizconfig
но он был более или менее зашифрован, когда я пытался открыть его nano
,
10 ответов
Добавление сочетаний клавиш в два этапа из командной строки (14.04+)
Добавление пользовательских ярлыков из командной строки может быть сделано, но это немного сложно; это должно быть сделано в несколько шагов за связывание клавиш. С другой стороны, это довольно просто и очень хорошо может быть написано в сценарии, если вы как-то хотите сделать это из командной строки (вот в чем вопрос, верно?).
Как и в вашем интерфейсе (Системные настройки> "Клавиатура" > "Сочетания клавиш" > "Пользовательские сочетания клавиш"), настраиваемые сочетания клавиш создаются из командной строки в два этапа:
создайте привязку клавиш, отредактировав (добавив к-) список, который возвращается командой:
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
установить его свойства:
название:
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
и т.п.
Существует простой способ сделать это с помощью 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
)!
Все пользовательские настройки сочетаний клавиш хранятся в базе данных dconf.
Вы можете легко получить к ним доступ с dconf-editor
:
sudo apt-get install dconf-editor
Затем перейдите по следующему пути dconf в редакторе:
/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/
Добавление сочетаний клавиш из командной строки в 12.04
Чтобы принятый ответ не стал слишком обширным, выложите отдельное решение на 12.04.
До (и включая) 12.04 пользовательские сочетания клавиш не сохраняются в dconf
базы данных, но в ~/.gconf/desktop/gnome/keybindings
(в XML-файле, в подпапках, как custom0
так далее).
Сценарий ниже создает xml
файл и соответствующая ему папка, автоматически называются правильно.
Как пользоваться
- Вставьте скрипт в пустой файл, сохраните его как
set_customshortcuts_12.py
Запустите его с помощью команды:
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><'+keys[0]+'>'+keys[1]+'</stringvalue>')
else:
keyfile.insert(9, '\t\t<stringvalue><'+keys[0]+'><'+keys[1]+'>'+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")
Я отказался от использования
dconf
и инструмент настройки, я использую kbindkeys с ~/.xbindkeysrc и добавляю все свои собственные сочетания клавиш, он намного более портативен.
Сначала установите xbindkeys
$ sudo apt install xbindkeys
Создавайте файлы.xbindkeysrc по умолчанию только в первый раз, в следующий раз скопируйте их себе домой.
$ xbindkeys --defaults > ~/.xbindkeysrc
Поместите свои горячие клавиши в.xbindkeysrc, например, используйте Ctrl+Shift+F, чтобы перейти к следующей музыке в Spotify:
"dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next" m:0x19 + c:41
Другой вызов gnome-Calculator с помощью Ctrl+Alt+Super+c помещает строку выше в.xbindkeysrc:
Control+Alt+Mod2+Mod4 + c
Формат xbindkeys прост: первая строка - это команда, а вторая - сочетание клавиш.
Чтобы найти комбинацию клавиш, используйте:
$ xbindkeys -k
и нажмите клавиши.
Не забудьте перезапустить xbindkeys при добавлении новых сочетаний клавиш.
Сохранить пользовательские сочетания клавиш
Вы можете сохранять / создавать резервные копии / экспортировать пользовательские ярлыки / ставки, используя только dconf
а также
sed
Экспорт
dconf dump / | sed -n '/\[org.gnome.settings-daemon.plugins.media-keys/,/^$/p' > custom-shortcuts.ini # Export
Импортировать
dconf load / < custom-shortcuts.ini # Import
Для резервного копирования вы можете использовать
custom-shortcuts-$(date -I).ini
Обратите внимание, что
dconf
по умолчанию читает user-db и выводит только значения, отличные от значений по умолчанию (выделены жирным шрифтомdconf-editor
)Только для добавленных пользовательских ярлыков
На основе ответа Чиро (также здесь)
Проверьте, работает ли он, сбросив этот путь до значений по умолчанию перед импортом
gsettings reset-recursively org.gnome.settings-daemon.plugins.media-keys
Таким же образом вы можете сделать резервную копию, например, установки расширения GNOME Shell:
dconf dump / | sed -n '/\[org.gnome.shell.extensions.system-monitor\]/,/^$/p' > extensions-system-monitor-$(date -I).conf
Написал скрипт для этого. Увидеть ниже.
Смотрите использование в 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/']"
Вы можете установить новый пользовательский ярлык без скрипта 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
Я нашел ответ, написанный @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"
}
Вот скрипт Python, который использует привязки PyGObject вместо вызова
gsettings
и разбор вывода. Когда привязка клавиш с таким именем уже существует, она заменяет ее, а не добавляет дубликат.
#!/usr/bin/env python3
import sys
from gi.repository import Gio, GLib
media_keys_schema = "org.gnome.settings-daemon.plugins.media-keys"
custom_keybinding_schema = "org.gnome.settings-daemon.plugins.media-keys.custom-keybinding"
keybinding_path_prefix = "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/"
usage_message = '''Usage: {cmd} <name> <command> <binding>
Example:
{cmd} "Open gedit" "gedit" "<Shift><Ctrl>G"
'''.format(cmd=sys.argv[0])
def main():
if len(sys.argv) < 4:
sys.exit(usage_message)
name = sys.argv[1]
command = sys.argv[2]
binding = sys.argv[3]
settings = Gio.Settings(schema=media_keys_schema)
binding_paths = settings.get_value("custom-keybindings").unpack() # type: list[str]
# Figure out which path to use for the new binding. If a binding
# of the same name already exists, we replace it.
path = find(binding_paths, name)
if not path:
# Use the first gsettings path that doesn't exist yet
n = 0
path = keybinding_path_prefix + f"custom{n}/"
while path in binding_paths:
n += 1
path = keybinding_path_prefix + f"custom{n}/"
# Create the new keybinding
setting = Gio.Settings(schema=custom_keybinding_schema, path=path)
setting.set_string("name", name)
setting.set_string("command", command)
setting.set_string("binding", binding)
setting.sync()
if path not in binding_paths:
# Add the new keybinding to the list of custom keybindings
binding_paths.append(path)
settings.set_value("custom-keybindings", GLib.Variant("as", binding_paths))
setting.sync()
def find(binding_paths: list[str], name: str) -> str:
for path in binding_paths:
setting = Gio.Settings(schema=custom_keybinding_schema, path=path)
setting_name = setting.get_value("name").unpack()
if setting_name == name:
return path
if __name__ == "__main__":
main()