LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 27205|回复: 46

在 FC3 中启动输入法的方法步骤以及 alternatives 工具的介绍

[复制链接]
发表于 2004-12-29 12:00:47 | 显示全部楼层 |阅读模式
声明
本文档遵守 GNU FDL,除标题,前言,后记之外的内容都可以自由修改并重新发布,但必须包含本声明在内。作者已表示对可能的后果免责。不适于 GNU FDL 的内容作为 GNU GPL 发布。

----------


fc3 中启动输入法的方式与以前不同。

在 fc2 等版本中,/etc/X11/xinit/xinitrc.d/xinput.sh 包含了输入法相关的信息,假如安装新的输入法就必须修改这个文件,才能实现全局的设置。(这个文件中包含了对 chinput 的设置,因此有人说安装 fcitx 时只要改名为 chinput 就可以了,我认为这种办法不好。我自己的办法是在 xinput 中添加这些全局信息,在 $HOME/.i18n 中再进行个人的设置,但是也不是好办法,因为并不是所有人都知道怎么修改 xinput 文件)

在 fc3 中,xinput.sh 不再包含输入法相关信息,而是按顺序读取 /etc/X11/xinit/xinput.d/default, /etc/X11/xinit/xinput.d/zh_CN, $HOME/.xinput.d/default, $HOME/.xinput.d/zh_CN 这几个文件,从中获取配置。添加这些配置文件就成了每种输入法自己的任务,不必用户插手了。
如果下载 scim 为 fc3 编译的 rpm,(从 http://sourceforge.net/project/showfiles.php?group_id=108454 下载安装,感谢 Ryo Dairiki) 那么其中已经包含了那些配置。但是如果编译安装,或者是以前安装的那些输入法而不是最新版本,那么不会进行配置。同样,fcitx 似乎也不包含这些。那么,怎么进行手动配置呢?

首先,要明白自己的策略,究竟是全局配置,也就是系统中一次设置之后,所有用户都生效;还是只为某个用户进行设置。假如系统中只有一种输入法,那么当然只要全局设置就可以了,可是需要考虑到扩展的情况吧 :p

无论是全局设置还是为某个用户进行设置,先应该新建两个文件。/etc/X11/xinit/xinput.d/fcitx 的内容是

  1. XIM=fcitx
  2. XIM_PROGRAM=fcitx
  3. GTK_IM_MODULE=xim
复制代码

而 /etc/X11/xinit/xinput.d/scim 的内容如下。这个文件来自 scim 为 fc3 编译的 rpm

  1. XIM=SCIM
  2. XIM_PROGRAM=scim
  3. XIM_ARGS=-d
  4. GTK_IM_MODULE=scim
  5. QT_IM_MODULE=scim
  6. gnome-im-settings-daemon >/dev/null
复制代码




为了全局的设置,要介绍一下 alternatives 命令。这是一个只有 root 才能执行的命令。alternatives 的意思是 “可选择的内容”。假如你的系统中有几个命令功能十分类似,却又不能随意删除,那么可以用 alternatives 来指定一个全局的设置。在 FC3 中,全局默认输入法和 java 系统等等都是用它来进行设置的。它有几种功能,可以用命令行参数来指定。alternatives --install <link> <name> <path> <priority> 意思是在 alternatives 数据库中添加一个 <path>,使它成为 <link> 的可选项,优先级是 <priority>。而 <name> 则是一个中转站。这样说似乎有些抽象 :p 所以,执行一下看看

  1. alternatives --install  /etc/X11/xinit/xinput.d/zh_CN  xinput-zh_CN  /etc/X11/xinit/xinput.d/scim 100
  2. alternatives --install  /etc/X11/xinit/xinput.d/zh_CN  xinput-zh_CN  /etc/X11/xinit/xinput.d/fcitx 99
复制代码

这两个命令的意思就是将刚才新建的 scim 和 fcitx 两个文件作为 zh_CN 的可选内容。它们的优先级分别是 100 和 99,它们共同的名字是 xinput-zh_CN。

另外一种功能是选择默认值。上面的命令仅仅向数据库中添加了可选内容,接下来当然是进行选择了。可以用两种办法,第一种是 alternatives --auto <name>,这时系统会根据优先级来选择 <name> 的默认值。例如,运行

  1. alternatives --auto xinput-zh_CN
复制代码

会把默认输入法设置为 scim。(为什么?因为我们在上面指定的优先级是 100,是最高的,fcitx 只有 99)
第二种是 alternatives --config <name>,这时会显示一个对话框,大概是这样

  1. [root@jackycom ~]# alternatives --config xinput-zh_CN
  2. There are 3 programs which provide 'xinput-zh_CN'.

  3.   Selection    Command
  4. -----------------------------------------------
  5.    1           /etc/X11/xinit/xinput.d/iiimf
  6. *+ 2           /etc/X11/xinit/xinput.d/scim
  7.    3           /etc/X11/xinit/xinput.d/fcitx

  8. Enter to keep the current selection[+], or type selection number:
复制代码

可以看到系统中已经通过 alternatives --install 添加了三个可选内容。优先级最高的是 `*' 指示的那一个,目前的默认全局使用的是 `+' 指示的那一个。输入数字 3 就会将默认值改为 fcitx,输入回车的话就不做改动。

哪种好一点?它们不会冲突,哪个都可以。要修改优先级怎么办?比如要把 fcitx 的优先级提高成 101,应该怎么办?答案很简单,再运行一次 alternatives --install 就可以了

  1. alternatives --install  /etc/X11/xinit/xinput.d/zh_CN  xinput-zh_CN  /etc/X11/xinit/xinput.d/fcitx 101
复制代码

需要注意的是,这样做不会修改当前的默认值,只有再运行 alternatives --auto 才会做出选择。或者,用 alternatives --config 也可以。

alternatives 还有一些功能,包括删除一个可选项等等。同样,这个设置应该由输入法的安装程序 rpm 来做。在 scim 为 fc3 编译的 rpm 中包含了这个设置。但是如果我们手动卸载 scim/fcitx,或者要卸载原来安装的旧版本,那么需要运行下面的脚本,这个脚本是从 scim 的 rpm 中找到的

  1. #!/bin/bash

  2. # reset locale registeration.
  3. cd /etc/alternatives
  4. for name in xinput-*
  5. do
  6.         if /usr/sbin/alternatives --display $name | grep "^/etc/X11/xinit/xinput.d/scim" | grep "[0-9]$" > /dev/null
  7.         then
  8.                 /usr/sbin/alternatives --remove $name /etc/X11/xinit/xinput.d/scim
  9.                 /usr/sbin/alternatives --auto $name
  10.         fi
  11. done
复制代码



上面都是全局的设置。应该说,这些都是输入法自己的任务,虽然现在我们暂时只能手动操作。
要进行个人的设置怎么办?
最简单的应该是 gnome-im-switch applet 吧…… 在任务栏里有的
如果找不到这个 applet,那么在命令行下怎么配置呢?根据 xinput.sh 文件,它会检测 $HOME/.xinput.d/zh_CN 和 $HOME/.xinput.d/default。所以,我们这样做

  1. mkdir $HOME/.xinput.d
  2. ln -s /etc/X11/xinit/xinput.d/scim $HOME/.xinput.d/zh_CN
复制代码

如果要使用 fcitx,那么就把第二句换一换就可以了。注销,重新登录,输入法设置就这么简单




如何进行简单的测试
在出现问题时,最好先对自己的系统环境、配置情况进行简单的测试和了解。这样,在论坛上提问时就会有效得多。

首先,检查系统的环境。根据上面输入法启动的过程分析,我们需要一个可执行文件,以及几个环境变量。以 fcitx 为例,我们需要的可执行文件是 fcitx, 环境变量是 LC_CTYPE=*.UTF-8/zh_CN.* , XMODIFIERS=@im=fcitx 和 GTK_IM_MODULE=xim

1. 使用 which 命令来查看 fcitx 是否已经正常安装。运行 which fcitx,如果可以运行,将会输出它的路径。如果无法运行,那么会报告找不到,  no fcitx in (/usr/bin:....)
直接运行 fcitx 可能会有一些乱码。所以,不是用来检查的好方法。不过,可以临时修改终端默认编码,重新运行 fcitx 就可以看到正常的字符了,也许可以看到有用的信息。

2. 使用 locale 命令来查看当前的语言环境。如果折腾过很多关于挂载和美化方面的内容,对于这个命令一定相当熟悉了。locale 的组成包括地区/语言以及编码格式等等,例如 en_US.UTF-8 表示美国英语,UTF-8 编码,而 en_GB.ISO8859-1 是英国英语,扩展的欧洲编码。fcitx 可以应用在两类语言环境中,首先当然是中文环境,也就是说 zh_CN.* ,编码随意;其次是所有 UTF-8 编码的语言环境中,因为 UTF-8 可以对所有字符进行编码,当然可以支持中文输入了。之所以检查 LC_CTYPE 是因为它与输入法紧密相关,但是所有 LC_* 变量最好保持一致。
对于 locale 的设置最好在 $HOME/.i18n 中进行,那样是本地设置,不会影响其他用户。全局设置语言环境可以修改 /etc/sysconfig/i18n 文件。再次强调,只要是 zh_CN.*, 或者是 *.UTF-8 ,那么都可以使用中文输入法


3. 使用 export 命令来检查 XMODIFIERS 和 GTK_IM_MODULE 的值。当然,输出会比较多,看起来会有些费眼力。如果会使用 grep 命令,再用 awk -F '=' '{print $2}' 会得到比较明白的结果,不过学会用这些命令的代价比较高,要有十几分钟的练习 ;)
如果输出与上面 /etc/X11/xinit/xinput.d/fcitx 的文件内容相符,那么环境变量就没有问题了。

