星期二, 一月 30, 2007

[E17] 在 E17 里面设置使用中文输入法

用E17的方式设置中文输入法,步骤如下:
  1. 调出主菜单(鼠标左键、Win键盘上的属性键、或是点击start模块)
  2. 选择Configuration -> Configuration Panel,出现下图:
    http://achaoge.googlepages.com/E17_with_xim_Configuration_Panel.jpg
  3. 在左边选择语言(Language),在右边出现的选项中选输入法设置(Input Method Settings):
    http://achaoge.googlepages.com/E17_with_xim_Input_method_configurat.jpg
  4. 现在默认有三种输入法(iiimf, scim, uim),如果你使用的是其中一种,那么选择好了点OK就好了,如果不是,点高级(Advanced)继续。
  5. 现在你可以创建自己的输入法选项(New),如图:
    http://achaoge.googlepages.com/E17_with_xim_Create_new.jpg
  6. 填入自己喜欢的输入法的相关参数(以fcitx为例),完成后(实际上会在~/.e/e/input_method下创建一个new_imput_method-00.imc的文件)点击OK:
    Name: fcitx <--- 输入法的名称
    Execute Command: fcitx <--- 输入法的启动程序名,如果是非标准路径中,记得写完整的路径
    GTK_IM_MODULE:  xim <--- 强制GTK2的程序使用xim(X Input Method)
    QT_IM_MODULE: xim <--- 强制QT的程序使用 xim.
    XMODIFIERS: @im=fcitx <--- 这个大家应该比较熟悉了:)
  7. 再回到第3步,可以看到我们现在多了一个fcitx 的选项,选中后点击OK。
    http://achaoge.googlepages.com/E17_with_xim_more_options.jpg
  8. 这样,从E17 中启动的程序(要支持相应的输入法)就可以使用中文输入法了。
