Wprowadzenie
Skrypt poniżej ustawia język dla każdego programu zdefiniowanego przez użytkownika, zgodnie z pozycją tego języka w menu języka. Na przykład, jeśli moje zamówienie to: angielski (1), chiński (2) i rosyjski (3), mogę ustawić Firefoksa na język 2, terminal na język 1 i LibreOffice na język 3.
Skrypt składa się z dwóch części: pierwsza to skrypt, który wykonuje zadanie, drugi skrypt służy jako element sterujący. Chodzi o to, aby uruchomić skrypt ustawiania języka jako aplikację startową i ilekroć trzeba ręcznie zmienić język - dwukrotnie kliknij skrót do skryptu kontrolera.
Warunki wstępne
- Zainstaluj
wmctrl
program za pomocą sudo apt-get install wmctrl
.
Scenariusz
#!/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
Skrypt kontrolera
#!/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
Plik uruchamiający (.desktop) dla skryptu set-lang.sh
[Desktop Entry]
Name=set-lang.sh
Comment=Script to set languages
Exec=/home/yourusername/bin/set-lang.sh
Type=Application
StartupNotify=true
Terminal=false
Plik uruchamiania (.desktop) dla set-lang-controller.sh
[Desktop Entry]
Name=lang-control
Comment=Shortcut to controlling script
Exec=/home/yourusername/bin/set-lang-control.sh
Type=Application
StartupNotify=true
Terminal=false
Uruchamianie skryptu
- Utwórz folder w swoim katalogu domowym o nazwie
bin
. Możesz to zrobić w menedżerze plików lub użyć polecenia mkdir $HOME/bin
w terminalu
- W
bin
folderze utwórz dwa pliki: set-lang.sh
i set-lang-control.sh
. Zapisz skrypt set-lang.sh
i skrypt kontrolera w set-lang-control.sh
. Spraw, by oba skrypty były uruchamialnesudo chmod +x $HOME/bin/set-lang-control.sh $HOME/bin/set-lang.sh
- Utwórz dwa
.desktop
pliki. Jednym jest set-lang.desktop
. Musi być umieszczony w ukrytym .config/autostart
katalogu. Drugim jest set-lang-controller.desktop
umieszczenie go w bin
folderze. Następnie przeciągnij i przypnij do programu uruchamiającego set-lang-controller.desktop
plik. Stanie się skrótem do tymczasowego zatrzymania i wznowienia wykonywania skryptu.
UWAGA: wiersz Exec=
musi zostać zmieniony, aby rzeczywista nazwa użytkownika znajdowała się w ścieżce do skryptu (ponieważ jest to rzeczywisty katalog domowy). Na przykład mój byłbyExec=/home/serg/bin/set-lang.sh
Objaśnienie i dostosowanie:
Sam skrypt działa w nieskończonej pętli while i sprawdza bieżące aktywne okno. Jeśli bieżące aktywne okno pasuje do jednej z opcji w strukturze sprawy, przełączamy się na odpowiedni język. Aby uniknąć ciągłego ustawiania, każda część struktury sprawy ma instrukcję if, która sprawdza, czy język został już ustawiony na żądaną wartość.
Podwójne kliknięcie programu uruchamiającego set-lang-controller.sh
spowoduje sprawdzenie stanu set-lang.sh
skryptu; jeśli skrypt jest uruchomiony - zostanie wstrzymany, a jeśli skrypt zostanie wstrzymany, zostanie wznowiony. Powiadomienie zostanie wyświetlone z odpowiednim komunikatem.
Aby dostosować skrypt, możesz otworzyć żądane aplikacje, uruchomić wmctrl -lx
i zanotować trzecią kolumnę - klasę okna. Przykładowe dane wyjściowe:
$ 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
Wybierz odpowiednie klasy okien dla każdego programu. Następnie przejdź do części skryptu, która umożliwia dostosowanie i dodaj dwa wpisy dla PROG_CLASS i LANG. Następnie dodaj odpowiedni wpis w strukturze sprawy.
Na przykład, jeśli chcę dodać, LibreOffice's Writer, otwieram okno LibreOffice Writer, idę do terminalu i uruchamiam wmctrl -lx
. Powie mi, że okno Writer ma klasę libreoffice.libreoffice-writer
. Następnie przejdę do skryptu, dodam PROG_CLASS_4=libreoffice.libreoffice-writer
i LANG4=3
w odpowiednim obszarze. Zwróć uwagę na pasujący numer 4. Następnie przejdź do struktury sprawy i dodaj następujący wpis między ostatnim ;;
a esac
:
$PROG_CLASS_4)
if [ $CURRENT -ne $LANG4 ];then
gsettings set org.gnome.desktop.input-sources current $LANG4
fi
;;
Ponownie zauważ znak $ i pasującą liczbę 4.
Ponadto, jeśli skrypt działa jako element autostartu i chcesz go tymczasowo zatrzymać, aby go dostosować, użyj pkill set-lang.sh
i wznów znohup set-lang.sh > /dev/null 2&>1 &
Mała uwaga: innym sposobem na znalezienie klasy okna dla programu (rzeczy, które występują przed pojedynczym okrągłym nawiasiem w strukturze obudowy) jest użycie tego xprop
i awk
oneliner:xprop | awk '/WM_CLASS/ {gsub(/"/," "); print $3"."$5}