4. 如果出现了问题,那么检查一下 /etc/X11/xinit/xinput.d/fcitx 的文件内容,是否出现了 typo 拼写错误,然后运行一下 /etc/X11/xinit/xinitrc.d/xinput.sh,看看有什么输出。正常情况下,输出与直接运行输入法的可执行程序时是一样的

5. 环境变量没有问题,输入法也没有问题,手动运行 xinput.sh 也没有问题的话,仍然有可能无法自动启动输入法。这里存在一个时机的问题,也就是说,xinput.sh 应该在所有需要输入法的程序之前启动,这样所设置的变量才会产生效果。每设置一个变量,都只能对设置之后启动的程序产生影响,并且只能对在同一终端会话下启动的程序产生影响。登陆图形界面时,所有程序都属于同一个终端会话,但是先后的时机可能不同。如果在 $HOME/.bashrc 等等文件中设置输入法,或者在 KDE autostart 中设置输入法,很可能会遇到这种问题,这也是为什么反对在这些文件中进行输入法设置的原因

6. 输入法本身有问题,怎么检查呢……在终端中运行它就可以了。但是要注意,运行前一定要设置好所有变量,设置的方法仍然是 export 命令。例如,要检查 fcitx 是否运行正常,可以这样
export LC_ALL=zh_CN.UTF-8
export XMODIFIERS=@im=fcitx
export GTK_IM_MODULE=xim
fcitx
gedit

