Как инициировать автоматическое выполнение команд на переключатель раскладки клавиатуры?

Я хочу выполнить следующие команды:

xmodmap -e "keycode 52=y"
xmodmap -e "keycode 29=z"

каждый раз, когда я переключаю свою раскладку клавиатуры (Shift+Alt). Там какой-либо путь состоит в том, чтобы сделать это?

5
задан 28 February 2017 в 05:49

2 ответа

Как переключение языка реализовано на Ubuntu

По умолчанию входной источник 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()

Существуют явные преимущества к этому подходу по вмешательству с ярлыками:

  • Вы не должны редактировать ярлыки. Я не переиграю это, но установка для этого ответа просто заставляет сценарий автоматически запустить, когда Вы входите в систему.
  • Поскольку это использует событие GIO API, мы не гудим на gsettings дважды каждый раз, когда мы изменяем язык. Мы позволяем языку измениться, происходят, как он имел бы, всегда происходили. Это делает его быстрее и менее интенсивно использующий ресурсы при изменении языков.
  • Поскольку это всегда слушает, мы никогда не оставляемся, ожидая Python, чтобы надеть его брюки и загрузить сценарий. Это загружается однажды при входе в систему, и затем это готово к изменениям.
  • Поскольку это использует API, что-либо еще, что изменяет входной язык (значки меню, gsettings) запустит событие и поэтому этот сценарий.

Существуют некоторые проблемы в комментариях из другого плаката, но в то время как это - персистентный сценарий, также работает в его пользу. Худые ресурсы, которые это действительно использует значительно, перевешивают факт, это съест часть процента RAM.

10
ответ дан 23 November 2019 в 08:40

Файл выполняется?

Я - испуганные источники переключения, созданный в функции Единицы, которая не доступна как 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)

Настроить

  1. Скопируйте сценарий в пустой файл, сохраните его как change_lang.py
  2. Тестовый прогон сценарий командой:

    python3 /path/to/change_lang.py +
    

    и дополнительно:

    python3 /path/to/change_lang.py -
    

    Ваше расположение должно измениться, и Ваши команды должны работать.

  3. Если все хорошо работает, Настройки открытой системы, перейдите к "Клавиатуре"> "Ярлыки"> "Ввод". Нажмите на ярлык, чтобы переключить источник (справа, установить ярлык) и поразить клавишу Backspace для отключения ярлыка.

    enter image description here

  4. Теперь добавьте тот же ярлык на пользовательские ярлыки: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

    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 опции является вопрос вкуса как бы то ни было.

Обратите внимание также, что сценарий сначала изменяет язык и затем выполняет другие команды. Нет никакого заметного различия в ответ в двух ответах вообще.

8
ответ дан 23 November 2019 в 08:40

Другие вопросы по тегам:

Похожие вопросы: