如何在终端中禁用输入语言切换

如何在终端中禁用输入语言切换

在 Ubuntu 12.04 中,我安装了两种输入语言:英语和俄语。我想禁用终端中的俄语 - 这样无论系统范围的选择如何,终端都将始终使用英语输入语言。

那可能吗?

问题是,意外输入的非英文字符可能会带来很多麻烦(尤其是看不见的字符)。

更新:

首先,我要感谢所有参与者——大家如此迅速地提供帮助,我感到非常兴奋!

看来我必须更清楚地说明问题。问题是,我不仅想在创建新终端窗口或切换到旧终端窗口时默认启用英语,还想使在终端窗口内无法将语言从英语切换到俄语。

现在,看看结果。

我试过 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

最后,我尝试了 shell 脚本,它可以运行,但似乎不起作用 - 我仍然可以轻松地在终端中切换到俄语。而且它偶尔也会说

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

所以,总而言之,我无法使任何解决方案奏效。

我想这里的底线是我想要得到的东西并不是那么简单,所以没有它也没关系。

答案1


注意下面的答案

答案最初是为 14.04 编写的,但于 2017 年 1 月 6 日重写,也适用于(至少)16.04 和 16.10。wmctrl不再需要。


用于为单个应用程序自动设置不同语言的脚本。

在此处输入图片描述在此处输入图片描述

它能做什么

  • 在后台运行脚本,用户可以为特定应用程序设置不同的语言(在本例中为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-)终端,设置终端使用的语言
    • 在两者之间切换,看看语言是否自动切换。


    您可以将默认语言更改为终端语言随时。设置的语言将被记住。

  4. 如果一切正常,请将其添加到启动应用程序:添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:

    python3 /path/to/set_language.py
    

解释一下,简短的(概念性的)故事:

该脚本使用两个文件,来存储默认语言和特殊应用程序中使用的语言的设置语言(gnome-terminal在这种情况下,但您可以设置任何应用程序)。

然后脚本定期(每秒一次)执行两项测试:

  1. 如果活动窗口属于例外应用程序
  2. 当前设置的输入语言是什么

脚本会将当前情况与一秒前的测试进行比较。然后如果:

  1. 应用程序发生了变化:

    例外 --> 默认:读取语言文件以获取默认语言并设置语言。如果文件不存在(jet),则创建它,并将当前语言存储为默认语言。
    默认 --> 例外: 另一种方式。

  2. 如果语言发生了变化(但窗口类别没有变化):

    我们可以假设用户为特殊应用程序或默认输入语言设置了不同的语言 -->将当前使用的输入语言写入相应的文件(默认语言或特殊语言)。

答案2

剧本

#!/bin/bash
# Author: Serg Kolo
# Date: June 16,2015
# Description: Script to ensure terminal 
# always uses english keyboard only

# set -x

PREVIOUS=$(wmctrl -lx | awk -v search=$(printf 0x0%x $(xdotool getactivewindow)) '{ if($1~search) print $3 }' )

while [ 1 ]; do

        # get WM_CLASS of currently active window
        WM_CLASS=$(wmctrl -lx | awk -v search=$(printf 0x0%x $(xdotool getactivewindow)) '{ if($1~search) print $3 }' )
        # echo "WM_CLASS"

        # check if that is gnome-terminal and if it wasn't
        if [ "$WM_CLASS" == "gnome-terminal.Gnome-terminal" ];then
        #  is current window is different class than preious ?
        # (i.e., did we switch from somewhere else)
        #  if yes, switch language
        #  if  we're still in gnome-terminal, do nothing
                if [ "$WM_CLASS" != "$PREVIOUS" ];then
                 # alternative command setxkbmap -layout us
                 gsettings set org.gnome.desktop.input-sources current 0
                fi

        fi

        PREVIOUS=$(echo "$WM_CLASS")
        sleep 0.250
done

英文解说

脚本检查当前活动窗口,如果 WM_CLASS 匹配gnome-terminal,则将输入语言切换为默认语言或索引 0。将其保存为文本文件,运行sudo chmod +x scriptname.sh,即可执行。

此脚本需要安装wmctrl程序,这是脚本功能的关键。要安装它,请运行sudo apt-get install wmctrl

要使其在每次登录时持续运行,请将脚本的完整路径添加到启动应用程序或.desktop在中创建自定义文件。使用文件/home/yourusername/.config/autostart主题的变体是.desktopTakkat 的回答

此脚本可以以多种方式进行调整。了解所需程序的 WM_CLASS(来自输出wmctrl -lx),您可以替换行gnome-terminal.Gnome-terminal中的任何其他程序类if [ "$WM_CLASS" == "string" ];then。您还可以通过了解语言的索引(只需在下拉菜单中从上到下计数,从顶部开始从 0 开始)并更改来设置要强制使用的语言gsettings set org.gnome.desktop.input-sources current 0。除此之外,如果您添加多个else if语句,则可以在不同的程序中强制使用不同的语言。该脚本简单且非常灵活。

俄语解释

请记住,如果您要创建帐户并希望以最低的价格购买,则可能会收取您的费用gnome-terminal.Gnome-terminal

除此之外,您还可以享受这项服务提供的服务 - 在您下次购买时,请先阅读并理解并同意我们的使用wmctrl条款sudo apt-get isntall wmctrl

除此之外,您还可以编写自己的脚本,使用 JavaScript(在 JavaScript 中)来创建自己的脚本myscript.shsudo chmod +x /full/path/to/myscript.sh在 /full/path/to/myscript.sh 中,使用 JavaScript 编写自己的脚本),并在脚本中添加自己的脚本就像启动应用程序一样。我仍然喜欢.desktop这部电影。

我已经建立了一个移动应用程序来提供一些有用的功能。请使用下面任何一种符合您喜好的语法规则来编写代码 - wmctrl -lx 并按照此语法规则编写代码。如果你想成为时尚达人,不妨看看以下这些与时尚相关的文章else if

资料来源:

https://askubuntu.com/a/414041/295286

答案3

我知道的唯一方法是使用 gxneur。

Ubuntu 的自动切换布局功能存在缺陷,但对于此类设置来说还是不错的。自动切换功能可以轻松禁用。

您可以设置诸如 gnome-terminal 之类的应用程序以具有单一布局。

你可以阅读这个话题由 gxneur 维护者以俄语撰写。

但如果有更好的方法,我也会很高兴。

答案4

突然我发现了一个非常简单的解决方案,不需要任何脚本。

您可以点击语言指示器,选择“文本输入设置...”。

在打开的窗口中,选中“允许每个窗口使用不同的来源”,然后

“新窗口使用默认源”。

在此处输入图片描述

如果默认布局是英文,则每个新打开的应用程序都将以英文布局启动,包括终端。

相关内容