zoukankan      html  css  js  c++  java
  • Ubuntu 下 Sublime 无法输入中文?(已解决)

    在 Ubuntu 里安装了 Sublime 却不能输入中文?

    这可不好。

    怎么办呢?

    Follow Me!

    1 获得 sublime-imfix.c 文件

    有 GitHub 账号的,可以从 https://github.com/YoungZHU/sublime-imfix.git 获取。

    或者直接复制以下代码:

     1 /*
     2 sublime-imfix.c
     3 Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.
     4 By Cjacker Huang <jianzhong.huang at i-soft.com.cn>
     5 
     6 gcc -shared -o libsublime-imfix.so sublime_imfix.c  `pkg-config --libs --cflags gtk+-2.0` -fPIC
     7 LD_PRELOAD=./libsublime-imfix.so sublime_text
     8 */
     9 #include <gtk/gtk.h>
    10 #include <gdk/gdkx.h>
    11 typedef GdkSegment GdkRegionBox;
    12 
    13 struct _GdkRegion
    14 {
    15   long size;
    16   long numRects;
    17   GdkRegionBox *rects;
    18   GdkRegionBox extents;
    19 };
    20 
    21 GtkIMContext *local_context;
    22 
    23 void
    24 gdk_region_get_clipbox (const GdkRegion *region,
    25             GdkRectangle    *rectangle)
    26 {
    27   g_return_if_fail (region != NULL);
    28   g_return_if_fail (rectangle != NULL);
    29 
    30   rectangle->x = region->extents.x1;
    31   rectangle->y = region->extents.y1;
    32   rectangle->width = region->extents.x2 - region->extents.x1;
    33   rectangle->height = region->extents.y2 - region->extents.y1;
    34   GdkRectangle rect;
    35   rect.x = rectangle->x;
    36   rect.y = rectangle->y;
    37   rect.width = 0;
    38   rect.height = rectangle->height; 
    39   //The caret width is 2; 
    40   //Maybe sometimes we will make a mistake, but for most of the time, it should be the caret.
    41   if(rectangle->width == 2 && GTK_IS_IM_CONTEXT(local_context)) {
    42         gtk_im_context_set_cursor_location(local_context, rectangle);
    43   }
    44 }
    45 
    46 //this is needed, for example, if you input something in file dialog and return back the edit area
    47 //context will lost, so here we set it again.
    48 
    49 static GdkFilterReturn event_filter (GdkXEvent *xevent, GdkEvent *event, gpointer im_context)
    50 {
    51     XEvent *xev = (XEvent *)xevent;
    52     if(xev->type == KeyRelease && GTK_IS_IM_CONTEXT(im_context)) {
    53        GdkWindow * win = g_object_get_data(G_OBJECT(im_context),"window");
    54        if(GDK_IS_WINDOW(win))
    55          gtk_im_context_set_client_window(im_context, win);
    56     }
    57     return GDK_FILTER_CONTINUE;
    58 }
    59 
    60 void gtk_im_context_set_client_window (GtkIMContext *context,
    61           GdkWindow    *window)
    62 {
    63   GtkIMContextClass *klass;
    64   g_return_if_fail (GTK_IS_IM_CONTEXT (context));
    65   klass = GTK_IM_CONTEXT_GET_CLASS (context);
    66   if (klass->set_client_window)
    67     klass->set_client_window (context, window);
    68 
    69   if(!GDK_IS_WINDOW (window))
    70     return;
    71   g_object_set_data(G_OBJECT(context),"window",window);
    72   int width = gdk_window_get_width(window);
    73   int height = gdk_window_get_height(window);
    74   if(width != 0 && height !=0) {
    75     gtk_im_context_focus_in(context);
    76     local_context = context;
    77   }
    78   gdk_window_add_filter (window, event_filter, context); 
    79 }

    注:假设 sublime-imfix.c 文件被放置到了 home (~)目录下。

    放到哪个目录都没关系,只要后面编译该文件时找对目录就行。

    2 安装依赖库

    终端下输入如下命令:

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

    3 编译

    终端下输入以下命令进行编译:

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

    编译好后,当前目录多了一个名为: libsublime-imfix.so 的库文件。

    注:该命令需要在 sublime-imfix.c 所在目录执行。

    按照第一步的说明,本例在 home(~)目录下 执行。

    4 将编译好的库文件移到 sublime 的安装目录下

    终端下输入以下命令:

    mv libsublime-imfix.so $SUBLIME_HOME/

    注:

    1)该命令需要在  libsublime-imfix.so 所在目录执行,本例中为 home(~)

    1) $SUBLIME_HOME 表示 sublime 的安装目录

    2) 直接放到 sublime 的安装目录,或者 放到其安装目录下的 lib 目录($SUBLIME_HOME/lib)均可。只要后面引用文件时注意目录

    5 启动 sublime

    终端下输入以下命令启动 sublime:

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

    注:该命令需要在 sublime 的安装目录下执行
    否则,需要将命令中的两个文件换成绝对路径

    另,有 GitHub 账号的,可以从 https://github.com/YoungZHU/sublime-imfix.git 查看。


     

    如果需要创建快捷方式,或锁定到启动器的(Ubuntu),和上面介绍的第5步一样,需要指定库文件。

    以笔者的Ubuntu为例,将其锁定到左侧的启动器,会有一个 sublime_text.desktop 的文件,目录: ~/.local/share/applications/ 

    文件内容如下:

     1 [Desktop Entry]
     2 Encoding=UTF-8
     3 Version=1.0
     4 Type=Application
     5 Name=Sublime Text 2
     6 Icon=/home/young/Software/Sublime/Icon/256x256/sublime_text.png
     7 Path=/home/young/Software/Sublime
     8 Exec=bash -c "LD_PRELOAD=/home/young/Software/Sublime/lib/libsublime-imfix.so /home/young/Software/Sublime/sublime_text"
     9 StartupNotify=false
    10 StartupWMClass=sublime_text
    11 OnlyShowIn=Unity;
    12 X-UnityGenerated=true

    主要的改动在第 8 行。

    这样,不用从命令行启动 sublime 也可以输入中文了。

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 黑色星期五
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    控件动态产生器(使用RegisterClasses提前进行注册)
    Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
    Log4delphi使用心得
  • 原文地址:https://www.cnblogs.com/memory4young/p/could-not-input-chinese-in-sublime-on-ubuntu.html
Copyright © 2011-2022 走看看