web-dev-qa-db-ja.com

ターミナルで入力言語の切り替えを無効にする方法

Ubuntu 12.04では、英語とロシア語の2つの入力言語がインストールされています。ターミナルでロシア語の使用を無効にしたいので、システム全体の選択に関係なく、ターミナルは常に英語の入力言語を使用します。

それは可能ですか?

問題は、誤って入力された英語以外の文字が多くの痛みをもたらす可能性があることです(特に目に見えないもの)。

更新:

まず第一に、私はすべての参加者に感謝したいと思います-人々がどれだけ早く助けようとするか、本当に興奮しています!

問題をより明確に述べなければならないようです。問題は、新しいターミナルウィンドウを作成するとき、または古いターミナルウィンドウに切り替えるときにデフォルトで英語をオンにしたいだけでなく、ターミナルウィンドウ内で言語を英語からロシア語に切り替えられないようにしたいことです。

さて、結果。

私はgxneurを試しました-ソースからビルドする必要があるようですが、試してみる準備はできていません。 apt-getでインストールしようとしましたが、簡単に設定する方法がわかりませんでした。また、タスクバーにアイコンが表示されませんでした。だから私はそれを削除しました。

Pythonスクリプトを試しましたが、次の出力ですぐに停止します。

No such schema 'org.gnome.desktop.input-sources'
Traceback (most recent call last):
  File "./set_language.py", line 63, in <module>
    lang_list = read_prev()
  File "./set_language.py", line 52, in read_prev
    currlang = get_lang()
  File "./set_language.py", line 24, in get_lang
    curr_n = int(get(key[1]+key[0]+key[4]).strip().split()[-1])
  File "./set_language.py", line 20, in get
    return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
  File "/usr/lib/python3.2/subprocess.py", line 522, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['/bin/bash', '-c', 'gsettings get org.gnome.desktop.input-sources current']' returned non-zero exit status 1

最後に、シェルスクリプトを試してみましたが、実行されますが、動作しないようです-ターミナルでロシア語に簡単に切り替えることができます。また、たまに言う

No such schema 'org.gnome.desktop.input-sources'

だから、すべてのすべてで、私はソリューションのいずれかを動作させることができませんでした。

ここで一番下の行は、私が取得したいものはそれほど単純ではないので、それを持っていなくても大丈夫だと思います。

6
oltish

以下の回答に関する注意

答えはもともと14.04向けに書かれていましたが、2017年1月6日に書き直され、(少なくとも)16.04と16.10でも動作するようになりました。 wmctrlは不要になりました。


単一のアプリケーションに異なる言語を自動的に設定するスクリプト。

enter image description hereenter image description here

何をする

  • バックグラウンドでスクリプトを実行すると、ユーザーは特定のアプリケーションに異なる言語を設定できます(この場合はgnome-terminal)。スクリプトを実行し、アプリケーションを前面に置いて、目的の言語を設定するだけです。
  • 言語は、スクリプト(実行中)および隠しファイルに記憶され、次回スクリプトを実行するときに(コンピューターの再起動時に)記憶されます。
  • ユーザーが別のアプリケーションにフォーカスを設定すると、スクリプトはデフォルトの言語に戻ります。また、デフォルトの言語は記憶されますが、ユーザーはいつでも変更できます(変更された言語も記憶されます)

ノート

  • このスクリプトは、ユーザーが使用言語のセットを変更できるようにする必要があることを考慮して、拡張ツール(機能)のセットを使用し、コメントで示唆されているように言語を記憶する必要があります。それにもかかわらず、必要なときにのみ関数を使用するため、非常に「軽量」です。

スクリプト

#!/usr/bin/env python3
import subprocess
import time
import os
import ast

#--- set the "targeted" exceptional application below
app = "gnome-terminal"
#---

l_file = os.path.join(os.environ["HOME"], app+"_lang")
def_lang = os.path.join(os.environ["HOME"], "def_lang")
k = ["org.gnome.desktop.input-sources", "current", "sources"]

def get(cmd):
    # helper function
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def run(cmd):
    # helper function
    subprocess.Popen(cmd)

def front():
    # see if app has active window
    front = get(["xdotool", "getactivewindow"])
    data = get(["xprop", "-id", front])
    if all([front, data]):
        return app in get(["xprop", "-id", front])
    else:
        pass

