次のコマンドを実行したい:
xmodmap -e "keycode 52=y"
xmodmap -e "keycode 29=z"
キーボードレイアウトを切り替えるたびに(Shift+Alt)。それを行う方法はありますか?
デフォルトでは、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
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 __== "__main__":
main()
この方法には、ショートカットの干渉よりも明確な利点があります。
他のポスターからのコメントにはいくつかの懸念がありますが、これは永続的なスクリプトですが、その恩恵もあります。それが消費するわずかなリソースは、RAMの何分の1かを消費するという事実をはるかに上回っています。
ソースの切り替えは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)
change_lang.py
として保存します次のコマンドでスクリプトをテスト実行します:
python3 /path/to/change_lang.py +
オプションで:
python3 /path/to/change_lang.py -
レイアウトが変更され、コマンドが実行されるはずです。
すべてが正常に機能する場合は、[システム設定]を開き、[キーボード]> [ショートカット]> [入力]に移動します。ショートカットをクリックしてソースを切り替え(右側でショートカットを設定)、バックスペースを押してショートカットを無効にします。
同じショートカットをカスタムショートカットに追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します。
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つの回答の応答に目立った違いはありません。