补充说明: E17自己本身暂时还不支持中文输入法 :(

可能的问题:
在英文locale 下,选择scim时,如果没有scim_gtk2_immodule 的支持,可能GTK程序无法用(Ctrl+Space)激活scim输入法
解决方法有两种:
  1. GTK的程序可以手动选择输入法,不过每次都选择会很麻烦。
  2. 新建一个类似前面fcitx 的,让gtk2 的程序也强制使用 xim。

星期六, 一月 27, 2007

[X][Debian][FreeBSD]从Xsession脚本文件看设置启动桌面的配置文件

启动到X桌面,有两种方式:
1,通过终端登录后,用startx 来启动。
通过这种方式启动到X桌面比较简单,主要通过设置 ~/.xinitrc 来设置自己需要的变量和启动的相关程序。
2,通过X Display Manager来启动,这是本文分析的重点,以GDM为例来说明如何设置相关信息。
gdm:在选择语言(Language)和会话(Session)之后,输入用户名和密码,X进行一些初始化的工作,然后跳到调用 Xsession,调用的参数是你所选择的Session[default, custom, failsafe, gnome-session...]
重点在Xsession文件。
FreeBSD(/usr/local/etc/gdm/Xsession)文件分析:
1, 尝试检测 command 参数,即gdm传递给 Xsession 的参数,指定用何种桌面,如果没有指定,则默认设置为failsafe(此种情况下,将出现一个提示框,然后系统给一个X终端)
2, 系统变量设置,尝试读取的文件有: /etc/profile, ~/.profile, /etc/xprofile, ~/.xprofile
3, X资源文件的设置,尝试读取的文件有: /etc/X11/xinit/Xresources, /etc/X11/Xresources, ~/.Xresources
4, 设置键映射,两种方式,优先使用XKB,尝试读取的文件有: /etc/X11/Xkbmap, ~/.Xkbmap, 当这两个文件都不存在的时候,使用xmodmap, 尝试读取的文件有: /etc/X11/xinit/Xmodmap, /etc/X11/Xmodmap, ~/.Xmodmap
5, 设置语言
6, 开始根据GDM的选择执行command:
  • 如果session选择的是custom,那么尝试~/.xsession 文件,如果存在,则根据此文件启动桌面,如果不存在,则将session设置为default.
  • 如果session是default, 那么尝试的文件依次为: ~/.Xclients, /etc/X11/xinit/Xclients, /etc/X11/Xclients, 找到哪个就从哪个启动了,否则设置session为 xsm
  • 最后,如果两者都不是,或者default没有找到相应的文件,根据session的命令启动桌面。

Debian(/etc/gdm/Xsession)文件分析:
Debian中的设置和FreeBSD大同小异,不同点在于
  1. 不会读取 /etc/profile, ~/.profile 等等环境变量设置
  2. 将功能划分到不同的文件中(/etc/X11/Xsession.d下),例如设定变量,启动附加程序等等,分别依次执行。
  3. 将custom 和 default 合并了,所以session选择的时候,两者是一样的,用户可以设置 ~/.xsession 或者是 ~/.Xsession

--------------------------------
以下操作秉着不修改任何系统文件的原则*:
设置X的全局环境变量,在FreeBSD里面,只要设置到 ~/.profile 里面就会生效,而Debian里面需要在GDM里面选择custom(or default) 之后,还要设置 ~/.xsession 文件。
启动额外程序(如输入法) ,可以在GDM里面选择 custom 之后,建立~/.xsession 文件。FreeBSD还可以选择default之后,建立~/.Xclients.

~/.xsession(无论~/.xinitrc或者是~/.Xclients,其实格式都一样,偷懒的做法是做链接) 示例:

#!/bin/sh
#读取~/.bashrc的设置
[ -f ~/.bashrc ] && source ~/.bashrc
# 设置输入法并启动
export XMODIFIERS="@im=SCIM"
exec scim -d > /dev/null 2>&1 &
#启动窗口管理器
exec enlightenment_start

--------------------------------
PS. 在Debian下还可以通过im-switch来管理输入法,安装im-switch之后,在/etc/X11/Xsession.d/下会产生 80im-switch 这个文件,将被读入Xsession并根据用户所选择的语言来启动相应的输入法。更详细的信息,请自行分析 /etc/X11/Xsession.d/80im-switch 这个文件。

星期五, 一月 26, 2007

[WP]Postie处理中文邮件的修正

  最近在DreamHost上买了个空间,在上面装了WordPress 系统,在尝试用邮件来发Blog的时候,发现中文邮件不行,看了下代码,发现邮件主题还比较好解决,但是邮件正文要自己来处理的话,工作量就大了。于是向 Google大神 请示了一下,找到了Postie ( http://www.economysizegeek.com/?page_id=395 ) 的插件,装上后试了一下,功能上说,比WP内置的要强大得多,但是对于中文邮件,还是 癞蛤蟆跳井――扑通。
  在Postie的说明里面,有提到解决了日文邮件的问题。中日韩(CJK)一家亲,日文能解决,中文当然有戏了。于是研究了一下代码,大致可以搞定,但是解决方式很丑陋(dirty),硬编码比较多,而且对邮件的格式知之甚少,只能说解决了中文的问题,对于其他语言编码的方式,未必适用。

  要中文邮件能正常工作,需要修改postie中的两个文件 mimedecode.php 和 postie-functions.php。
patch文件: http://achaoge.googlepages.com/postie_deal_with_Chinese.patch
使用方式:
Unix:
  1. 下载patch
  2. 下载postie并解压: tar xzf postie-0.9.9.3.2.tar.gz
  3. patch -p1 < postie_deal_with_Chinese.patch
  4. OK.
Windows: 不知道啦,看patch 文件,反正需要修改的地方不多 :D

星期四, 一月 25, 2007

[Shell] 让getfacl 的结果显示中文

getfacl 这条命令在读取中文名文件的权限列表时,会将中文字显示成 \xxx\xxx\xxx(x为0-9的数) 这样的形式。前两天在 irc://irc.debian.org/#debian-zh 上抱怨了一下,好心的Chaos`Eternal 给了我一个shell 函数,用来解决中文显示的问题,趁现在还记得住,先写下来:

function lgetfacl(){ getfacl "$@" | sed 's/\\/\\\\/g' | while read LINE; do echo -e $LINE; done }

嗯,是的,就这么简单,挺管用。