不必理会环境变量曾经是什么,把相关的环境变量全部重新设置,可以保证万无一失。运行 fcitx 之后,要记住新设置的环境变量只对当前的终端会话有效,所以要在终端下启动一个应用程序,例如这里启动了 gedit,然后我们可以验证 fcitx 是否可用

7. 如果是 acroread 或者 realplay 之类的第三方非自由软件/程序,那么可能与 scim 等等使用 gtk-immodules 的输入法发生冲突。运行这些软件时会莫名其妙地失去响应。发生这种情况时,先打开一个终端,然后在终端下启动程序,例如 realplay,看看有没有什么特别的输出,例如 segment fault 或者 double free 等等。
按照作者们的说法,是因为 c++ 的 ABI 不一致,造成了 gtk-immodules 向应用程序报告了错误的输入法位置。解决的办法只要重新编译输入法就可以了。不过更简单的办法,是修改可执行文件 /usr/bin/acroread 以及 /usr/bin/realplay ,在第二行插入一行
export GTK_IM_MODULE=xim

原因同上,这时,所有在脚本中执行的命令属于同一个终端会话,因此重置环境变量之后,可以影响整个应用程序的设置,而 gtk-immodules 设置为 xim 也就是使用 XIM,这时输入法与应用程序就不直接联系了。


