开发工具 一个困扰很久有关 Linux 下 Emacs 和 输入法 的问题.

zw963 · 2012年09月16日 · 最后由 u1384048594 回复于 2013年12月23日 · 9328 次阅读

有一个问题,困扰我很久,久到从一开始就有,但是从来没想过去解决。因为根本不知道无从下手。

Emacs 我一直用 Daemon, 正常启动后,中文输入法 (Fcitx) 在 Emacs 中是可用的。

但是,一旦我再启动一个 Emacs 进程 (注意是 Emacs 进程,不是 Emacsclient ), 则输入法只对这个新进程才有效。这也就意味着,一旦退出这个新的 Emacs 进程,就没办法在接下来的 Emacsclient 中开启输入法了。(点输入法激活快键,根本就看不到那个输入法图标,我也试过其他输入法,例如:SCIM, 问题一样,但是这个时候,在 Chrome 或者 Terminal 下 输入法是可以成功激活的.)

大家知道我的痛苦了吧。虽然不长发生,但是有时候修改 Emacs 脚本,重启出错,也会发生这个情况,这个时候唯一的解决办法是:完全的 Kill 这个 X 的 进程 (不是退出 X 重新登陆,是 Kill), 然后重新进入 X (同时自动重新启动 Emacsclient), 就好了。这也就意味着,之前的 Chrome 必须关掉,很多打开正在工作的 Terminal 也必须关掉,痛苦呀!

这个问题大家谁有?Mac 不用说,应该没有,就是 Linux (64 位)

@skandhas, @dotian, @yedingding, @Guest, @willmouse ,

问题在一楼,谢谢. @tudou, @dotnil @nouse, @sectic, @ugoa,

我用 ibus,我不开 emacs-daemon ...

其实 Emacs 是自带输入法的。C-\

#4 楼 @bhuztez

老兄你也用 Emacs 吗?怎么没听你说过。错过你,那就太不应该了。

别提那个坑爹的 C-\ 了,我早就关了,那也叫输入法吗?那个是老外打中文用的。一分钟想起来一个汉字 ...

#5 楼 @zw963 那东西我没看明白该怎么改,我有想过让它直接去调用 ibus,但没搞定。

ibus 在 elpa 上有个插件,一直用那个

#6 楼 @bhuztez #7 楼 @sectic

我觉得这了不是 ibus 或者 fcitx 或者 SCIM 的问题。

应该是 刚开始正常的时候,输入法 注入 了 Emacs 进程,所以可以激活输入法,但是重新启动一个新的 Emacs 时,输入法注入了 新的 Emacs 进程,所以原先的就失效了。

以上是我猜的。对于 Linux X 以及输入法 工作机理了解的 XD , 能不能看出来点名堂?是不是通过预编译时提供某些参数,或其它方法,可以解决这个问题呢?

补充一句:

准确地说:应该是 XIM 和 Emacs 之间的问题。 难道是我这个古董级别的 Linux 发布版独有的问题??

#8 楼 @zw963 反正我现在这么用没啥问题

难道你没配置 ~/.Xresources

Emacs*useXIM: false

ibus-mode 用着一直没什么问题的说

#9 楼 @bhuztez

我输入法不能用的时候,其效果就等价于你说的这个配置,因为 fcitx 就用 xim 呀。

看了你的回复,下午好一顿折腾,又换输入法,又重新编译... 到头来还是现在的效果。太费时间啦。

#11 楼 @zw963 你咋不用 ibus?

#12 楼 @bhuztez

我的系统上没有。我的 古典 系统 除了最近的 GTK+ 运行库之外,连 Gnome 都没有,因为 Slackware 的维护者认为 Gnome 太乱,太难维护,最近的两个发布版干脆砍掉了。所以跟 Gnome 沾点边的,都比较难搞,我曾经装过 Gnome 下的一些软件,依赖性糊了...

我现在用的 fcitx 外壳,里面用的是 sunpinyin 内核,挺好呀。当然除了一楼的问题...

