linux 文本不能输出汉字,解决Ubuntu下Sublime text3无法输入中文的问题

最开始在ubuntu14.04上装了Aptana,但无奈启动有点慢,稍显笨重,于是又继续用Sublime了。Sublime text 功能强大而又不失简约,个人非常喜欢。

然而在Ubuntu中sublime无法输入中文,这确实是个有点狗血的问题,在windows上完全不会有这种问题。

既然有问题,那就去解决。

我一开始安装有搜狗输入法,我的sublime时安装在/opt/sublime_text文件中的。

1.新建文件sub-fcitx.c,建议放在Sublime Text的所在目录下,将下面的代码复制进去/*

sublime-imfix.c

Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.

By Cjacker Huang

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

LD_PRELOAD=./libsublime-imfix.so subl

*/

#include

#include

typedef GdkSegment GdkRegionBox;

struct _GdkRegion

{

long size;

long numRects;

GdkRegionBox *rects;

GdkRegionBox extents;

};

GtkIMContext *local_context;

void

gdk_region_get_clipbox (const GdkRegion *region,

GdkRectangle *rectangle)

{

g_return_if_fail (region != NULL);

g_return_if_fail (rectangle != NULL);

rectangle->x = region->extents.x1;

rectangle->y = region->extents.y1;

rectangle->width = region->extents.x2 - region->extents.x1;

rectangle->height = region->extents.y2 - region->extents.y1;

GdkRectangle rect;

rect.x = rectangle->x;

rect.y = rectangle->y;

rect.width = 0;

rect.height = rectangle->height;

//The caret width is 2;

//Maybe sometimes we will make a mistake, but for most of the time, it should be the caret.

if(rectangle->width == 2 && GTK_IS_IM_CONTEXT(local_context)) {

gtk_im_context_set_cursor_location(local_context, rectangle);

}

}

//this is needed, for example, if you input something in file dialog and return back the edit area

//context will lost, so here we set it again.

static GdkFilterReturn event_filter (GdkXEvent *xevent, GdkEvent *event, gpointer im_context)

{

XEvent *xev = (XEvent *)xevent;

if(xev->type == KeyRelease && GTK_IS_IM_CONTEXT(im_context)) {

GdkWindow * win = g_object_get_data(G_OBJECT(im_context),"window");

if(GDK_IS_WINDOW(win))

gtk_im_context_set_client_window(im_context, win);

}

return GDK_FILTER_CONTINUE;

}

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);

if(!GDK_IS_WINDOW (window))

return;

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

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);

local_context = context;

}

gdk_window_add_filter (window, event_filter, context);

}

2.安装编译环境sudo apt-get install build-essential

sudo apt-get install libgtk2.0-dev

3.切换到sub-fcitx.c,所在目录,编译生成so文件cd /opt/sublime_text/

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

正常的话,目录下会多一个libsublime-imfix.so文件

切换到Sublime Text目录下,通过LD_PRELOAD=./libsublime-imfix.so ./sublime_text命令启动Sublime Text之后,就会发现可以输入中文了,但是这样太麻烦了,通过添加自己的启动脚本可以简化这一过程

4.在终端通过 subl 直接启动sublimesudo vim /usr/bin/subl

在第一行添加export LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so

5.在启动器快捷启动

找到sublime启动图标的放置位置sudo find -iname sublime*

我find的结果如下./.local/share/icons/sublime_text.png

./.local/share/applications/sublime_text.desktop

./.config/sublime-text-3

说明sublime启动图标位置为./.local/share/applications/sublime_text.desktop

然后修改启动设置sudo vim ./.local/share/applications/sublime_text.desktop

将Exec=/opt/sublime_text/sublime_text修改为Exec=/usr/bin/subl

可见原sublime_text.desktop中的/opt/sublime_text/sublime_text就是sublime的安装位置。

这时,不管时在终端优雅的输入 subl 还是在启动器中优雅的点击 sublime 进入后都可以输入中文啦!

总结:设置终端启动和启动器启动图标启动的时候,最重要的是路径必须写对!我google了很多教程,不同教程路径有所不同,自己的sublime安装位置和教程的也有所不同,如果路径不对,配置后就可能依旧无法输入中文甚至无法启动。

两个重要的路径(以我的为例):

安装路径:/opt/sublime_text

启动器图标路径:./.local/share/applications/sublime_text.desktop

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值