可能遇到的问题
1. 系统中如果已经删掉了 iiimf 那么需要手动建立 /etc/X11/xinit/xinput.d 这个目录

2. 如果想默认使用英文环境 en_US.UTF-8 但是仍然需要用中文输入法,可以像上面那样用 alternatives 对 en_US 做全局设置,也可以象个人设置中那样,

  1. ln -s /etc/X11/xinit/xinput.d/scim $HOME/.xinput.d/en_US
复制代码

scim 和 fcitx 都支持 en_US.UTF-8 环境, 如果要用 fcitx 就把上面的改一改就可以
不要在 .bashrc 中做有关输入法和 locale 的设置!需要的话 , 尽量在 $HOME/.i18n 中设置, 而不要修改 /etc/sysconfig/i18n 。安装输入法不需要修改 locale 设置

3. 升级的 gtk2 中可能用 gtk-query-immodules-2.0-32 取代了 gtk-query-immodules-2.0,不过这个命令应当由输入法的安装程序 rpm 来运行,不应该由用户来运行。但是如果是编译安装 scim 却没有运行它,那么就运行一次好了。

  1. gtk-query-immodules-2.0-32 > /etc/gtk-2.0/gtk.immodules
复制代码

从这个命令可以知道,mandrake 版面提出的临时解决 scim 与 acroread, realplay 等程序冲突的办法,即注释掉 gtk.immodules 文件中与 scim 相关的条目,实际上是无效的,因为这个文件会在安装卸载输入法时更新。正确的做法前面说过了。



撤销本文的所有影响
对于全局设置,上面已经提到了如何在卸载 scim 之后撤销 alternatives 的影响。其实只要用 alternatives --remove 命令就可以了。
对于个人设置,只要删除 $HOME/.xinput.d/ 目录下的相应文件就可以。例如,假如我们设置了 en_US 为指向 scim 的链接,从而在英文环境下使用 scim 输入法,那么只要删掉这个链接。



命令的可重复性
每个命令都可以多次执行,对结果不会有影响
必须先建立 /etc/X11/xinit/xinput.d 目录下的那些文件,而 alternatives 命令的运行顺序是无关的,全局设置与个人设置也是无关的,可以只进行全局设置,也可以只进行个人设置




与其他文档的相容性
http://www.linuxsir.cn/bbs/showthread.php?t=166861  
有了 alternatives 之后,qhgary 在上文中提到的三步中前两步就不再需要了。第三步中,“首先是执行startx这个脚本文件,里面他会执行xinitrc这个脚本,然后xinitrc脚本里面有一个循环,依次执行了xinitrc.d/下面的所有脚本,其中有一个是和输入法相关的,叫xinput。” 这一段讲得很不错。输入法需要的环境变量只有一个 XMODIFIERS=@im=xxxxx ,其他变量都是为了启动输入法而设置的。在 rh8 到 fc2 的系统中可以直接修改那个 xinput 文件来设置各种变量,在 fc3 中则应该像上面说的那样做。

http://www.linuxsir.cn/bbs/showthread.php?t=166788
这篇文档中 air8849 提到的方法并不完整,alternatives 不是那么用的

http://www.linuxsir.cn/bbs/showthread.php?t=164631
这篇文档中 pengbinglinux 提到的方法是删除 iiimf 以及将 fcitx 改名(链接) 到 chinput,这种办法不好

http://www.linuxsir.cn/bbs/showthread.php?t=164472
这篇文档中 super 的问题,是否可以在英文环境中使用中文输入法?答案当然是可以的,只要 LC_CTYPE 所指示的字符集中包含中文字符就可以,而英文环境除了 LC_CTYPE 还包含很多其他变量,比如应用程序界面语言是 LC_MESSAGES 指定的。最简单的,默认用 en_US.UTF-8 和 scim 的话,就不必设置 LC_CTYPE 了

http://www.linuxsir.cn/bbs/showthread.php?t=160302
这篇文档中 apeter_2000 提到了 /etc/X11/xinit/xinput.d 的那些设置,但是没有用 alternatives 工具来调整。而回帖中 zerolin 提到在 gnome 会话,KDE 会话,$HOME/.gnomerc,或者 $HOME/.xinitrc 或者 $HOME/.xsession 等等诸多地方可以添加启动命令,但是这些方法都不好,没有考虑到输入法挂掉或者更换的情况

