Como desabilitar a mudança de idioma de entrada no terminal

5

No Ubuntu 12.04 eu tenho dois idiomas de entrada instalados, inglês e russo. Eu gostaria de desabilitar o uso do idioma russo no terminal - para que, independentemente da seleção em todo o sistema, o terminal sempre tenha o idioma de entrada em inglês.

Isso é possível?

O problema é que caracteres não-ingleses digitados acidentalmente podem introduzir muita dor (especialmente os invisíveis).

ATUALIZAÇÃO:

Antes de tudo, gostaria de agradecer a todos os participantes - estou realmente animado com a rapidez com que as pessoas tentam ajudar!

Parece que tenho que declarar mais claramente o problema. O problema é que não só gostaria de ter o inglês ligado por padrão quando eu criava uma nova janela de terminal ou mudava para uma janela de terminal antiga, mas eu também queria impossibilitar a mudança do idioma do inglês para o russo dentro da janela do terminal.

Agora, os resultados.

Eu tentei o gxneur - parece que é preciso construí-lo a partir dos fontes, o que não estou pronto para tentar. Eu tentei instalá-lo com o apt-get e não consegui descobrir como configurá-lo facilmente. E não mostrou o ícone na barra de tarefas. Então eu removi isso.

Eu testei o script Python e ele para imediatamente com a seguinte saída:

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

Finalmente, eu tentei o shell script, ele roda, mas parece não funcionar - eu ainda posso facilmente mudar para o russo no terminal. E também de vez em quando diz

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

Então, apesar de tudo, não consegui fazer nenhuma solução funcionar.

Eu acho que a linha de fundo aqui é que o que eu gostaria de obter não é tão simples, então não há problema em tê-lo.

    
por oltish 16.06.2015 / 15:12

4 respostas

3

Observe a resposta abaixo

A resposta foi originalmente escrita para 14.04, mas reescrita em 6 de janeiro de 2017, para também funcionar em (pelo menos) 16.04 e 16.10. wmctrl não é mais necessário.

Script para definir automaticamente um idioma diferente para um único aplicativo.

Oquefaz

  • Executandooscriptemsegundoplano,ousuáriopodedefinirumidiomadiferenteparaumaplicativoespecífico(nessecaso,gnome-terminal).Bastaexecutaroscripte,comoaplicativonafrente,definiroidiomadesejado.
  • Oidiomaserálembrado,noscript(duranteaexecução),bemcomoemumarquivooculto,aserlembradonapróximavezemqueoscriptforexecutado(nareinicializaçãodocomputador).
  • Seousuáriodefinirofocoparaoutroaplicativo,oscriptvoltaráparaoidiomapadrão,sejaelequalfor.Alémdisso,oidiomapadrãoserálembrado,masousuáriopoderáalterá-loaqualquermomento(tambémoidiomaalteradoélembrado)

Notas

  • Oscriptusaumconjuntoestendidodeferramentas(funções)paralevaremcontaqueousuáriodevepoderalteraroconjuntodeidiomasusados,eosidiomasdevemserlembrados,comosugeridono(s)comentário(s).Noentanto,émuito"leve", pois só usa a (s) função (ões) quando é necessário.

O script

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

Como usar

  1. O script usa xdotool :

    sudo apt-get install xdotool
    
  2. Copie o script acima em um arquivo vazio, salve-o como set_language.py

  3. Teste-o pelo comando:

    python3 /path/to/set_language.py
    

    Ao executar o script:

    • defina o idioma (padrão).
    • abra o terminal (gnome-), defina o idioma a ser usado com o terminal
    • Alterne entre os dois e veja se o idioma muda automaticamente.


    Você pode alterar o idioma padrão como o idioma do terminal a qualquer momento . Os idiomas definidos serão lembrados.

  4. Se tudo funcionar como esperado, adicione-o a Aplicativos de inicialização: Adicionar a aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:

    python3 /path/to/set_language.py
    

Explicação, a história curta (conceitual):

O script usa dois arquivos para armazenar os idiomas definidos para o idioma padrão e o idioma usado no aplicativo excepcional ( gnome-terminal , neste caso, mas você pode definir qualquer aplicativo).

