• 解决 Ubuntu 下 Sublime Text 无法输入中文的问题


    解决 Ubuntu 下 Sublime Text 无法输入中文的问题

    1. 安装依赖库

    sudo apt-get install build-essential
    sudo apt-get install libgtk2.0-dev
    

    2. 编译共享库

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

    sublime_imfix.c内容如下:

    /*
    sublime-imfix.c
    Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.
    
    gcc -shared -o libsublime-imfix.so sublime-imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC
    LD_PRELOAD=./libsublime-imfix.so subl
    */
    #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);
    }
    

    3. 移动共享库到Sublime Text 3安装目录

    sudo mv libsublime-imfix.so /opt/sublime_text
    

    4. 修改启动脚本

    sudo vim /usr/bin/subl
    

    subl内容如下:

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

    5. 修改/usr/share/appliations/sublime_text.desktop

    sudo sed -i 's//opt/sublime_text/sublime_text/subl/g' /usr/share/applications/sublime_text.desktop
    

    6. 替换本地的sublime_text.desktop

    cp /usr/share/applications/sublime_text.desktop ~/.local/share/applications/sublime_text.desktop
    
  • 相关阅读:
    ASP.NET中的特殊路径标识"~"
    ASP.NET中的Request、Response、Server对象
    XSS漏洞(跨站脚本)
    WEB开发原则
    HTTP协议
    【原】从零开始改造淘淘商城(引入dubbo解决项目耦合)02
    【转】Nginx的启动、停止与重启
    【原】spring boot添加cros全局过滤器
    【转】Swagger2 添加HTTP head参数
    【原】Spring Boot 配置swagger2没有文档解决方案
  • 原文地址:https://www.cnblogs.com/jacen789/p/9866624.html
Copyright © 2020-2023  润新知