• 欢迎访问少将全栈,学会感恩,乐于付出,珍惜缘份,成就彼此、推荐使用最新版火狐浏览器和Chrome浏览器访问本网站。
  • 吐槽,投稿,删稿,交个朋友,商务沟通v:ai_draw
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏少将全栈吧

在KUbuntu 15.04中使SublimeText 3支持中文输入法

点滴 admin 9年前 (2015-10-03) 1777次浏览 已收录 39个评论 扫描二维码

  在KUbuntu 15.04中安装了SublimeText 3之后发现既然不支持输入中文,于是在网上搜罗一下,发现很多人遇到了同样的问题,但是解决办法大该就只有一个。下面根据自身的安装及解决办法总结如下:


1. SublimeText 3的安装

    安装方式有多种,本文所描述的是从官方网站上下载64位的.deb文件
,具体为http://c758482.r82.cf2.rackcdn.com/sublime-text_build-3059_amd64.deb
文件,下载后双击即会自动使用默认的安装软件安装。


2. 相关依赖软件的安装

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


3. 拷贝如下代码到文件sublime_imfix.c文件中,该文件需要自己创建,随便放到那里都行。

/*
 * sublime-imfix.c
 * Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.
 * By Cjacker Huang <jianzhong.huang at i-soft.com.cn> *
 *
 * 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);
}

按照文件头上注释所说的编译该文件,在终端里进入到存放该文件的目录中,输入如下命令:
    gcc -shared -o libsublime-imfix.so sublime_imfix.c  `pkg-config –libs –cflags gtk+-2.0` -fPIC
最后在当前目录下得到libsublime-imfix.so这个共享库。

4. 中文输入

    到这里默认已经装好了中文输入法(搜狗输入法linux版)。得到第3步中的库libsublime-imfix.so之后,先试试看是否能正常使用中文输入法,在终端中输入如下命令:

    LD_PRELOAD=./libsublime-imfix.so subl             #subl是安装好SublimeText 3后的程序启动命令

如果一切正常,在启动之后,搜狗输入法就能可以输入了。


5. 为了方便

    在第4步中如果每次都输入LD_PRELOAD这样显得太不方便了,在这里提供简单修改图标连接的方式,快速打开SublimeText。将libsublime-imfix.so拷贝到系统库的默认路径中:

    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

这样就通过快捷方式打开SublimeText 3就可以支持中文输入了。

    

修改文件/usr/bin/subl的内容(以下若不配置,终端输入subl,无法使用中文)

sudo gedit /usr/bin/subl

    将

#!/bin/sh
       exec /opt/sublime_text/sublime_text "$@"

    修改为

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

    此时,在命令中执行 subl 将可以使用搜狗for linux的中文输入



如下图:

在KUbuntu 15.04中使SublimeText 3支持中文输入法

(注意使用单引号无法右键打开文件,亲自测试)

改良折中的方式

修改时注意使用双引号“”,可以右键打开文件,但是还是无法打开带空格文件名的文件。

修改后的配置文件如下:

[Desktop Entry]
Version=1.0
Type=Application
Name=Sublime Text
GenericName=Text Editor
Comment=Sophisticated text editor for code, markup and prose
Exec=bash -c "LD_PRELOAD=/usr/lib/libsublime-imfix.so exec /opt/sublime_text/sublime_text %F"
Terminal=false
MimeType=text/plain;
Icon=sublime-text
Categories=TextEditor;Development;
StartupNotify=true
Actions=Window;Document;

[Desktop Action Window]
Name=New Window
Exec=bash -c "LD_PRELOAD=/usr/lib/libsublime-imfix.so exec /opt/sublime_text/sublime_text -n"
OnlyShowIn=Unity;

[Desktop Action Document]
Name=New File
Exec=bash -c "LD_PRELOAD=/usr/lib/libsublime-imfix.so exec /opt/sublime_text/sublime_text --command new_file"
OnlyShowIn=Unity;

再按照上述修改文件/usr/bin/subl的内容。

此处仅修改了/usr/share/applications/sublime-text.desktop,但可以正常使用了。

opt/sublime_text/目录下的sublime-text.desktop可以修改,也可不修改。


测试:

在KUbuntu 15.04中使SublimeText 3支持中文输入法

注:第五步仅限使用.deb文件安装的情况,如果使用源码安装的则需要变通一下,写个脚本将LD_PRELOAD加上即可

在KUbuntu 15.04中使SublimeText 3支持中文输入法

最后附上文件

SublimeText 3支持中文输入法so文件

喜欢 (1)
[🍬谢谢你请我吃糖果🍬🍬~]
分享 (0)
关于作者:
少将,关注Web全栈开发、项目管理,持续不断的学习、努力成为一个更棒的开发,做最好的自己,让世界因你不同。
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(39)个小伙伴在吐槽
  1. 一个好的编辑器,能大大提高编程的效率。如果能熟知软件的快捷键,那更能让你得心印手。这些内容都是我网上和自己实际使用过程中所收集而来的,在网络上应该也算比较全面的了吧。欢迎大家补充,我也会在以后慢慢添加上来。<br /><br />插件使用方法:Ctrl+Shift+P 调用命令面板,我们就会找到一些以“Package Control:”开头的命令,我们常用到的就是几个 Install Package (安装扩展)、List Packages (列出全部扩展)、Remove Package (移除扩展)、Upgrade Package (升级扩展)<br /><br />Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)<br />Ctrl+G 跳转到相应的行<br />Ctrl+J 合并行(已选择需要合并的多行时)<br />Ctrl+L 选择整行(按住-继续选择下行)<br />Ctrl+M 光标移动至括号内开始或结束的位置<br />Ctrl+T 词互换<br />Ctrl+U 软撤销<br />Ctrl+P 查找当前项目中的文件和快速搜索;输入 @ 查找文件主标题/函数;或者输入 : 跳转到文件某行;<br />Ctrl+R 快速列出/跳转到某个函数<br />Ctrl+K Backspace 从光标处删除至行首<br />Ctrl+K+B 开启/关闭侧边栏<br />Ctrl+KK 从光标处删除至行尾<br />Ctrl+K+T 折叠属性<br />Ctrl+K+U 改为大写<br />Ctrl+K+L 改为小写<br />Ctrl+K+0 展开所有<br />Ctrl+Enter 插入行后(快速换行)<br />Ctrl+Tab 当前窗口中的标签页切换<br /><br />Ctrl+Shift+A 选择光标位置父标签对儿<br />Ctrl+Shift+D 复制光标所在整行,插入在该行之前<br />ctrl+shift+F 在文件夹内查找,与普通编辑器不同的地方是sublime允许添加多个文件夹进行查找<br />Ctrl+Shift+K 删除整行<br />Ctrl+Shift+L 鼠标选中多行(按下快捷键),即可同时编辑这些行<br />Ctrl+Shift+M 选择括号内的内容(按住-继续选择父括号)<br />Ctrl+Shift+P 打开命令面板<br />Ctrl+Shift+/ 注释已选择内容<br />Ctrl+Shift+↑可以移动此行代码,与上行互换<br />Ctrl+Shift+↓可以移动此行代码,与下行互换<br />Ctrl+Shift+[ 折叠代码<br />Ctrl+Shift+] 展开代码<br />Ctrl+Shift+Enter 光标前插入行<br />Ctrl+PageDown 、Ctrl+PageUp 文件按开启的前后顺序切换<br /><br />Ctrl+Z 撤销<br />Ctrl+Y 恢复撤销<br />Ctrl+F2 设置书签<br />Ctrl+/ 注释整行(如已选择内容,同“Ctrl+Shift+/”效果)<br />Ctrl+鼠标左键 可以同时选择要编辑的多处文本<br /><br />Shift+鼠标右键(或使用鼠标中键)可以用鼠标进行竖向多行选择<br />Shift+F2 上一个书签<br />Shift+Tab 去除缩进<br />Alt+Shift+1(非小键盘)窗口分屏,恢复默认1屏<br />Alt+Shift+2 左右分屏-2列<br />Alt+Shift+3 左右分屏-3列<br />Alt+Shift+4 左右分屏-4列<br />Alt+Shift+5 等分4屏<br />Alt+Shift+8 垂直分屏-2屏<br />Alt+Shift+9 垂直分屏-3屏<br /><br />Alt+. 闭合当前标签<br />Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑<br /><br />Tab 缩进 自动完成<br />F2 下一个书签<br />F6 检测语法错误<br />F9 行排序(按a-z)<br />F11 全屏模式
    故事、自己写2015-10-04 20:39 回复 未知操作系统 | 未知浏览器