O script, em seguida, periodicamente (uma vez por segundo) faz dois testes:

  1. Se a janela ativa pertencer ao aplicativo excepcional
  2. Qual é o idioma de entrada atualmente definido

O script compara a situação com o (s) teste (s) um segundo atrás. Então se:

  1. houve uma mudança na aplicação:

    excepcional - > padrão : leia o arquivo de idioma para o idioma padrão & amp; Definir idioma. Se o arquivo não existir (jet), crie-o, armazene o idioma atual como padrão.
    padrão - > excepcional : o contrário.

  2. Se houve uma mudança na linguagem (mas não na classe da janela):

    Podemos supor que o usuário defina um idioma diferente para o aplicativo excepcional ou o idioma de entrada padrão - > escreva o idioma de entrada usado atualmente no arquivo correspondente (para idioma padrão ou idioma excepcional).

por Jacob Vlijm 16.06.2015 / 23:40
2

O script

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

Explicação em inglês

O script verifica a janela ativa no momento e, se a WM_CLASS corresponder à de gnome-terminal , ela alterna o idioma de entrada para o padrão ou o índice 0. Salve-o como um arquivo de texto, execute sudo chmod +x scriptname.sh e está pronto para executar.

Este script requer a instalação do programa wmctrl , que é a chave para a funcionalidade do script. Para instalá-lo, execute sudo apt-get install wmctrl .

Para fazê-lo ser executado continuamente em cada login, adicione o caminho completo ao script para Startup Applications ou crie o arquivo .desktop personalizado em /home/yourusername/.config/autostart . Uma variação do tema de usar .desktop arquivos é resposta do Takkat .

Esse script pode ser adaptado de várias maneiras. Conhecendo WM_CLASS de seu programa desejado (da saída wmctrl -lx ), você pode substituir gnome-terminal.Gnome-terminal por qualquer outra classe de programa na linha if [ "$WM_CLASS" == "string" ];then . Você também pode definir o idioma a ser forçado, conhecendo os índices de seus idiomas (apenas conte-os de cima para baixo no menu suspenso, começando em 0 com o superior) e alterando gsettings set org.gnome.desktop.input-sources current 0 . Entre outras coisas, se você adicionar várias instruções else if , existe a possibilidade de forçar idiomas diferentes em programas diferentes. O script é simples e muito flexível.

Explicação em russo

Скрипт выше следит за окнами которые активны, и если окно относится к классу gnome-terminal.Gnome-terminal , язык моментально меняется на английский.

Для того что бы этот скрипт работал требуется установка программы wmctrl - это самая важная часть, которую можно установить с командой sudo apt-get isntall wmctrl .

Для того что бы этот скрипт работал автоматически, сохраните в каком-то файле (на пример с именем myscript.sh ), поменяйте разрешения этого файла с командой sudo chmod +x /full/path/to/myscript.sh (где /full/path/to/myscript.sh это полный аддресс где находится файл), полный добавьте полный аддресс контер скрипту как одна из Startup Applications. Или же можно создать .desktop файл.

тот скрипт можно адаптировать под другие программы. Просто узнайте какой класс у той программы при промощи команды wmctrl -lx - это третий столбик в результате. Coсли есть желание, можно добавить другие программы с прибавлением конструкции else if

Fontes:

link

    
por Sergiy Kolodyazhnyy 16.06.2015 / 23:04
1

A única maneira que sei é usar o gxneur.

É buggy no Ubuntu para layout de comutação automática, mas é bom para esse tipo de configuração. A comutação automática pode ser facilmente desativada.

Você pode definir aplicativos lá, como o gnome-terminal, para ter layout único.

Você pode ler este tópico em russo pelo mantenedor do gxneur.

Mas também ficarei feliz se houver uma maneira melhor.

    
por Pilot6 16.06.2015 / 15:18
1

De repente eu encontrei uma solução muito simples, que não precisa de nenhum script.

Você pode clicar no indicador de idioma, selecionar "Configurações de entrada de texto ...".

Na janela aberta, marque a opção "Permitir fontes diferentes para cada janela" e

"Nova janela usa a fonte padrão".

Se o layout padrão for o inglês, cada aplicativo recém-aberto será iniciado com o layout em inglês, incluindo o terminal.

    
por Pilot6 17.06.2015 / 20:02