zoukankan      html  css  js  c++  java
  • 允许Sublime编辑器在Ubuntu上输入中文

      Sublime Text是一款功能非常强大的轻量级代码编辑器,有关功能介绍和使用可以看我另一篇文章的描述http://www.cnblogs.com/jaxu/p/5037547.html

      不过,在Ubuntu系统上Sublime Text不支持输入中文,如何解决呢?

      搜索百度和Google,在github上发现了一个解决方案,经过尝试可以使用。

      其基本思路就是用C编写一个hotfix然后编译成共享库,移到Sublime Text的安装目录中,启动的时候带上这个共享库。步骤和shell命令在github上已经写得非常清楚了,这里我再详细描述一下。

    1. 编写sublime-imfix.c源文件,放在~/home目录下(其实任何目录都可以)。源代码文件在github上有下载,我这里也给一份,方便copy:

    /*
    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. 通过以下命令安装CC++编译环境和gtk libgtk2.0-dev。

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

    3. 执行以下命令编译共享库。执行该命令时需要在sublime-imfix.c文件所在的目录。

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

    4. 将编译好的库移到Sublime Text的安装目录。如果你是通过Sublime Text官网直接下载.deb文件并安装的,在我机器上的默认位置是/opt/sublime_text

    mv libsublime-imfix.so /opt/sublime_text

    注意执行上述命令时需要在sublime-imfix.c文件所在的目录。

    5. 通过下面的命令启动Sublime Text编辑器,看看是否可以输入中文啦?

    LD_PRELOAD=./libsublime-imfix.so ./sublime_text

    6. 你当然不想每次都在终端通过输入命令来打开Sublime Text编辑器,切换到/usr/share/applications目录,编辑sublime_text.desktop文件的内容如下。

    cd /usr/share/applications/
    [Desktop Entry]
    Version=1.0
    Type=Application
    Name=Sublime Text
    GenericName=Text Editor
    Comment=Sophisticated text editor for code, markup and prose
    #Exec=/opt/sublime_text/sublime_text %F
    Exec=bash -c "LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so /opt/sublime_text/sublime_text"
    Terminal=false
    MimeType=text/plain;
    Icon=sublime-text
    Categories=TextEditor;Development;
    StartupNotify=true
    Actions=Window;Document;
    
    [Desktop Action Window]
    Name=New Window
    Exec=/opt/sublime_text/sublime_text -n
    OnlyShowIn=Unity;
    
    [Desktop Action Document]
    Name=New File
    Exec=/opt/sublime_text/sublime_text --command new_file
    OnlyShowIn=Unity;

    注意看上面高亮的部分,将第5步中的启动命令替换进去,注意相对路径的位置。

    7. 然后就没有然后了。在dash或启动栏中直接点击Sublime Text的图标,在打开的窗口中新建一个文件,切换输入法输入中文吧!

  • 相关阅读:
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    flowable 获取当前任务流程图片的输入流
    最新 接口api插件 Swagger3 更新配置详解
    springboot 集成 activiti 流程引擎
    java 在线考试系统源码 springboot 在线教育 视频直播功能 支持手机端
    阿里 Nacos 注册中心 配置启动说明
    springboot 集成外部tomcat war包部署方式
    java 监听 redis 过期事件
    springcloudalibaba 组件版本关系
    java WebSocket 即时通讯配置使用说明
  • 原文地址:https://www.cnblogs.com/jaxu/p/5564342.html
Copyright © 2011-2022 走看看