文档章节

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

tsl0922
 tsl0922
发布于 2013/03/13 17:09
字数 441
阅读 34761
收藏 58
点赞 10
评论 43

参考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

粉丝 260
博文 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下搜狗输入法,测试通过
Sublime Text 2/3 输入法(Fcitx)修复[Ubuntu(Debian)]

文章目录 主要目的 更新 注意 使用方法 主要目的 安装 Sublime Text 3 安装 Fcitx 输入法 + 皮肤 修复 Sublime Text 2/3’s 在 Ubuntu(Debian) 系统下的无法输入中文(CJK 字符)输入法的问题 ...

John ⋅ 06/15 ⋅ 0

Ubuntu,sublime的安装和配置中文输入

系统:Ubuntu 16.04 输入法:fcitx 拼音五笔 官网下载页: 安装 本想添加软件源到apt ,但是sublime的网站貌似被墙了。添加不成功。老是链接失败。只好下载安装包,自己手动安装了。 官网的安...

ol_O_O_lo ⋅ 05/17 ⋅ 0

linux 系统下安装sublime

首先在linux 下需要下载一个sublime的安装包,,,这里给大家提供一个下载地址:https://www.sublimetext.com/3 , 这里安装的是linux版本的sublime,所以必然是选择linux repos ,选择一个6...

上官_9b5e ⋅ 06/02 ⋅ 0

Sublime Text 3 (支持v3143)最新版破解及注册码

Sublime Text 是一个代码编辑器(Sublime Text 3是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器。Sublime Text 3 在2013年1月29日进入测试版本。起初仅开放给已购买 Subl...

我是李达康 ⋅ 2015/09/13 ⋅ 20

Sublime Text 3.1发布! 如何在Ubuntu 18.04中安装

Sublime Text 3.1发布! 如何在Ubuntu 18.04中安装 IMCN 20分钟前暂无评论 阅读 9 次 Sublime Text源代码编辑器3.1几天前发布,对DPI支持进行了大量改进。 Sublime Text 3.1发布亮点: Wind...

IMCN ⋅ 05/12 ⋅ 0

年薪20万Python工程师进阶(1):Python 资源 + 经典练手项目

Python 越来越火爆,最近自己也在学习。整理下一些 Python 资料,和练手的项目。希望对你学习 Python 有所帮助。 1、入门阶段 1 Python 官网 Python 官网 The Python Tutorialdocs.python.o...

程序员八阿哥 ⋅ 05/11 ⋅ 0

Sublime-Text3 的安装与使用

Sublime-Text3 的安装与使用 Sublime-Text3 的安装与使用 01.Sublime-Text3介绍 Sublime-Text 是一个比较强大的代码,文本编辑器。它的强大之处可以总结以下: 1.可扩充性:你可以根据自己的需...

meiqi0538 ⋅ 05/03 ⋅ 0

8款实用Sublime text 3插件推荐

Sublime Text作为一个尽为人知的代码编辑器,其优点不用赘述。界面整洁美观、文本功能强大,且运行速度极快,非常适合编写代码,写文章做笔记。Sublime Text还支持Mac、Windows和Linux各大平...

slagga ⋅ 04/16 ⋅ 0

Sublime Text 3 配置python交互运行环境的快捷键

使用Sublime Text 3能以轻量级的环境写python脚本,运行python代码。为了更加方便地调用python脚本,通过在Sublime Text 3中绑定快捷键的方式,实现一键调用python交互运行环境,操作方式如下...

雪饼 ⋅ 06/07 ⋅ 0

全栈开发必备的10款Sublime Text 插件

全栈开发必备的10款Sublime Text 插件 来源:梦想天空博客园 时间:2014-11-28 10:16:28 阅读数:218406 分享到:6 [导读] Sublime Text 具有漂亮的用户界面和强大的功能,例如代码缩略图,多...

thinkyoung ⋅ 2015/11/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 22分钟前 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 37分钟前 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 8

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部