def getlang():
    # get the currently set language (from index, in case the sources are changed)
    currindex = int(get(["gsettings", "get", k[0], k[1]]).split()[-1])
    return sources[currindex]

def get_stored(file):
    # read the set language
    return sources.index(ast.literal_eval(open(file).read().strip()))

def get_sources():
    return ast.literal_eval(get(["gsettings", "get", k[0], k[2]]))

sources = get_sources()
appfront1 = None
currlang1 = getlang()

while True:
    time.sleep(1)
    appfront2 = front()
    if appfront2 != None:
        currlang2 = getlang()
        # change of frontmost app (type)
        if appfront2 != appfront1:
            if appfront2:
                try:
                    run(["gsettings", "set", k[0], k[1], str(get_stored(l_file))])
                except FileNotFoundError:
                    open(l_file, "wt").write(str(currlang2))
            Elif not appfront2:
                try:
                    run(["gsettings", "set", k[0], k[1], str(get_stored(def_lang))])
                except FileNotFoundError:
                    open(def_lang, "wt").write(str(currlang2))
        Elif currlang2 != currlang1:
            f = l_file if appfront2 else def_lang
            open(f, "wt").write(str(currlang2))

        appfront1 = appfront2
        currlang1 = currlang2

使い方

  1. スクリプトはxdotoolを使用します。

    Sudo apt-get install xdotool
    
  2. 上記のスクリプトを空のファイルにコピーし、set_language.pyとして保存します

  3. 次のコマンドでテスト実行します。

    python3 /path/to/set_language.py
    

    スクリプトの実行中:

    • (デフォルト)言語を設定します。
    • (gnome-)ターミナルを開き、ターミナルで使用する言語を設定します
    • 2つを切り替えて、言語が自動的に切り替わるかどうかを確認します。


    デフォルト言語の両方を端末言語としていつでも変更できます。設定した言語が記憶されます。

  4. すべてが期待どおりに機能する場合は、スタートアップアプリケーションに追加します:スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加。コマンドを追加します。

    python3 /path/to/set_language.py
    

説明、短い(概念的な)ストーリー:

このスクリプトは2つのファイルを使用して、デフォルト言語と例外アプリケーションで使用される言語の両方の設定言語を保存します(この場合はgnome-terminalですが、任意のアプリケーションを設定できます)。

その後、スクリプトは定期的に(1秒間に1回)2つのテストを実行します。

  1. アクティブなウィンドウが例外的なアプリケーションに属している場合
  2. 現在設定されている入力言語は何ですか

スクリプトは、状況を1秒前のテストと比較します。それから:

  1. アプリケーションに変更がありました:

    exceptional-> default:デフォルト言語の言語ファイルを読み取り、言語を設定します。ファイルが存在しない場合(jet)、作成し、現在の言語をデフォルトとして保存します。
    default-> exception:その逆。

  2. 言語に変更があった場合(ただし、ウィンドウクラスにはない場合):

    ユーザーが例外アプリケーションまたはデフォルトの入力言語のいずれかに対して異なる言語を設定したと仮定することができます->現在使用されている入力言語を対応するファイルに書き込みます(デフォルト言語または例外言語のいずれか)。

3
Jacob Vlijm

突然、スクリプトを必要としない非常に簡単なソリューションが見つかりました。

言語インジケータをクリックして、「テキスト入力設定...」を選択できます。

開いたウィンドウで、「ウィンドウごとに異なるソースを許可する」をチェックし、

「新しいウィンドウはデフォルトのソースを使用します」。

enter image description here

デフォルトのレイアウトが英語の場合、新しく開かれた各アプリケーションは、ターミナルを含む英語のレイアウトで開始されます。

1
Pilot6

私が知っている唯一の方法は、gxneurを使用することです。

Ubuntuの自動切り替えレイアウトにはバグがありますが、この種の設定には適しています。自動切り替えは簡単に無効にできます。

Gnome-terminalなどのアプリケーションを単一のレイアウトに設定できます。

Gxneurメンテナーがロシア語で このトピック を読むことができます。

しかし、もっと良い方法があれば、私も幸せになります。

1
Pilot6