我有理由相信,即使换到 ibus 问题也应该照旧。因为不是输入法自身的问题。我怀疑我启动放的地方是不是不对呀?你那个 ibus 启动设置是放在那里呢?我为了追求统一,全部都在 .bashrc 里面 ...

我不是很确定这个问题跟我遇到的是否一样... 我之前在 Skype 里没法启动输入法,后来发现是因为 Skype 没法从拿到输入法配置 (亦即,不知道 ibus 的存在)

这些环境变量要在登录到 X 环境的主进程设置~ 我用的 X 登录管理器是 [Slim], 登录时默认会执行 ~/.xinitrc, 然后在 ~/.xinitrc 的开头要把环境变量设定好,再启动 window manager 就好。~/.xinitrc 的简单结构如下:

# 先设置环境变量
export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus # Skype 是个 qt app.
export XMODIFIER="@im=ibus"

ibus-daemon -xrRd # 启动输入法框架的 daemon
# 顺便启动其它需要在登录时启动的应用, 比如 xcompmgr
openbox-session # 真正启动 wm/de

接下来再启动的进程都会从 openbox-session 进程继承环境变量,就能读到这个配置了。

放在 ~/.bashrc 里是不行的。尽管 ~/.xinitrc 是 bash 脚本,但这个文件被登录管理器执行时并不是交互式地启动 bash, 那么 bash 就不会加载这个文件。所以在 ~/.bashrc 里设置的环境变量就只对桌面环境里启动的 terminal 有效,也就需要在 terminal 里再启动 Skype 才能读到 ~/.bashrc 里设置的环境变量。

供参考。

[slim]: https://wiki.archlinux.org/index.php/Slim

#13 楼 @zw963 ibus 有个 emacs-ibus,直接就能用了。除非你升到比较新的 ibus。ibus 到 1.4 之后,有些变化,emacs-ibus 看上去还没跟进,我就自己乱搞了下,反正能用就是了。

emacs-ibus 是绕过 XIM 直接和 ibus 通信的,所以没你这个问题。而且每个 buffer 都可以是不同的输入法状态。

现在对我来说最大的问题是,我不知道怎么把这个搞成和 Emacs 内置的输入法那样。因为,emacs-ibus 是依赖 X 的。

#14 楼 @5long

谢谢你的回复,看了你的回复又开始折腾,也许是我的 fcitx 是自己编译而且放在了 $HOME 下面的缘故,我的 fcitx 如果在 .xinitrc 启动,根本没反映,就没有成功启动这个 deamon. 但是在 .bashrc 下面,通过 LD_LIBRARY_PATH=~/bin/fcitx/lib ~/bin/fcitx/bin/fcitx -d 的方式,可以正常使用。

对于 X 相关的这些东西,平常我很少折腾,请教下:.xinitrc 是在 .profile 之前被加载还是在之后呢?貌似我把 LD_LIBRARY_PATH 放到 .profile 里面,并且添加了 fcitx 所需要的库,仍旧无法在 .xinitrc 下面启动输入法进程。

至于你说的 Skype, 我也遇到和你类似的问题,不过我的原因是因为 64位系统 的缘故,缺乏 /usr/lib/locate 目录以及下面的文件,然后启动 Skype 之后,根本激活不了输入法,拷贝了这个目录到目标位置之后,输入法可以启动,但是打字内容全部变为乱码,当时我通过 ldd 分析所有的 动态库已经完备,而且也可以正常启动,很纳闷,后来通过国外的论坛,查找资料,才知道,不是仅仅 动态库完备就可以正常工作的. 它是缺乏一些 gconv 库支持。坑爹。

下面的链接你可以看看: http://www.linuxquestions.org/questions/slackware-14/skype-4-0-on-slackware-13-37-64bit-4175411533/

我就是通过查询这个帖子,解决的问题。

#15 楼 @bhuztez

我没有明白你说的话,难道系统不装 ibus , Emacs 也可以用 emacs-ibus ?? 输入法从哪里来?

#17 楼 @zw963 系统装 ibus,但是 Emacs 不通过 XIM 的机制调用 ibus...

#18 楼 @bhuztez

问题是我没装 ibus, 因为装 ibus 依赖太多了。

