zoukankan      html  css  js  c++  java
  • Ubuntu Sublime test3不能输入中文的解决办法

    这是我亲测12.04版可用

    测试环境:
    1. linux mint xfce 17.3

    2. 搜狗输入法

    3. sublime text 3

    解决方案:

    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.将上一步的代码编译成共享库libsublime-imfix.so,命令

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

    注意:如果报错,那先解决相关依赖问题

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

    3.将共享库libsublime-imfix.so移动到sublime_text文件夹

    sudo mv libsublime-imfix.so /opt/sublime_text/

    4.修改/usr/bin/subl的内容

    sudo gedit /usr/bin/subl

    #!/bin/sh
    exec /opt/sublime_text/sublime_text "$@"

    替换为

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

    此时,在命令中执行 subl 将可以使用搜狗输入中文

    5.为了使用鼠标右键打开文件时能够使用中文输入,还需要修改文件sublime_text.desktop的内容。如果不这样每次在命令行执行subl才可以使用中文输入

    sudo gedit /usr/share/applications/sublime_text.desktop

    将内容替换为

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

    此时,就可以输入中文了!

    这是网络摘录比较好的,但是我的系统用不了

    Sublime Text 2/3 输入法修复[Ubuntu(Debian)]
    主要目的:
    • 安装 Sublime Text 3
    • 安装 Fcitx 输入法 + 皮肤
    • 修复 Sublime Text 2/3's 在 Ubuntu(Debian) 系统下的无法输入中文输入法的问题
    更新
    • (new)通过Ubuntu系统图标打开的Sublime也支持Fcitx输入中文了
    • (new)Fix "Package Preference" 无法打开,感谢@liberize
    注意
    • 这个修复仅当在终端中使用 subl . 调用 Sublime Text 的时有效, 具体原因请看源代码src/subl
    使用方法
    • 更新并升级系统为最新(较新的系统会解决很多可能出现的问题)
    sudo apt-get update && sudo apt-get upgrade


    • 克隆项目到本地 :
    git clone https://github.com/lyfeyaj/sublime-text-imfix.git
    • 运行脚本 :
    cd sublime-text-imfix && ./sublime-imfix
    • 完成! 重新启动后就可以在Sublime Text 2/3 中 使用Fcitx了! 注意: 皮肤可能需要自己选择 ^_^
    效果图:

    一个行者的旅途
  • 相关阅读:
    ST3 插件和技巧
    博客园中 代码使用 sublime-text 的主题
    JavaScript中的 prototype 和 constructor
    JavaScript 代码小片段
    JavaScript 静态方法和实例方法
    JavaScript 闭包的例子
    关于linux 交叉编译器的安装
    scrapy 实现mysql 数据保存
    django 实现 内网访问 和 用花生壳进行内网穿透
    django 中从外界借助多个网站时 static 的存放和整理
  • 原文地址:https://www.cnblogs.com/xinzghewanfu/p/5904262.html
Copyright © 2011-2022 走看看