由于众所周知的原因,在linux中使用中文一直有一些尴尬的情况,其中在sublime中无法切换输入法输入中文就是一个,下面介绍一种解决方案。 安装sublime 首先需要到sublime的官网下载程序
由于众所周知的原因,在linux中使用中文一直有一些尴尬的情况,其中在sublime中无法切换输入法输入中文就是一个,下面介绍一种解决方案。
安装sublime
首先需要到sublime的官网下载程序,http://www.sublimetext.com/3 下载得到一个tar.bz2的文件,将这个文件解压缩得到一个文件夹,放置在自己喜欢的地方,假设放置为 /opt/sublime_text_3/。
在解压得到的文件夹中有个 .desktop 的文件,将其中的关于路径的描述进行修改,修改为实际的路径,然后保存到 /usr/local/share/applications 中,需要sudo的权限。
此时,在菜单中已经能够看到sublime的图片,并且已经可以使用。
配置sublime
默认的sublime配置有一些地方需要调整,Preferences->settings,然后将下面的配置粘贴进配置文件中
{ "color_scheme": "Packages/Color Scheme - Default/Monokai Bright.tmTheme", "expand_tabs_on_save": true, "font_face": "Microsoft Yahei Mono", "font_size": 14, "tab_size": 4, "translate_tabs_to_spaces": true, "update_check": false}
Preferences->key bindings,粘贴下面的配置,快捷键的配置
[ { "keys": ["alt+down"], "command": "swap_line_down" }, { "keys": ["alt+up"], "command": "swap_line_up" }, { "keys": ["ctrl+d"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Line.sublime-macro"} }, { "keys": ["ctrl+alt+up"], "command": "duplicate_line" },]
解决输入中文的问题
linux上的sublime不知道为何,默认情况下无法切换中文进行输入,但是复制中文过来可以进行粘贴。
下面提供一种不是非常完美但是能够工作的解决方法。
首先需要安装fcitx与搜狗输入法,参考我写的另一篇文章。
将下面的代码保存为 sublime_imfix.c ,
/*sublime-imfix.cUse LD_PRELOAD to interpose some function to fix sublime input method support for linux.By Cjacker Huanggcc -shared -o libsublime-imfix.so sublime-imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPICLD_PRELOAD=./libsublime-imfix.so subl*/#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);}
为了编译这个代码,需要特别安装编译 gtk2-devel ,编译的命令
gcc -shared -o libsublime-imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC
将编译得到的libsublime-imfix.so放到sublime的程序目录中。
将下面的代码保存为 /usr/bin/sublime
#!/bin/bashexport LD_PRELOAD=/opt/sublime_text_3/libsublime-imfix.soexec /opt/sublime_text_3/sublime_text "$@"
并且赋予执行权限,同时修改sublime的desktop文件中的执行程序路径,修改为 /usr/bin/sublime ,
效果
修改之后需要重新登陆系统才能完全生效,切换之后能够输入中文,但是选词框总是在左下角,即使拖动到想要出现的地方,下次输入依然是左下角,不能跟随,这就是这个方法还不太完美的地方。
如果谁有更好的方法,希望不吝赐教。