2005年3月17日星期四

给Knoppix动态添加中文支持(II)

要 在光盘版Knoppix动态运行中文输入法(这里说的是fcitx), 主要存在三个障碍(当然前提还是不自己编译),一个是/usr/share/fcitx目录下的数据文件,一个是LC_CTYPE和XMODIFIERS 环境变量配置, 还有一个问题是如何在X启动时就启动输入法程序(虽然后面启动也可以,但这样的话,在此之前启动的应用程序比如konqueror就无法使用到输入法了)

Simplified Chinese Live Extension for Knoppix screenshot 1 Simplified Chinese Live Extension for Knoppix - screenshot 2

数据文件位置问题


这个问题比较棘手: 前面配置kde-i18n-zhcn时/usr/share/locale/zh_CN可以用别的目录映射,那是因为这个目录还不是很大;现在/usr/share下并没有一个叫做fcitx的目录供我们映射,难道我们要映射整个/usr/share? 显然是M:I-3.

fcitx是否一定要从/usr/share/fcitx读取数据文件呢? fcitx的文档里面提到一些数据文件可以从~/.fcitx读取,那么是否确实可行呢?我试验了一下,发现不行 :-)
难道就没有什么办法了么?在编译的时候指定了prefix=/usr/share,在运行是能否修改么?

想到别的程序也应该有这样的问题,我看了一下Knoppix里面的tuxracer等module,发现它们用了这样一个方法:先替换可执行文件里面的路径/usr/share/foo,改为相对路径, 比如
perl -pi -e 's|/usr/share/games/tuxkart|./../share/games/tuxkart|' $DESTDIR/games/tuxkart
(注意两个字符串长度需要是一样的)
然后用一个wrapper确保真正启动可执行程序时当前目录在$DESTDIR/games
cat <$DESTDIR/bin/tuxracer
#!/bin/sh
cd `dirname $0`/../games
./tuxracer $*
EOF
chmod 755 $DESTDIR/bin/tuxracer

所以fcitx的install.sh可以做成这样:
[ ! -d $DESTDIR/usr/share/fcitx ] && mkdir -p $DESTDIR/usr/share/fcitx
cp -a fcitx/usr/share/fcitx/* $DESTDIR/usr/share/fcitx/

# copy executables
[ ! -d $DESTDIR/usr/bin ] && mkdir -p $DESTDIR/usr/bin
cp -a fcitx/usr/bin/* $DESTDIR/usr/bin/
chmod 755 $DESTDIR/usr/bin/*

cp -a fcitx/usr/bin/fcitx $DESTDIR/bin/
perl -pi -e 's|/usr/share/fcitx|./../share/fcitx|' $DESTDIR/usr/bin/fcitx

# add a wrapper $DESTDIR/bin/fcitx
cat <$DESTDIR/bin/fcitx
#!/bin/sh
cd `dirname $0`/../usr/bin
exec ./fcitx $*
EOF
chmod 755 $DESTDIR/bin/fcitx

但经过实际试验,并没有成功,fcitx还是无法找到码表和词库,为什么?
strings fcitx | grep usr/share/fcitx发现并没有什么匹配的结果strings fcitx | grep usr/share也是
最后发现只能用./..来替换/usr
perl -pi -e 's#/usr#./..#' $DESTDIR/usr/bin/fcitx


环境配置

环境变量似乎比较好解决,无非是修改~/.bashrc(或者/etc/environment文件,如果~/.bashrc不好使的话),然后source一下。

慢着! X启动的时候,是否会去读取~/.bash_profile? 记得从gdm等启动X回话的时候是不读取的。
如果这里也不读取,就比较麻烦。为了确认这一点,在~/.bash_profile中添加如下一句
echo "~/.bash_profile called: **ITEMS**quot; >> /tmp/xsession_test.log
然后用root在控制台重新启动xsession:
/etc/init.d/xsession restart

结果发现没有 :-(

所以只好改用saveconfig保存文件的方式,而且这样的话这里就简单得多了
$ sudo vi /etc/X11/Xsession.d/45xsession

--- etc/X11/Xsession.d/45xsession.orig 2005-03-17 11:01:20.000000000 +0800
+++ etc/X11/Xsession.d/45xsession 2005-03-18 10:35:28.000000000 +0800
@@ -745,6 +745,13 @@ EOF
done
}

+export XMODIFIERS="@im=fcitx"
+unset LC_ALL
+export LC_ALL=zh_CN.GB2312
+if [ -x $HOME/.dist/bin/fcitx ] ; then
+ $HOME/.dist/bin/fcitx &
+fi
+
# Check for sufficient Real Memory for starting KDE or GNOME
# (We don't want to end in a swap-a-lot loop.)
REALMEM="$(awk '/MemTotal/{print $2}' /proc/meminfo)"
@@ -753,7 +760,8 @@ if [ "$REALMEM" -lt 25000 ]; then
starttwm
else
case "$DESKTOP" in
- kde|KDE) [ "$FREEMEM" -ge "60000" ] && startkde || starttwm lowmem 82; ;;
+ kde|KDE) sudo mount --bind $HOME/.dist/usr/share/locale/zh_CN /usr/share/locale/zh_CN
+ [ "$FREEMEM" -ge "60000" ] && startkde || starttwm lowmem 82; ;;
gnome|GNOME) [ "$FREEMEM" -ge "45000" ] && startgnome || starttwm lowmem 67; ;;
larswm|LARSWM) [ "$FREEMEM" -ge "35000" ] && startlarswm || starttwm lowmem 64; ;;
enlightenment|ENLIGHTENMENT) [ "$FREEMEM" -ge "35000" ] && startenlightenment || starttwm lowmem 64; ;;

然后重启动(或者象nvidia模块那样在exit.sh里面执行一下/etc/init.d/xsession restart)

备注:

当启动时添加参数lang=cn后,/etc/init.d/knoppix-autoconfig会自动对KDE的配置进行修改,使其启动时使用zh_CN; 如果配置成中文后,以后启动又用了home=....选项,则保存下来的设置会生效。所以这方面不用再担心。

回头看输入法: 启动时若添加了lang=cn,knoppix-autoconfig会添加XMODIFIERS="@im=Chinput"到/etc/sysconfig/i18n, 这个文件虽然会被/etc/profile和/etc/bashrc读取,但这个变量并没有export出来,所以还得修改。

为了减少依赖,干脆不考虑lang=cn的情况,反正自己添加的这些东西都只有在保存$HOME的情况下才有意义,

没有评论: