文档章节

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

tsl0922
 tsl0922
发布于 2013/03/13 17:09
字数 441
阅读 3.6W
收藏 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

粉丝 257
博文 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
5K
0
linux下sublime text的中文输入问题

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

雨醉风尘
2015/11/15
304
0
Ubuntu下Sublime Text 3解决无法输入中文的方法

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

zhangsirsdo
2014/11/04
938
0
在Ubuntu 14.04中使SublimeText 3支持中文输入法

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

赵小宾
2015/05/19
90
0
解决linux下sublime text3无法输入中文的情况

转自:http://geek.csdn.net/news/detail/44464 1.首先保证你的电脑有c++编译环境 如果没有,通过以下指令安装 2.在~(/home)目录新建一个名为sublime-imfix.c的文件 内容如下: 3.将上述文...

田益铭
2016/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux常用命令08 - curl

curl 是一个命令行实用程序,用于将数据从服务器或传输到服务器,该服务器设计用于在没有用户交互的情况下工作。 使用 curl,您可以使用支持的协议(包括 HTTP、 HTTPS、 SCP、 SFTP 和 FTP)...

叉叉敌
24分钟前
17
0
java8 map根据key排序和根据value排序

1、根据key排序 Map<String,String> result = new LinkedHashMap<>();Map<String,String> map = new HashMap<>(); map.entrySet().stream()    .sorted(Map.Entry.comparingByKey......

文文1
25分钟前
13
0
scrapy爬取word转换HTML页面 出现中文乱码

def parse(self, response): print('========== parse ==========') print(response.text[:100]) body = response.body encodings = ['utf-8', 'gbk', 'gb2312', 'iso-8859-1', 'latin1'] fo......

driverxb
31分钟前
13
0
JavaScript模块化-CommonJS、AMD、CMD、UMD、ES6

前言:模块化开发需求 在JS早期,使用script标签引入JS,会造成以下问题: 加载的时候阻塞网页渲染,引入JS越多,阻塞时间越长。 容易污染全局变量。 js文件存在依赖关系,加载必须有顺序。项...

胡哥有话说
34分钟前
12
0
京东商城背后的AI技术能力揭秘 - 基于关键词自动生成摘要

作者:京东AI研究院 导言 过去几十年间,人类的计算能力获得了巨大提升;随着数据不断积累,算法日益先进,我们已经步入了人工智能时代。确实,人工智能概念很难理解,技术更是了不起,背后的...

京东智联云开发者
42分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部