将末尾文件保存为sublime-imfix.c

然后编译

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

You will get a file called libsublime-imfix.so, put it in $HOME/.config/sublime-text-3/Packages/

然后打开~/.bashrc
加入

# sublime fcitx fix
alias sublime='LD_PRELOAD=$HOME/.config/sublime-text-3/Packages/libsublime-imfix.so /snap/bin/sublime-text.subl'

注意/snap/bin/sublime-text.subl改为你subl程序所在的地方, 可以用 whereis命令来查看

seamanj@seamanj-Blade:~$ whereis sublime-text.subl
sublime-text: /snap/bin/sublime-text.subl

以上通过命令启动sublime可以输入中文, 但是通过图标启动(.desktop)就不行了,那我们先找到图标的位置

env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/sublime-text_subl.desktop /snap/bin/sublime-text.subl %U

然后用文本打开
sudo gedit sublime-text_subl.desktop
在Exec地方加上我们链接的库

[Desktop Entry]
Version=1.0
Type=Application
Name=Sublime Text
GenericName=Text Editor
Comment=Sophisticated text editor for code, markup and prose
Exec=env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/sublime-text_subl.desktop LD_PRELOAD=/home/seamanj/.config/sublime-text-3/Packages/libsublime-imfix.so /snap/bin/sublime-text.subl %U
Terminal=false
MimeType=text/plain;
Icon=/snap/sublime-text/44/opt/sublime_text/Icon/256x256/sublime-text.png
Categories=TextEditor;Development;
StartupNotify=true
Actions=Window;Document;[Desktop Action Window]
Name=New Window[Desktop Action Document]
Name=New File

注意在desktop entry里面不能用宏$HOME

到底, 通过图标打开也可以输入中文了

