引言:
SublimeText是一款跨平台的代码编辑器,功能十分强大,但其在Ubuntu系统中却无法调用中文输入法,这篇文章提供一种解决方案,使Ubuntu下的"Sublime Text 3"能够支持中文输入。
目录:
- 0x01:安装Sublime Text3
- 0x02:解决Ubuntu 下 Sublime Text3 无法输入中文
1.获取软件:通过SublimeText官方网站下载安装包:http://www.sublimetext.com/
目前最新版为3126
2.安装: sudo dpkg -i sublime-text_build-3126_amd64.deb
3.安装完成后可以在终端输入"subl"启动它,也可以在快速启动栏Ubuntu按钮中搜索"sublime"启动它
4.启动后,在软件顶部点击"Help">"Enter License",粘贴下面的激活序列号:
3126版序列号:
—– BEGIN LICENSE —– Michael Barnes Single User License EA7E-821385 8A353C41 872A0D5C DF9B2950 AFF6F667 C458EA6D 8EA3C286 98D1D650 131A97AB AA919AEC EF20E143 B361B1E7 4C8B7F04 B085E65E 2F5F5360 8489D422 FB8FC1AA 93F6323C FD7F7544 3F39C318 D95E6480 FCCC7561 8A4A1741 68FA4223 ADCEDE07 200C25BE DBBC4855 C4CFB774 C5EC138C 0FEC1CEF D9DCECEC D3A5DAD1 01316C36 —— END LICENSE ——
0x02:解决Ubuntu 下 Sublime Text3 无法输入中文
1.安装编译环境:sudo
apt-get
install
build-essential libgtk2.0-dev
2.拷贝如下代码到文件sublime_imfix.c文件中,该文件需要自己创建,随便放到那里都行。
/*
* sublime-imfix.c
* Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.
* gcc -shared -o libsublime-imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC
* LD_PRELOAD=./libsublime-imfix.so sublime_text
*/
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
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);
}
3.在sublime-imfix.c文件所在目录执行下面的命令,编译库文件:
gcc -shared -o libsublime-imfix.so sublime-imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC
4.中文输入
到这里默认已经装好了中文输入法(搜狗输入法linux版)。
5.修改桌面启动文件
在第4步中如果每次都输入LD_PRELOAD这样显得太不方便了,在这里提供简单修改图标连接的方式,快速打开SublimeText。
将libsublime-imfix.so拷贝到系统库的默认路径中:
sudo cp libsublime-imfix.so /usr/lib/
将Exec=/opt/sublime_text/sublime_text -n 修改为
Exec=bash -c 'LD_PRELOAD=/usr/lib/libsublime-imfix.so /opt/sublime_text/sublime_text' -n
将【Desktop Action Document】中的字符串Exec=/opt/sublime_text/sublime_text --command new_file 修改为
Exec=bash -c 'LD_PRELOAD=/usr/lib/libsublime-imfix.so /opt/sublime_text/sublime_text' --command new_fi
注:第五步仅限使用.deb文件安装的情况,如果使用源码安装的则需要变通一下,写个脚本将LD_PRELOAD加上即可