Je veux exécuter les commandes suivantes:
xmodmap -e "keycode 52=y"
xmodmap -e "keycode 29=z"
chaque fois que je change la disposition de mon clavier (Shift+Alt). Y'a-t'il un quelconque moyen d'y arriver?
Par défaut, la source d'entrée d'Ubuntu est définie dans une base de données appelée gsettings
. Chaque paramètre est associé à un schéma spécifique. En particulier, la commutation de langue est associée au schéma org.gnome.desktop.input-sources
. C’est celui qui nous intéresse pour toutes les versions modernes d’Ubuntu.
Plus spécifiquement, nous nous intéressons à sa clé current
. Lorsque vous changez de langue via l'interface graphique, cette clé est modifiée. Vous pouvez faire beaucoup de choses avec, de changer de langue d’entrée en ligne de commande à définir des raccourcis pour chaque méthode de saisie , voire définir une méthode de saisie pour chaque personne). app peut être fait. Une façon de le faire consiste à utiliser la commande gsettings
ou la commande dconf
. Ce sont des programmes externes qui résident dans votre dossier /usr/bin/
(c'est la même méthode que celle utilisée par la réponse de Jacob). Une autre manière consiste à utiliser un ensemble spécifique d’utilitaires (en réalité les API) pour le langage de programmation Python. C'est la méthode que je vais montrer dans ma réponse.
Il est à noter que gsettings
ne fonctionne pas toujours. Si vous utilisez une méthode d'entrée non standard, telle que fcitx
par exemple, il se peut que cela ne soit pas vrai. En fait, sogou-pinyin (méthode de saisie en chinois) utilise quelque chose d'autre appelé dbus
, donc l'approche avec gsettings
ne fonctionnera pas. Mais dans le cas simple où vous avez Ubuntu par défaut, la base de données gsettings
est suffisante.
Jacob utilise une seule commande externe gsettings
et modifie des raccourcis, de sorte que le programme s'exécute chaque fois que vous cliquez dessus. Il existe une autre approche, via l'API Gio
déjà existante. Ce type d'API serait utilisé lorsque vous développez une application de bureau appropriée pour Ubuntu ou un autre système utilisant un bureau lié à GNOME. Le script ci-dessous illustre l'approche avec l'API Gio
.
#!/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 __== "__main__":
main()
Cette approche présente des avantages distincts par rapport à l’interférence des raccourcis:
Il y a quelques inquiétudes dans les commentaires de l’autre affiche mais bien qu’il s’agisse d’un script persistant, il joue également en sa faveur. Les maigres ressources qu'elle consomme l'emportent largement sur le fait qu'il consommera une fraction de un pour cent de la mémoire vive.
Je crains que le changement de source ne soit une fonction intégrée de Unity, qui n’est pas disponible en option client de l’extérieur. Cependant , cela ne signifie pas que nous ne disposons d'aucune option pour réaliser exactement ce que vous voulez.
Remplacement du raccourci d'origine
Les sources d'entrée peuvent être récupérées par la commande:
gsettings get org.gnome.desktop.input-sources sources
La sortie ressemble à:
[('xkb', 'us+intl'), ('xkb', 'us'), ('xkb', 'nl'), ('xkb', 'be')]
La mise en page peut être définie avec la commande:
gsettings set org.gnome.desktop.input-sources current <index>
De cette façon, nous pouvons remplacer le raccourci clavier par une version scriptée pour passer à la langue suivante et exécuter votre commande de la même manière. temps.
#!/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
Test - lancez le script avec la commande:
python3 /path/to/change_lang.py +
et éventuellement:
python3 /path/to/change_lang.py -
Votre mise en page devrait changer et vos commandes devraient s'exécuter.
Si tout fonctionne correctement, ouvrez Paramètres système, allez à "Clavier"> "Raccourcis"> "Saisie". Cliquez sur le raccourci pour changer de source (à droite, pour définir le raccourci), puis appuyez sur la touche de retour arrière pour désactiver le raccourci.
Ajoutez maintenant le même raccourci aux raccourcis personnalisés: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:
python3 /path/to/change_lang.py +
Au raccourci que vous venez de désactiver à l’étape 2.
De plus, vous pouvez définir un raccourci pour vous déplacer en sens inverse (définir la source précédente de la liste):
python3 /path/to/change_lang.py -
C'est ça. Maintenant, le changement de langue est combiné à la commande que vous souhaitez exécuter.
Chaque fois que vous appuyez sur votre raccourci, le script est appelé à la recherche de la langue actuelle par la commande:
gsettings get org.gnome.desktop.input-sources current
Le script passe ensuite au suivant, ou au précédent, en fonction de l'argument, à l'aide de la commande:
gsettings set org.gnome.desktop.input-sources current <index>
L'utilisation de gsettings
est extrêmement faible en jus et, en combinant la commande pour définir la langue avec vos commandes, le script ne s'exécute que lors du changement de langue .
Je pense que c’est le moyen le plus élégant et, bien que vous ne remarquiez pas sur votre facture d’électricité, le plus bas sur le long terme. Le choix entre un processus en cours d'exécution, utilisant l'API, ou une option d'exécution à la demande est cependant une question de goût.
Notez également que le script change d'abord de langue, puis exécute les autres commandes. Il n'y a aucune différence notable dans la réponse dans les deux réponses que ce soit.