特定のアプリケーションにデフォルトのキーボード言語を割り当てることはできますか?常にデフォルトのキーボード言語でアプリケーションを起動するオプションがあることは知っていますが、これは私が望むものではありません。
CompizConfigを使用して設定できる「固定ワークスペース」に似たものを探しています(X1Y1、X2Y1などのターミナルで常に開くようにChromeを設定します)。 Chrome:チェコ語、ターミナル:英語、Spotify:英語、...を設定する場所.
はじめに
以下のスクリプトは、言語メニューでのその言語の位置に従って、各ユーザー定義プログラムの言語を設定します。たとえば、注文が英語(1)、中国語(2)、ロシア語(3)の場合、Firefoxで言語2、ターミナル1に言語1、LibreOfficeに言語3を設定できます。
スクリプトには2つの部分があります。パート1はジョブを実行する実際のスクリプトで、2番目のスクリプトは制御要素として機能します。アイデアは、言語設定スクリプトを スタートアップアプリケーション として実行し、言語を手動で変更する必要があるときはいつでも、コントローラースクリプトへのショートカットをダブルクリックすることです。
前提条件
Sudo apt-get install wmctrl
でwmctrl
プログラムをインストールします。スクリプト
#!/bin/sh
# Author: Serg Kolo
# Date: August 4, 2015
# Description: This script forces assigned input languages
# for specific windows
# Version:2
# Use this part to set programs and their respective languages
# PROG_CLASS or a running window can be found with the
# wmctrl -lx command
# If you want to add another program to the list,
# follow the template PROG_CLASS_num=window.Class
# and bellow that $LANGnum=num
PROG_CLASS_1=gedit.Gedit
LANG1=2
PROG_CLASS_2=gnome-terminal-server.Gnome-terminal
LANG2=0
PROG_CLASS_3=Navigator.Firefox
LANG3=1
# While loop below gets the job done.
# If you need to send languages for more programs - copy
# the first entry and replace $PROG_CLASS_1 with $PROG_CLASS_num
# where num is respective number of a program
# Replace $LANGnum with the respective language number. After the "="
# post positional number of the language you want to use.
# Remember the count starts from 0
while [ 1 ];do
WM_CLASS=$(wmctrl -lx | awk -v search=$(printf %x $(xdotool getactivewindow)) '{ if($1~search) print $3 }' )
CURRENT=$(gsettings get org.gnome.desktop.input-sources current| awk '{print $2}')
case $WM_CLASS in
$PROG_CLASS_1)
if [ $CURRENT -ne $LANG1 ];then
gsettings set org.gnome.desktop.input-sources current $LANG1
fi
;;
$PROG_CLASS_2)
if [ $CURRENT -ne $LANG2 ];then
gsettings set org.gnome.desktop.input-sources current $LANG2
fi
;;
$PROG_CLASS_3)
if [ $CURRENT -ne $LANG3 ];then
gsettings set org.gnome.desktop.input-sources current $LANG3
fi
;;
esac
sleep 0.250
done
コントローラースクリプト
#!/bin/sh
# set -x
# Author: Serg Kolo
# Date: August 8, 2015
# Description: Controller script for set-lang.sh script
# Allows pausing and resuming execution of set-lang.sh
STATUS=$(ps -o stat -p $(pgrep -o set-lang.sh) | awk '{getline;print }')
case $STATUS in
T) kill -CONT $(pgrep set-lang.sh)
notify-send 'RESUMED'
;;
S) kill -STOP $(pgrep set-lang.sh)
notify-send 'STOPED'
;;
*) exit ;;
esac
set-lang.shスクリプトのランチャー(.desktop)ファイル
[Desktop Entry]
Name=set-lang.sh
Comment=Script to set languages
Exec=/home/yourusername/bin/set-lang.sh
Type=Application
StartupNotify=true
Terminal=false
set-lang-controller.shのランチャー(.desktop)ファイル
[Desktop Entry]
Name=lang-control
Comment=Shortcut to controlling script
Exec=/home/yourusername/bin/set-lang-control.sh
Type=Application
StartupNotify=true
Terminal=false
スクリプトを機能させる
bin
というフォルダーを作成します。ファイルマネージャーで実行するか、ターミナルでコマンドmkdir $HOME/bin
を使用します。bin
フォルダーに、set-lang.sh
とset-lang-control.sh
の2つのファイルを作成します。スクリプトをset-lang.sh
に保存し、コントローラースクリプトをset-lang-control.sh
に保存します。 Sudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
で両方のスクリプトを実行可能にします.desktop
ファイルを作成します。 1つはset-lang.desktop
です。非表示の.config/autostart
ディレクトリに配置する必要があります。 2番目はset-lang-controller.desktop
で、bin
フォルダーに配置できます。次に、set-lang-controller.desktop
ファイルをランチャーにドラッグして固定します。これは、スクリプトの実行を一時的に停止および再開するためのショートカットになります。注意Exec=
行を変更して、スクリプトへのパスに実際のユーザー名を含める必要があります(実際のホームディレクトリであるため)。たとえば、私のものはExec=/home/serg/bin/set-lang.sh
になります
説明とカスタマイズ:
スクリプト自体は無限whileループで実行され、現在のアクティブウィンドウをチェックします。現在のアクティブなウィンドウがケース構造のオプションのいずれかに一致する場合、適切な言語に切り替えます。一定の設定を避けるために、case構造の各部分には、言語が既に目的の値に設定されているかどうかを確認するifステートメントがあります。
set-lang-controller.sh
のランチャーをダブルクリックすると、set-lang.sh
スクリプトのステータスが確認されます。スクリプトが実行されている場合-一時停止され、スクリプトが一時停止されている場合、再開されます。適切なメッセージとともに通知が表示されます。
スクリプトをカスタマイズするには、目的のアプリケーションを開き、wmctrl -lx
を実行し、3番目の列であるウィンドウクラスに注意してください。サンプル出力:
$ wmctrl -lx | awk '$4="***" {print}'
0x02c00007 0 gnome-terminal-server.Gnome-terminal *** Terminal
0x03a0000a 0 desktop_window.Nautilus *** Desktop
0x04a00002 0 N/A *** XdndCollectionWindowImp
0x04a00005 0 N/A *** unity-launcher
0x04a00008 0 N/A *** unity-panel
0x04a0000b 0 N/A *** unity-dash
0x04a0000c 0 N/A *** Hud
0x012000a6 0 Navigator.Firefox *** unity - Assign default keyboard language per-application - Ask Ubuntu - Mozilla Firefox
プログラムごとに適切なウィンドウクラスを選択します。次に、カスタマイズを許可するスクリプトの部分に移動し、PROG_CLASSおよびLANGの2つのエントリを追加します。次に、ケース構造に適切なエントリを追加します。
たとえば、LibreOfficeのWriterを追加する場合は、LibreOffice Writerウィンドウを開き、ターミナルに移動してwmctrl -lx
を実行します。 Writerウィンドウにはクラスlibreoffice.libreoffice-writer
があることがわかります。次に、スクリプトに移動して、適切な領域にPROG_CLASS_4=libreoffice.libreoffice-writer
とLANG4=3
を追加します。一致する番号4に注目してください。次に、ケース構造に移動し、最後の;;
とesac
の間に次のエントリを追加します。
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
繰り返しますが、$記号と一致する番号4に注目してください。
また、スクリプトが自動開始項目として実行されており、一時的に停止してカスタマイズする場合は、pkill set-lang.sh
を使用してNohup set-lang.sh > /dev/null 2&>1 &
で再開します
小さなメモ:プログラムのウィンドウクラス(ケース構造内の単一の丸括弧の前にあるもの)を見つける別の方法は、このxprop
とawk
onelinerを使用することです:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}
gxneur
をインストールするには、次を実行します
Sudo apt-get install gxneur
このソフトウェアはレイアウトを自動的に切り替えることができますが、それでは完全ではありません。
ただし、手動レイアウトスイッチを設定するための非常に便利なツールがあります。
あなたがしたいことを正確に行うことができます。特定のアプリケーションに特定のレイアウトを設定します。
以下のスクリプトは、 this one の編集バージョンです。これは、単一アプリケーション(gnome-terminal
)少し前。
この質問に対してスクリプトを部分的に書き直し、複数のアプリケーションの言語を自動的に設定するために使用できるようにしました。
スクリプトが初めて起動された場合、現在の言語がデフォルト言語であると想定されます。これは、隠しファイル~/.lang_set
に記憶されています。
その後、使用方法は簡単です。一番前のウィンドウでgedit
を選択し、別の言語を設定すると、その言語はgedit
に再度接続されるまで、gedit
を使用して再び言語を変更するまで自動的に接続されます。
特定の言語/アプリケーションの数は原則として無制限です。アプリケーションを実行し、アプリケーションウィンドウを前にして言語を設定するだけです。アプリケーションは、コードを編集せずに自動的に設定および記憶されます。
スクリプトはループで実行されますが、リソースの消費は最小限です。イベント駆動とは、eventが最前面のウィンドウの変更であることを意味します。ループをチェックインする以外に、最前面のウィンドウを「スパイ」する以外のオプションはありません。
#!/usr/bin/env python3
import subprocess
import os
import time
key = [
"org.gnome.desktop.input-sources",
"gsettings get ", "gsettings set ",
" sources", " current",
]
prev = os.environ["HOME"]+"/.lang_set"
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_front():
# produce the frontmost application
try:
focus = str(hex(int(get("xdotool getwindowfocus").strip())))
front = focus[:2]+"0"+focus[2:]
cmd = "wmctrl -lp"
w_list = subprocess.check_output(["/bin/bash", "-c",cmd]).decode("utf-8")
w_match = [w for w in w_list.splitlines() if front in w][0].split()[2]
application = get("ps -p "+w_match+" -o comm=").strip()
# fix for 15.04, where the process name of gnome-terminal varies
application = "gnome-terminal" if "gnome-terminal" in application else application
return application
except subprocess.CalledProcessError:
return None
def get_lang():
# get the currently running language (output = string)
curr_n = int(get(key[1]+key[0]+key[4]).strip().split()[-1])
return str(eval(get(key[1]+key[0]+key[3]))[curr_n])
def read_prev(application):
# reads the possibly set languages for general and specific use (list)
if not os.path.exists(prev):
currlang = get_lang()
open(prev, "wt").write("default "+currlang+"\n"+application+" "+currlang)
return [currlang, currlang]
else:
return [l.strip() for l in open(prev).readlines()]
def write_changed(application, lang):
changelist = read_prev(front_2)
try:
match = changelist.index([l for l in changelist if application in l][0])
changelist[match] = application+" "+lang+"\n"
except IndexError:
changelist.append(application+" "+lang+"\n")
open(prev, "wt").write(("\n").join(changelist))
def set_lang(lang):
# set the currently used language (input = string)
lang_i = eval(get(key[1]+key[0]+key[3])).index(eval(lang))
cmd = key[2]+key[0]+key[4]+" "+str(lang_i)
subprocess.Popen(["/bin/bash", "-c", cmd])
front_1 = get_front(); lang_1 = get_lang()
while True:
time.sleep(1)
front_2 = get_front(); lang_2 = get_lang()
if front_2 != None:
if front_2 != front_1:
try:
setlist = read_prev(front_2)
match = [l for l in setlist if front_2 in l][0]
except IndexError:
match = [l for l in setlist if "default" in l][0]
set_lang(match[match.find(" ")+1:])
Elif lang_2 != lang_1:
write_changed(front_2, lang_2)
front_1 = front_2; lang_1 = lang_2
このスクリプトはxdotool
とwmctrl
の両方を使用します。
Sudo apt-get install wmctrl xdotool
上記のスクリプトを空のファイルにコピーし、set_language.py
として保存します
次のコマンドでテスト実行します。
python3 /path/to/set_language.py
すべてが期待どおりに機能する場合は、スタートアップアプリケーションに追加します:スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加。コマンドを追加します。
python3 /path/to/set_language.py