Я хочу выполнить следующие команды:
xmodmap -e "keycode 52=y"
xmodmap -e "keycode 29=z"
каждый раз, когда я переключаю свою раскладку клавиатуры (Shift+Alt). Там какой-либо путь состоит в том, чтобы сделать это?
По умолчанию входной источник Ubuntu установлен в названной базе данных gsettings
. Каждой установке связали определенную схему с ним. В частности, переключение языка связано с org.gnome.desktop.input-sources
схема. Это - то, которым мы интересуемся для всех современных версий Ubuntu.
Строго говоря, мы интересуемся его ключом current
. При изменении языка через GUI тот ключ изменяется. Существует много вещей, которые можно сделать с ним от переключения входного языка в командной строке к определению ярлыков для каждого метода ввода, даже устанавливание метода ввода для каждого отдельного приложения может быть сделано. Один способ сделать так через gsettings
команда или dconf
команда. Это внешние программы, которые живут в Вашем /usr/bin/
папка (это - тот же метод, который ответ Jacob использует). Иначе, через определенный набор утилит (API на самом деле) для языка программирования Python. Это - метод, который я покажу в своем ответе.
Это должно быть отмечено это gsettings
не всегда работает. Если Вы используете нестандартный метод ввода, такой как fcitx
например, это не могло бы быть верно. На самом деле sogou-система-транслитерации-китайских-иероглифов (китайский метод ввода) использует что-то еще известное как dbus
, так приближаются с gsettings
не будет работать. Но для простого случая, где у Вас есть Ubuntu по умолчанию, gsettings
база данных достаточна.
Путем Jacob делает это через единственное выполнение внешних gsettings
команда и ярлыки изменения, такие, что каждый раз Вы нажимаете ярлык, прогоны программы. Уже существует другой подход, через существующий Gio
API. Этот тип API использовался бы при разработке надлежащего настольного приложения для Ubuntu или другой системы, которая использует связанный с GNOME рабочий стол. Сценарий ниже иллюстрирует подход с Gio
API.
#!/usr/bin/env python
from __future__ import print_function
from gi.repository import Gio, GObject
import subprocess
def on_changed(settings, key):
# This will run if specific key of a schema changed
print("Language changed")
# Do something else here, for example call external program
subprocess.call(['xmodmap','-e', 'keycode 52=y'])
subprocess.call(['xmodmap','-e', 'keycode 29=z'])
def main():
# We're focusing on this specific schema
settings = Gio.Settings("org.gnome.desktop.input-sources")
# Once the "current" key changes, on-changed function will run
settings.connect("changed::current", on_changed)
loop = GObject.MainLoop()
loop.run()
if __name__ == "__main__":
main()
Существуют явные преимущества к этому подходу по вмешательству с ярлыками:
Существуют некоторые проблемы в комментариях из другого плаката, но в то время как это - персистентный сценарий, также работает в его пользу. Худые ресурсы, которые это действительно использует значительно, перевешивают факт, это съест часть процента RAM.
Я - испуганные источники переключения, созданный в функции Единицы, которая не доступна как cli опция снаружи. Однако это не означает, что у нас нет опций достигнуть точно, что Вы хотите.
Замена исходного ярлыка
Входные источники могут быть выбраны командой:
gsettings get org.gnome.desktop.input-sources sources
Вывод похож:
[('xkb', 'us+intl'), ('xkb', 'us'), ('xkb', 'nl'), ('xkb', 'be')]
Расположение может быть установлено с командой:
gsettings set org.gnome.desktop.input-sources current <index>
Таким образом, мы можем заменить сочетание клавиш версией в виде сценария, чтобы переключиться на следующий язык и выполнить Вашу команду одновременно.
#!/usr/bin/env python3
import subprocess
import ast
import sys
arg = sys.argv[1]
key = "org.gnome.desktop.input-sources"
def get(cmd): return subprocess.check_output(cmd).decode("utf-8")
def run(cmd): subprocess.call(["/bin/bash", "-c", cmd])
langs = len(ast.literal_eval(get(["gsettings", "get", key, "sources"])))
currlang = int(get(["gsettings", "get", key, "current"]).split()[-1].strip())
if arg == "+":
next_lang = currlang+1 if currlang < langs-1 else 0
elif arg == "-":
next_lang = currlang-1 if currlang > 0 else langs-1
for cmd in [
"gsettings set "+key+" current "+str(next_lang),
'xmodmap -e "keycode 52=y"',
'xmodmap -e "keycode 29=z"',
]: run(cmd)
change_lang.py
Тестовый прогон сценарий командой:
python3 /path/to/change_lang.py +
и дополнительно:
python3 /path/to/change_lang.py -
Ваше расположение должно измениться, и Ваши команды должны работать.
Если все хорошо работает, Настройки открытой системы, перейдите к "Клавиатуре"> "Ярлыки"> "Ввод". Нажмите на ярлык, чтобы переключить источник (справа, установить ярлык) и поразить клавишу Backspace для отключения ярлыка.
Теперь добавьте тот же ярлык на пользовательские ярлыки: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:
python3 /path/to/change_lang.py +
К ярлыку Вы просто отключили на шаге 2.
Дополнительно можно установить ярлык на перемещение наоборот (установите предыдущий источник из списка):
python3 /path/to/change_lang.py -
Именно. Теперь изменение языка объединено с командой, которую Вы хотите выполнить вперед.
Каждый раз, когда Ваш ярлык нажимается, сценарий называют, смотря, что является текущим языком командой:
gsettings get org.gnome.desktop.input-sources current
Сценарий впоследствии перемещается в следующий или предыдущее, в зависимости от аргумента, командой:
gsettings set org.gnome.desktop.input-sources current <index>
Используя gsettings
является чрезвычайно низким на соке, и путем объединения команды для установки языка с командами, сценарий только работает при изменении языка.
Я полагаю, что это - самый изящный путь и, хотя Вы не заметите в своем счете на электроэнергию на длительном сроке самое низкое на ресурсах. Выбором между постоянно рабочим процессом, с помощью API или run-when-called опции является вопрос вкуса как бы то ни было.
Обратите внимание также, что сценарий сначала изменяет язык и затем выполняет другие команды. Нет никакого заметного различия в ответ в двух ответах вообще.