• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Linux 下 Sublime Text 中文输入问题的解决方案

    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

    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,这样Sublime Text 就可以输入中文啦,谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。

    上一篇:linux中运维自动化之Cobbler 系统安装使用详解
    下一篇:Linux系统下禁止非WHEEL用户使用SU命命的两种实现方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Linux 下 Sublime Text 中文输入问题的解决方案 Linux,下,Sublime,Text,中文,