http://www.linuxsir.cn/bbs/showthread.php?t=109841
FC2 美化集中贴中,删除了 minichinput,并且在 .bashrc 中启动输入法和设置 locale,都不好。

http://www.linuxsir.cn/bbs/showthread.php?t=149864
同上,是同一篇帖子

http://www.linuxsir.cn/bbs/showthread.php?t=110258
hupeng923 提到了如何修改 xinput 来为 fc2 添加设置。但是他的做法是将 xinput 文件中的 chinput 都替换为 fcitx,这样的结果就是不可能同时保留 chinput 和 fcitx。正确的做法是添加新设置——但是这对普通用户太难了。
这也是 fc3 为什么比 fc2 要好的原因,不必再那么麻烦





---------
后记
欢迎拍砖。
反对删除 iiimf,因为它可能会变得很好用,总得给它留个机会。可以用 chkconfig iiim off 把服务关掉,也可以用 ntsysv 或者 system-config-services 来关掉它。反对修改 .bashrc,假如你经常运行 su 或者跑文本界面,就会知道它有多讨厌了
建议 linuxsir 默认使用 GNU FDL 来发布文档,这样并不是不尊重作者权力
scim 为 fc3 编译的 rpm 包含了上面所说的全局设置的所有内容,还包括了很多新东西
 楼主| 发表于 2004-12-29 13:06:11 | 显示全部楼层
输入法和 locale 是两码事,为什么大家的问题总是和 locale 纠缠不清呢
发表于 2004-12-29 18:54:42 | 显示全部楼层
强, 新加的fcitx可以在面板上选吗?
发表于 2005-1-1 15:05:17 | 显示全部楼层
好贴,收藏。
建议加精!
发表于 2005-1-3 17:20:09 | 显示全部楼层
分析的很不错,不过iiim存在和不存在已经没有多大意义了,因为除非你任然要用回xcin,但是那有失去这篇帖子的意义了,删不删都是无关紧要的事,但这确实是最直接了当的方法。
发表于 2005-1-13 10:32:51 | 显示全部楼层
楼主我按你的方法做了,安装fcitx的rpm包,[root@jackycom ~]# alternatives --config xinput-zh_CN
There are 3 programs which provide 'xinput-zh_CN'.

  Selection    Command
-----------------------------------------------
   1           /etc/X11/xinit/xinput.d/iiimf
*+ 2           /etc/X11/xinit/xinput.d/scim
   3           /etc/X11/xinit/xinput.d/fcitx

Enter to keep the current selection[+], or type selection number:
这里也设置为3
可是系统启动后,按 Ctrl+空格 没有反应。是什么原因呢!
发表于 2005-1-13 10:59:43 | 显示全部楼层
不错这铁收藏了
 楼主| 发表于 2005-1-13 11:51:59 | 显示全部楼层
Post by kekekeke

可是系统启动后,按 Ctrl+空格 没有反应。是什么原因呢!


运行 export 看看 XMODIFIERS 是不是已经设置了,值是什么?
用个人设置的办法试试看,有没有效果?
发表于 2005-1-14 09:22:12 | 显示全部楼层
已经明白原因了,是启动系统后,没有自动运行fcitx
我在终端执行fcitx命令就可以使用了
但我想启动系统就可用,怎么做?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-14 11:36:44 | 显示全部楼层
Post by kekekeke
已经明白原因了,是启动系统后,没有自动运行fcitx
我在终端执行fcitx命令就可以使用了
但我想启动系统就可用,怎么做?


如果 配置文件没有错的话,登录 X 时会自动运行 fcitx
所以你手动运行一下

  1. /etc/X11/xinit/xinitrc.d/xinput.sh
复制代码

这时如果配置文件是正确的,那么它会运行输入法,否则会什么提示都没有。用这种办法检查一下配置是不是正确。另外,

  1. cat /etc/X11/xinit/xinput.d/zh_CN
复制代码

是什么结果,和你的 fcitx 配置文件一样吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表