七的博客

Ubuntu下SublimeText中文问题处理

Linux

Ubuntu下SublimeText中文问题处理

最近碰到了 Sublime 里面,中文输入法不能生效的问题。这对于经常是输入中文是非常不方便的。

在网上查了下资料,主要是说 Sublime 跟输入法框架起冲突了。Sublime 跟 Ubuntu 的默认输入法框架,比如 iBus 或者 Fcitx 存在兼容性问题,所以就导致输入不了中文。

解决办法就是在 Sublime 启动的时候,用一段代码来修复这个输入法的问题。

解决方案如下:

新建一个 sublime_imfix.c 文件,然后填写下面的内容:

#include <gtk/gtkimcontext.h>

void gtk_im_context_set_client_window (GtkIMContext *context,

         GdkWindow    *window)

{

 GtkIMContextClass *klass;

 g_return_if_fail (GTK_IS_IM_CONTEXT (context));

 klass = GTK_IM_CONTEXT_GET_CLASS (context);

 if (klass->set_client_window)

   klass->set_client_window (context, window);

 g_object_set_data(G_OBJECT(context),"window",window);

 if(!GDK_IS_WINDOW (window))

   return;

 int width = gdk_window_get_width(window);

 int height = gdk_window_get_height(window);

 if(width != 0 && height !=0)

   gtk_im_context_focus_in(context);

}

看起来这段代码就是对 GTK 输入法做了下适配,可以处理输入法的焦点问题。 代码中出现了 width 、height 等变量名。

然后将上面的 C 文件编译成共享库,猜测 Sublime 支持这样的动态库扩展。

gcc -shared -o libsublime-imfix.so sublime_imfix.c  `pkg-config --libs --cflags gtk+-2.0` -fPIC

然后将 libsublime-imfix.so 拷贝到 sublime_text 所在文件夹,我这里是 /opt/sublime_text 目录下。

sudo mv libsublime-imfix.so /opt/sublime_text/

如果你本机没有安装 C/C++ 环境的话,要先安装下:

sudo apt-get install build-essential
sudo apt-get install libgtk2.0-dev

修改文件/usr/bin/subl的内容

sudo vim /usr/bin/subl

将 sublime 的启动脚本改为,意思就是将这个动态库当做一个命令行参数传给 Sublime 程序:

#!/bin/sh
LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so exec /opt/sublime_text/sublime_text "$@"

上面这样修改可以让从命令行启动生效。如果是想从快捷方式启动也生效的话,需要再修改下 Sublime 的快捷方式,sublime_text.desktop:

cd /usr/share/applications/

# 下面这个快捷方式的名称换成你本地 Sublime 的
sudo vim sublime-text.desktop

文件内容替换:

  • 将 [Desktop Entry] 中的 Exec=/opt/sublime_text/sublime_text %F 替换成 Exec=bash -c "LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so exec /opt/sublime_text/sublime_text %F"

  • 将 [Desktop Action Window] 中的 Exec=/opt/sublime_text/sublime_text -n 替换成 Exec=bash -c "LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so exec /opt/sublime_text/sublime_text -n"

  • 将 [Desktop Action Document] 中的 Exec=/opt/sublime_text/sublime_text --command new_file 替换成 Exec=bash -c "LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so exec /opt/sublime_text/sublime_text --command new_file"

上面修改的内容依旧是指定这个编译好的动态库地址,然后让 Sublime 启动的时候去加载它,让它处理这个中文输入法的问题。

做完上面这几点,启动 Sublime 后输入中文总算是正常了。