#19 楼 @zw963 莫非你完全不用 gtk 的?

#20 楼 @bhuztez

用 gtk 干什么?

除了 Emacs 是使用 gtk 编译的,Chrome 貌似也是只使用最基本的 Gtk 组件,而且自己常用的一些软件,毫无例外的都是使用 QT3 或 QT4 而其他 GUI 程序 我几乎不用。

桌面是 XFCE 4.8. 文件管理器是 Thunar, 终端是 XFCE4.8 自带的 Terminal.

我的系统下面都没有 gedit, 听说这个编辑器挺有名,我都没机会试过

#21 楼 @zw963 那 ibus 还有啥依赖是你不能忍的...

#22 楼 @bhuztez

懒得折腾呗,我只是要个输入法而已。

如果装个输入法,再编译七八十来个软件去装上,得不偿失呀。

#16 楼 @zw963

Archlinux 对 32bit/64bit 库并存的支持还不错,我直接启用 Arch 官方的 multilib repo, 装上 Skype 就能用。

至于 ~/.xinitrc~/.profile: 有些登录管理器 (GDM) 会去读 ~/.profile, 但 Slim 目前不会,需要你显式地去 source 加载。

#24 楼 @5long

Slackware 也有 32 位库支持,是一个脚本,可以从 32 位 DVD 当中生成包,其实也挺好,

只不过,自己有个绿色软件心理作祟,不想给他整到系统架构里面去,所以最后全放倒 ~/bin/lib 下面了,还好,不兼容的软件就那么几个,也不长折腾,换个发布版,只要 Home 不变,都是可用的。

我用的登陆管理器是 KDM. 也不知道咋加载,懒得搞了~~

#25 楼 @zw963 我现在开发换 mac 了,省了很多事情。

我不太理解你问什么会吧启动项放到 .bashrc 里?不应该放到 /etc/init.d,initx 还有 .xinitrc 里面么?所有个人和 x 相关的都应该放到 .xinitrc 里面嘛

你有没有尝试过在失效的时候,kill 掉输入法的进程重新启动?

#27 楼 @ranmocy

其实我一开始就知道这样可能有问题,但是碍于对 X 没什么研究 (我刚开始用 Linux 时,差不多一个月,都不敢启动一下 X, 因为恐惧,不知道启动后会出现什么), 所以,所有的配置,我都是以 CLI 方式为主。

再加上对于五花八门的 X 设置没什么兴趣,而且我知道 Windows Manager 很多,一个一个样,所以后来用了 XFCE 之后,我就再没有搞过 GUI 方面的东西,到现在对于 WM 的常识,我都是小白。

你说的办法没用,我感觉可能跟 我 X 和 输入法 以及 Emacs 三者之间的启动顺序有关系,也可能跟我输入法安装方式有关,你可以帮我试试吗?在 X 下,启动两个 Emacs, 输入法是否仍旧可用?

#28 楼 @zw963 装个 ibus 不就得了,你又不开发输入法,这个折腾半天又不长进的

#28 楼 @zw963 呃⋯⋯我已经没有 Linux 了⋯⋯ 不过我的印象中是可以的⋯⋯不过我用的是 ibus + Emacs 23

匿名 #31 2012年09月18日

在 emacs 里面很少用中文输入法,要是用的话,C-\, chinese-py

输入法一到 emacs 中就不能启动这是个什么情况呢,在其他的比如浏览器,终端都是好好的

#32 楼 @jialezhang

Emacs 使用 Xim, 最简单的办法是:使用 Terminal , 不要用 GUI. 这样,只要你的 Terminal 可用输入法,Emacs 就可以用。如果像我一样,打算用 GUI, 也可以,那就是只能启动一个 Emacs 进程,例如,只开一个窗口 或者用 Emacs daemon. (我用的后者,无论开多少 emacsclient 都没有问题。但是如果新开一个 emacs 进程,先前的进程,输入法就失效了,这个时候,必须 kill 掉 X 进程才可以)

用 eim 感觉还行,和内置的输入法差不多. 地址在这: https://github.com/viogus/eim

需要 登录 后方可回复, 如果你还没有账号请 注册新账号