/*
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>
By whitequark@whitequark.orgHow to compile:
gcc -shared -o libsublime-imfix.so sublime_imfix.c  `pkg-config --libs --cflags gtk+-2.0` -fPIC
How to use:
LD_PRELOAD=./libsublime-imfix.so sublime_textChanges:
2014 06-09
1, Fix cursor position update for sublime text 3.
2, Combine the codes from whitequark(fix for xim immodule) and add cursor update support for XIM immodule.
*//*for RTLD_NEXT*/
#define _GNU_SOURCE#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <assert.h>
#include <dlfcn.h>
#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>#ifdef VERBOSE
#define DEBUG(fmt, ...) do { \FILE* err = fopen("/tmp/libsublime-immethod-fix.log", "a"); \if (err) { \fprintf(err, fmt, __VA_ARGS__); \fclose(err); \} \} while(0)
#else
#define DEBUG(fmt, ...)
#endiftypedef GdkSegment GdkRegionBox;struct _GdkRegion
{long size;long numRects;GdkRegionBox *rects;GdkRegionBox extents;
};GtkIMContext *local_context;//this func is interposed to support cursor position update.
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 in sublime text 2//And is 1 in sublime text 3.//Maybe sometimes we will make a mistake, but for most of the time, it should be the caret.if((rectangle->width == 2 || rectangle->width == 1)  && 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);//below is our interposed codes to save the context to local_context.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;}//only add this event_filter when using 'fcitx' immodule.//for xim immodule, this function is as same as original from gtk2.const gchar * immodule = g_getenv("GTK_IM_MODULE");if(immodule && !strcmp(immodule, "fcitx")) {gdk_window_add_filter (window, event_filter, context);}
}/*below codes is from whitequark, fix for xim immodule*//* See gtkimcontextxim.c */
GType gtk_type_im_context_xim = 0;#define GTK_TYPE_IM_CONTEXT_XIM            (gtk_type_im_context_xim)
#define GTK_IM_CONTEXT_XIM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_IM_CONTEXT_XIM, GtkIMContextXIM))
#define GTK_IM_CONTEXT_XIM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_IM_CONTEXT_XIM, GtkIMContextXIMClass))
#define GTK_IS_IM_CONTEXT_XIM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_IM_CONTEXT_XIM))
#define GTK_IS_IM_CONTEXT_XIM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_IM_CONTEXT_XIM))
#define GTK_IM_CONTEXT_XIM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_IM_CONTEXT_XIM, GtkIMContextXIMClass))typedef struct _GtkIMContextXIM       GtkIMContextXIM;
typedef struct _GtkIMContextXIMClass  GtkIMContextXIMClass;struct _GtkIMContextXIMClass
{GtkIMContextClass parent_class;
};typedef struct _StatusWindow StatusWindow;
typedef struct _GtkXIMInfo GtkXIMInfo;struct _GtkIMContextXIM
{GtkIMContext object;GtkXIMInfo *im_info;gchar *locale;gchar *mb_charset;GdkWindow *client_window;GtkWidget *client_widget;/* The status window for this input context; we claim the
*    * status window when we are focused and have created an XIC
*       */StatusWindow *status_window;gint preedit_size;gint preedit_length;gunichar *preedit_chars;XIMFeedback *feedbacks;gint preedit_cursor;XIMCallback preedit_start_callback;XIMCallback preedit_done_callback;XIMCallback preedit_draw_callback;XIMCallback preedit_caret_callback;XIMCallback status_start_callback;XIMCallback status_done_callback;XIMCallback status_draw_callback;XIMCallback string_conversion_callback;XIC ic;guint filter_key_release : 1;guint use_preedit : 1;guint finalizing : 1;guint in_toplevel : 1;guint has_focus : 1;
};static GClassInitFunc orig_gtk_im_context_xim_class_init;
static GType (*orig_g_type_module_register_type)(GTypeModule *,GType, const gchar *,const GTypeInfo *, GTypeFlags);
static gboolean (*orig_gtk_im_context_xim_filter_keypress)(GtkIMContext *context,GdkEventKey *event);static gboolean
hook_gtk_im_context_xim_filter_keypress(GtkIMContext *context, GdkEventKey *event) {GtkIMContextXIM *im_context_xim = GTK_IM_CONTEXT_XIM(context);if (!im_context_xim->client_window) {DEBUG("im_context_xim == %p\n", im_context_xim);DEBUG("event->window == %p\n", event->window);gtk_im_context_set_client_window(context, event->window);}return orig_gtk_im_context_xim_filter_keypress(context, event);
}static void
hook_gtk_im_context_xim_class_init (GtkIMContextXIMClass *class) {orig_gtk_im_context_xim_class_init(class, NULL); /* wat? */GtkIMContextClass *im_context_class = GTK_IM_CONTEXT_CLASS (class);assert(!orig_gtk_im_context_xim_filter_keypress);orig_gtk_im_context_xim_filter_keypress = im_context_class->filter_keypress;im_context_class->filter_keypress = hook_gtk_im_context_xim_filter_keypress;DEBUG("orig_gtk_im_context_xim_filter_keypress: %p\n",orig_gtk_im_context_xim_filter_keypress);
}GType
g_type_module_register_type (GTypeModule *module,GType parent_type,const gchar *type_name,const GTypeInfo *type_info,GTypeFlags flags) {if (!orig_g_type_module_register_type) {orig_g_type_module_register_type = dlsym(RTLD_NEXT, "g_type_module_register_type");assert(orig_g_type_module_register_type);}if (type_name && !strcmp(type_name, "GtkIMContextXIM")) {assert(!orig_gtk_im_context_xim_class_init);orig_gtk_im_context_xim_class_init = type_info->class_init;assert(sizeof(GtkIMContextXIM) == type_info->instance_size);const GTypeInfo hook_im_context_xim_info ={type_info->class_size,type_info->base_init,type_info->base_finalize,(GClassInitFunc) hook_gtk_im_context_xim_class_init,type_info->class_finalize,type_info->class_data,type_info->instance_size,type_info->n_preallocs,type_info->instance_init,};DEBUG("orig_gtk_im_context_xim_class_init: %p\n", orig_gtk_im_context_xim_class_init);gtk_type_im_context_xim =orig_g_type_module_register_type(module, parent_type, type_name,&hook_im_context_xim_info, flags);return gtk_type_im_context_xim;}return orig_g_type_module_register_type(module, parent_type, type_name, type_info, flags);
}

