文档章节

完美解决 Linux 下 Sublime Text 中文输入

tsl0922
 tsl0922
发布于 2013/03/13 17:09
字数 441
阅读 34972
收藏 58

参考Sublime Text官方论坛一位中国哥们的 回复,通过以下方法完美解决Sublime Text 2中文输入的问题。这几天讨论区老是有人提问,就写个教程吧。

系统:Linux Mint 14 Nadia
输入法:Fcitx 4.2.6.1 PPA。

1. 保存下面的代码为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); 
}

2. 编译动态库:

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

(编译环境和GTK的dev包请自行安装)

3. 设置 LD_PRELOAD 并启动 Sublime Text: 

LD_PRELOAD=./libsublime-imfix.so sublime_text

为了不用每次启动Sublime Text都打这么一长串东西,写了个启动Sublime的脚本:

#!/bin/bash

SUBLIME_HOME="/opt/sublime_text"
LD_LIB=$SUBLIME_HOME/libsublime-imfix.so
sh -c "LD_PRELOAD=$LD_LIB $SUBLIME_HOME/sublime_text $@"

(把libsublime-imfix.so放到Sublime Text目录下并修改脚本中的SUBLIME_HOME)

输入效果图:

© 著作权归作者所有

共有 人打赏支持
tsl0922

tsl0922

粉丝 259
博文 26
码字总数 11714
作品 1
深圳
高级程序员
私信 提问
加载中

评论(43)

R
Rancho_Cooper
请问,第三步是在哪里设置? 环境变量吗
海天鹰
海天鹰
为什么我不行,报错:
(sublime_text:1475): Gdk-WARNING **: gdkdrawable-x11.c:952 drawable is not a pixmap or window
skys215
skys215
这个是什么输入法啊?
h281612237
h281612237
卧槽 爆个bug!!  在ubuntu14.04 64位中,直接在终端输入LD_PRELOAD=./libsublime-imfix.so sublime_text可以用输入法,但是写成脚本之后就悲剧了,打开脚本提示无法打开动态库,!解决办法在脚本中LD_LIB变量中 不要用全路径去链接动态库,直接 LD_LIB=./libsublime-imfix.so就可以了,。。脚本完美运行
spademan
spademan

引用来自“YPHP”的评论

ubuntu 14 测试通过,谢谢楼主~!
求指导
killer_v
killer_v
楼主,貌似64位的不行,会出现以下报错:
ERROR: ld.so: object './libsublime-imfix.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
魔神翼
魔神翼
https://github.com/liberize/sublime-text-plugins/blob/master/sublime_imfix/sublime_imfix.c
@tsl0922 这个解决了Browse Packages打不开的问题
上帝爱开源
上帝爱开源
解决了我的问题!
YPHP
YPHP
ubuntu 14 测试通过,谢谢楼主~!
rongfei
rongfei
ubuntu 13.10下搜狗输入法,测试通过
配置Elementary OS作为工作环境

买了新电脑之后,就换上Elementary OS作为自己的Linux版本。不得不说,Elementary OS确实是我见过的最漂亮的Linux发行版,而且它的panel+dock的设计也很适合用来工作。折腾一番之后终于配置好...

halfcoder
2013/10/12
0
0
Ubuntu下Sublime Text 3解决无法输入中文的方法

环境: Ubuntu14.04 搜狗输入法 for Linux Sublime text 3 提示:编译请在非root下进行 本经验目前在Ubuntu14.04环境下,已有搜狗输入法 for Linux和Sublime Text 3的情况下安装成功。 保存下...

zhangsirsdo
2014/11/04
0
0
linux下sublime text的中文输入问题

晚上经过参照网上的解决方法,实践了一下,解决了sublime 在linux下的中文输入问题 1:切换到~目录,然后新建一个sublimeimfix.c的文件 touch sublimeimfix.c 2:编辑sublimeimfix.c文件 gedi...

雨醉风尘
2015/11/15
0
0
在Ubuntu 14.04中使SublimeText 3支持中文输入法

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

赵小宾
2015/05/19
0
0
29.centos下安装sublime text2

Sublime Text 2是一款跨平台文本编辑器,支持Windows,Linux,Mac os 特色功能: 良好的扩展功能(Package) 右边没有滚动条,取而代之的是代码缩略图 强大的快捷命令:可实时搜索相应的命令、...

quanpower
2013/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
2
0
聊聊storm的window trigger

序 本文主要研究一下storm的window trigger WindowTridentProcessor.prepare storm-core-1.2.2-sources.jar!/org/apache/storm/trident/windowing/WindowTridentProcessor.java public v......

go4it
昨天
6
0
CentOS 生产环境配置

初始配置 对于一般配置来说,不需要安装 epel-release 仓库,本文主要在于希望跟随 RHEL 的配置流程,紧跟红帽公司对于服务器的配置说明。 # yum update 安装 centos-release-scl # yum ins...

clin003
昨天
8
0
GPON网络故障处理手册

导读 为了方便广大网络工作者工作需要,特搜集以下GPON网络处理流程供大家学习参考。开始—初步定为故障—检查光纤状况—检查ONU状态--检查设备运行状态—检查设备数据配置—检查上层设备状态...

问题终结者
昨天
9
0
MariaDB、Apache安装

11月12日任务 11.6 MariaDB安装 11.7/11.8/11.9 Apache安装 1.MariaDB安装 cd /usr/local/src wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/......

hhpuppy
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部