您当前的位置: 首页 >  ubuntu

ubuntu15.04下sublime text不能输入中文的解决

发布时间:2015-07-28 12:28:57 ,浏览量:0

原因是由于中文输入法的输入焦点不能插入sublime的输入窗口中,需要使用代码强制插入输入焦点。 代码是cjacker 君提供的,可以看原始的讨论帖子:

http://www.sublimetext.com/forum/viewtopic.php?f=3&t=7006&start=10#p41343

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 

    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

3.使用LD_PRELOAD的方式加载到sublime程序中:

LD_PRELOAD=./libsublime-imfix.so sublime_text

因为我一般是在console中调用subl批处理程序,所以一劳永逸的方法就是直接改subl的内容: 1.用编辑器打开subl文件:

sudo subl $(which subl)

2.修改subl的内容:

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

3.将上面生成的共享库文件拷贝到指定的目录中

以后可以直接用subl启动sublime text程序,并且可以输入中文了。

这里写图片描述

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    110453博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0568s