当我们从命令行启动Xwindows时,使用startx,这是个Shell脚本,我们来看看是怎么启动输入法的。
startx -> /etc/X11/xinit/xinitrc -> /etc/X11/xinit/xinitrc-common ->/etc/X11/xinit/xinitrc.d/xinput.sh
所有的输入法设置和启动都是在/etc/X11/xinit/xinitrc.d/xinput.sh里完成的 。
USER_XINPUTRC="$HOME/.xinputrc"
SYS_XINPUTRC="/etc/X11/xinit/xinputrc"
# Load up the user and system locale settings
oldterm=$TERM
unset TERM
if [ -r /etc/profile.d/lang.sh ]; then
source /etc/profile.d/lang.sh
fi
[ -n "$oldterm" ] && export TERM=$oldterm
tmplang=${LC_CTYPE:-${LANG:-"en_US.UTF-8"}}
# unset env vars to be safe
unset XIM XIM_PROGRAM XIM_ARGS XMODIFIERS GTK_IM_MODULE QT_IM_MODULE
if [ -r "$USER_XINPUTRC" ]; then
source "$USER_XINPUTRC"
elif [ -r "$SYS_XINPUTRC" ]; then
# FIXME: This hardcoded list has to be gone in the future.
_language_list="as bn gu hi ja kn ko ml mr ne or pa si ta te th ur vi zh"
for i in $_language_list; do
if echo $tmplang | grep -q -E "^$i"; then
source "$SYS_XINPUTRC"
break
fi
done
fi
[ -n "$GTK_IM_MODULE" ] && export GTK_IM_MODULE
[ -n "$QT_IM_MODULE" ] && export QT_IM_MODULE
# setup XMODIFIERS
[ -z "$XMODIFIERS" -a -n "$XIM" ] && XMODIFIERS="@im=$XIM"
[ -n "$XMODIFIERS" ] && export XMODIFIERS
# execute XIM_PROGRAM
[ -n "$XIM_PROGRAM" ] && which "$XIM_PROGRAM" > /dev/null 2>&1 && LANG="$tmplang" "$XIM_PROGRAM" $XIM_ARGS &
上我们来看看这个shell脚本做了些什么。从下面行开始
unset XIM XIM_PROGRAM XIM_ARGS XMODIFIERS GTK_IM_MODULE QT_IM_MODULE
先把XIM XIM_PROGRAM XIM_ARGS XMODIFIERS GTK_IM_MODULE QT_IM_MODULE
这些环境变量取消,再根据是否有$USER_XINPUTRC也就是"$HOME/.xinputrc"这个文件,决定是执行"$HOME/.xinputrc",还是系统"/etc/X11/xinit/xinputrc"脚本。这2个脚本就是进行输入法变量设置的。再根据设置的变量export GTK_IM_MODULE QT_IM_MODULE XMODIFIERS这3个环境变量,他们是其他程序运行时和输入法的接口。最后由XIM_PROGRAM运行输入法。
建议不要去改/etc/X11/xinit/xinitrc.d/xinput.sh这个文件,我们主要改"$HOME/.xinputrc"或"/etc/X11/xinit/xinputrc",看下$HOME/.xinputrc",我的是个指向 /etc/X11/xinit/xinput.d/scim.conf的链接。在这个文件中也就是设置了XIM XIM_PROGRAM XIM_ARGS GTK_IM_MODULE QT_IM_MODULE这些变量。我们可以在/etc/X11/xinit/xinput.d/这个目录中设置我们自己的脚本文件,设置好上面几个变量。再把"$HOME/.xinputrc"链接指向我们的 文件就行。也就可以按需改变输入法。
另,如果没有$HOME/.xinputrc"这个文件,在/etc/X11/xinit/xinitrc.d/xinput.sh会根据
tmplang=${LC_CTYPE:-${LANG:-"en_US.UTF-8"}}
.......
.......
_language_list="as bn gu hi ja kn ko ml mr ne or pa si ta te th ur vi zh"
for i in $_language_list; do
if echo $tmplang | grep -q -E "^$i"; then
source "$SYS_XINPUTRC"
break
fi
done
来决定是否启动"/etc/X11/xinit/xinputrc"。也就是看_language_list中每个字母组合是否为我们的tmplang头部。
还有,在Xwindow,系统/参数/个人/输入法 的设置中,改变的就是$HOME/.xinputrc这个链接的目的。