Make Fcitx Work In Sublime-Text-3相关推荐

  1. sublime text配置fcitx输入法

    sublime text配置fcitx输入法 环境:Fedora20 输入法:fcitx sublime text:version 3 安装fcitx输入法 这个看前面教程 编译sublime-imf ...

  2. Sublime Text 3 史上最性感的编辑器

    ↑ ↑ ↑ ↑ ↑ 请看文件夹 ↑ ↑ ↑ ↑ ↑ 下载 / 安装 windows / MAC OS 官网下载,双击安装,这个都会吧- linux linux下安装,一种办法是从官网下载 tar.bz ...

  3. Sublime Text 3在ubuntu12.10下无法中文输入的解决方案

    Sublime的名气就不多说了吧,如果做前端开发还不知道这个神器的话,就真是凹凸慢了. 我的环境是ubuntu12.10,Sublime用的是版本3,输入法是用的fcitx搜狗输入法. (如果还没有安 ...

  4. Sublime Text 3 无法输入中文解决方案

    Sublime Text 3 安装及无法输入中文解决方案 安装sublime-text 3 如果是ubuntu系统终端输入: wget -qO - https://download.sublimete ...

  5. Sublime Text 2/3 输入法修复[Ubuntu(Debian)]

    一直想找一个可以替代sublime的IDE主要还是hi因为没有好的方法解决中文输入的问题, 今天在网上找到一个非常不错的方法,亲自实验是可行的,就记录下来了,我的系统是ubuntu16.04 Subl ...

  6. linux sublime中文输入法,完美解决 Linux 下 Sublime Text 中文输入

    测试系统:Ubuntu 12.10 (理论上所有 Linux 发行版都通用) 输入法:Fcitx 4.2.6.1 Sublime Text 版本:Sublime Text 3 dev(Build 30 ...

  7. Sublime Text 3 及Package Control 安装(附上一个3103可用的Key)

    一.Sublime Text 3 下载. 官方下载地址:http://www.sublimetext.com/ 二.Sublime Text 3  安装. 打开安装包,进行傻瓜式安装. 三.注册. 点 ...

  8. Sublime Text 3 常用插件以及安装方法(转)

    http://www.cnsecer.com/460.html 安装Sublime Text 3插件的方法: 朋友们,小站活着不容易,全靠广告费养着了,如果本文对你有帮助.麻烦动下手点下页面的广告吧, ...

  9. 在Ubuntu 14.04 64bit上为Sublime text 3安装搜狗拼音输入法

    Sublime text 3不支持中文输入法,下面是我结合网上的各种资料摸索实践了一遍,为Sublime text 3成功添加了搜狗拼音输入法,特此记录以备参考. 前提条件: 事先安装并配置好搜狗拼音 ...

  10. 在Ubuntu 14.04 64bit上安装配置sublime text 3(Build 3083)

    Sublime Text是一个轻量.简洁.高效.跨平台的编辑器,同时支持Windows.Linux.Mac OS X等操作系统.Sublime Text是由程序员Jon Skinner于2008年1月 ...

最新文章

  1. linux 任务计划 权限设置,Linux系统 文件权限+计划任务+日志系统
  2. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
  3. Spring Boot+JWT+Shiro+MyBatisPlus实现Restful快速开发后端脚手架
  4. 11.18 Apache用户认证 11.19/11.20 域名跳转 11.21 Apache访问日志
  5. BAPI FOR MD61,MD62,MD63
  6. 二进制转16进制转文本[BJDCTF 2nd]cat_flag
  7. python教程:读取.dcm文件,并转化为.jpg格式
  8. nginx vs. Lighttpd vs. Apache 高效的web server服务器软件比较
  9. 脑部手术成功,只是万里长征走完了第一步
  10. Windows下PHP安装配置
  11. mybaits.xml文件约束,头部
  12. Python 基于OpenCV+face_recognition实现人脸捕捉与人脸识别(照片对比)
  13. wireshark详细图文入门教程
  14. Power BI 中的货币换算
  15. Symbian 术语表
  16. JavaScript 移动端点击事件延迟问题
  17. html自动对齐快捷键,Sketch 技巧:好用的对齐快捷键(附设置教程)
  18. python库h5py读写数据
  19. POI导出EXCEL自定义背景颜色
  20. python数据可视化学习

热门文章

  1. android imageview 等比例放大缩小,imageView的使用(进行原样的保持和按照比例的缩放:)...
  2. setupUi()引起的麻烦
  3. Qt Creator 添加自定义注释
  4. 32位微型计算机原理接口,32位微机原理与接口实验箱
  5. iOS开发中常见的性能优化技巧
  6. gradle 刷新打包的时候报错
  7. Moddable SDK为物联网开发提供JavaScript引擎:不到32KB
  8. 外网访问内网Tornado
  9. 11.6 ConfigParser模块
  10. iOS 初识CoreBluetooth