web-dev-qa-db-ja.com

キーボードレイアウトの切り替え時にコマンドの自動実行を開始する方法は?

次のコマンドを実行したい:

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

キーボードレイアウトを切り替えるたびに(Shift+Alt)。それを行う方法はありますか?

Ubuntuでの言語切り替えの実装方法

デフォルトでは、Ubuntuの入力ソースはgsettingsというデータベースに設定されています。各設定には、特定のスキーマが関連付けられています。特に、言語の切り替えはorg.gnome.desktop.input-sourcesスキーマに関連付けられています。これは、最新のすべてのUbuntuバージョンで私たちが興味を持っているものです。

具体的には、そのキーcurrentに興味があります。 GUIを使用して言語を変更すると、そのキーが変更されます。 コマンドラインでの入力言語の切り替え から 各入力方法のショートカットの定義 、さらには 各個人の入力方法の設定) app 実行できます。そのための1つの方法は、gsettingsコマンドまたはdconfコマンドを使用することです。これらは/usr/bin/フォルダーにある外部プログラムです(これはJacobの答えが使用するのと同じ方法です)。別の方法は、Pythonプログラミング言語用の特定のユーティリティセット(実際にはAPIのセット)を使用することです。これが私の答えで示す方法です。

gsettingsは常に機能するとは限らないことに注意してください。たとえば、fcitxなどの非標準の入力メソッドを使用している場合、それは正しくない可能性があります。実際、 sogou-pinyin (中国語の入力方法)はdbusとして知られる何かを使用するため、gsettingsを使用したアプローチは機能しません。ただし、デフォルトのUbuntuがある単純な場合には、gsettingsデータベースで十分です。

入力方法の変更を検出する

Jacobが行う方法は、外部gsettingsコマンドを1回実行し、ショートカットを変更して、ショートカットをクリックするたびにプログラムが実行されるようにすることです。既存のGio AP​​Iを介した別のアプローチがあります。このタイプのAPIは、UbuntuまたはGNOME関連デスクトップを使用する他のシステム用の適切なデスクトップアプリケーションを開発するときに使用されます。以下のスクリプトは、Gio AP​​Iを使用したアプローチを示しています。

#!/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()

この方法には、ショートカットの干渉よりも明確な利点があります。

  • ショートカットを編集する必要はありません。私はこれを誇張しませんが、この答えのセットアップはスクリプトを作成するだけです ログイン時に自動的に起動します
  • GIOイベントAPIを使用しているため、言語を変更するたびにgsettingsを2回呼び出すことはありません。私たちは、いつも起こっていたであろう言語の変更をさせました。これにより、言語を変更するときに、より速く、より少ないリソースが必要になります。
  • 常にリッスンしているため、Pythonがズボンを着用してスクリプトをロードするのを待つことはありません。ログイン時に一度ロードすると、変更の準備が整います。
  • APIを使用しているため、anythingそれ以外の場合は入力言語(メニューアイコン、gsettings)を変更し、イベント、したがってこのスクリプトを起動します。

他のポスターからのコメントにはいくつかの懸念がありますが、これは永続的なスクリプトですが、その恩恵もあります。それが消費するわずかなリソースは、RAMの何分の1かを消費するという事実をはるかに上回っています。

10

実行されているファイル?

ソースの切り替えはUnityのビルトイン機能であり、外部からの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. すべてが正常に機能する場合は、[システム設定]を開き、[キーボード]> [ショートカット]> [入力]に移動します。ショートカットをクリックしてソースを切り替え(右側でショートカットを設定)、バックスペースを押してショートカットを無効にします。

    enter image description here

  4. 同じショートカットをカスタムショートカットに追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します。

    python3 /path/to/change_lang.py +
    

    手順2で無効にしたショートカットへ。

    さらに、canショートカットを設定して反対方向に移動できます(リストから以前のソースを設定):

    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を使用して常に実行されるプロセス、または呼び出されたときに実行されるオプションの選択は好みの問題です。

また、スクリプトは最初に言語を変更してから、他のコマンドを実行することにも注意してください。 2つの回答の応答に目立った違いはありません。

8
Jacob Vlijm