在Ubuntu 16.04中安裝了SublimeText 3之后發(fā)現(xiàn)既然不支持輸入中文廊宪。
根據(jù)網(wǎng)上資料和自身的安裝過程浓瞪,解決辦法總結(jié)如下:
1. SublimeText3的安裝
??? 本文采用的是從官方網(wǎng)站上下載64位的.deb文件
??? sudo dpkg -i sublime-text_build-3114_amd64.deb?? ?
2. 相關(guān)依賴軟件的安裝
??? sudo apt-get install build-essential libgtk2.0-dev
3. 拷貝如下代碼到文件sublime_imfix.c文件中(該文件需要自己創(chuàng)建懈玻,可放任意位置)
??? /*
???? * 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
??? #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);
??? }
??? 按照文件頭上注釋所說的編譯該文件,在終端里進入到存放該文件的目錄中乾颁,輸入如下命令:
??? gcc -shared -o libsublime-imfix.so sublime_imfix.c? `pkg-config --libs --cflags gtk+-2.0` -fPIC
??? 最后在當前目錄下得到libsublime-imfix.so這個共享庫涂乌。
4. 中文輸入
??? 到這里默認已經(jīng)裝好了中文輸入法(搜狗輸入法linux版)艺栈。得到第3步中的庫libsublime-imfix.so之后,先試試看是否能正常使用中文輸入法骂倘,在終端中輸入如下命令:
??? LD_PRELOAD=./libsublime-imfix.so subl???????????? #subl是安裝好SublimeText 3后的程序啟動命令
如果一切正常眼滤,在啟動之后,搜狗輸入法就能可以輸入了历涝。
5. 為了方便
??? 在第4步中如果每次都輸入LD_PRELOAD這樣顯得太不方便了诅需,在這里提供簡單修改圖標連接的方式,快速打開SublimeText荧库。將libsublime-imfix.so拷貝到系統(tǒng)庫的默認路徑中:
??? sudo cp libsublime-imfix.so /usr/lib/
??? 修改/usr/share/applications/sublime_text.desktop文件
??? sudo vim /usr/share/applications/sublime_text.desktop
??? 打開后將Exec=/opt/sublime_text/sublime_text %F修改為
??? Exec=bash -c 'LD_PRELOAD=/usr/lib/libsublime-imfix.so /opt/sublime_text/sublime_text' %F
??? 將Exec=/opt/sublime_text/sublime_text -n修改為
??? Exec=bash -c 'LD_PRELOAD=/usr/lib/libsublime-imfix.so /opt/sublime_text/sublime_text' -n
??? 也可以相似方式修改/usr/bin/subl堰塌,以便命令行方式啟動帶中文輸入法
??? 這樣就通過快捷方式打開SublimeText 3就可以支持中文輸入了。
注:第五步僅限使用.deb文件安裝的情況分衫,如果使用源碼安裝的則需要變通一下场刑,寫個腳本將LD_PRELOAD加上即可