/ ubuntu  

ubuntu下sublime中文解决办法

我的系统版本ubuntu12.04
老实说,作为linux刚入门的菜鸟真的经不起折腾,问题总是接连不断的出现也是醉了。

从头开始记录一下吧

下载安装配置sublime

sublime下载地址

下载下来后,发现后缀名不是gz的,tar zvxf解压不了。。网上说用tar vxf可以解压,具体我也没试,直接双击解压了。

解压后,文件夹名称带空格的,重命名一下,不然会影响到后面的步骤。
重命名指令 mv Sublime Text 2 sublimeText2

然后打开文件夹找到一个可执行文件,名称叫sublime_text
直接在该文件夹下面输入 ./sublime_text Test.java 就可以运行sublime了。
为了能在其他地方能够运行sublime,有以下2个方式:

  • 配置环境变量
  • 直接创建一个快捷方式到/usr/bin里面

配置环境变量就不说了,我们用第二种吧。

ln -s sublime安装路径/sublime_text /usr/bin/sublime

先不用急着配这个,后面是要替换的
以上做法相当于在/usr/bin下面创建了一个快捷方式,名称叫sublime,这个名称可以随便取。
然后再在终端任何地方,直接sublime AA.java就OK了。

上面说的这种方式弄清楚了,对后面的解决方式就好理解了

然后问题就来了,发现怎么输入不了中文,怎么切换都切换不了,ubuntu下默认的ibus有问题。
网上给出了很多解决办法,有的说直接装fcitx可以解决,于是我就装了,结果确实可以,但是打错一个字删都删不了,必须要打出来才能删。

坑啊!!于是想着还是装搜狗输入法吧。

下载安装搜狗输入法

搜狗输入法下载地址
点击对于的32位还是64位后会有对应帮助页面
照着上面的帮助页面进行操作

上面给的操作有些地方有出入,下面是我的操作

  1. 输入alt+F2打开搜索窗口,就是左上方那个Dash
  2. 输入‘更新’,查询更新的那个软件
  3. 点击 ‘设置’>’其他软件’>’添加’>’在弹出的窗口中输入ppa:fcitx-team/nightly‘
  4. 在要更新的软件源里面右键,全部不选,然后找到其他软件那3个,对上面添加的那几个安装上就好了
  5. 后面就是步骤见帮助页面

注意!第三,四步不执行的话,后面下载完fcitx后,双击deb包会提示fcitx版本过低的,安装不了搜狗
安装完成后立马就遇到一个问题,一切换搜狗输入法,直接一个弹窗’搜狗面板程序加载失败,请重启以使用输入法!‘,我们就重启一下就好了。

给sublime添加中文支持

  1. 新建一个文件sublime_imfix.c,然后将下面这段代码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. 在终端输入下面指令编译上面的代码

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

    我在第二部这里又出了一个问题

    No package ‘gtk+-2.0’ found (PKG_CONFIG_PATH问题)
    然后我去/usr/bin里面查看了一下,我确实没有gtk,
    于是我百度了一下安装指令 apt-get install libgtk2.0-dev
    然后运行安装指令进行gtk的安装

  3. 在终端输入LD_PRELOAD=./libsublime-imfix.so sublime运行

上面操作后发现,确实可以输入中文了,可是我得正常编辑,总不能每次都用LD_PRELOAD然后一大串地址吧。

于是我考虑到可以通过写一个sh脚本,然后把它用最开始的快捷方式链接的方式去实现直接输入sublime XX.java就能输入中文。

  • 编写简单的shell ,取名custome_sublime
      #!/bin/bash
      LD_PRELOAD=/home/linuxv/software/sublimeText2/libsublime-imfix.so /home/linuxv/software/sublimeText2/sublime_text "$1"
    
    大家注意好上面的地址替换成你自己的安装地址
    上面的”$1”是用来代表命令执行的时候后面跟的第一个参数,主要用来代替使用sublime时后面跟的文件命 ‘T.java,B.java’等
    一开始没想到用”$1”参数,结果每次启动都是一个新的框,根本编辑不了某一个文件。
  • 将编写的sh脚本变成可执行文件 chmod +x custome_sublime

  • 然后将该可执行文件ln到/usr/bin里面 ln -s sublime安装路径/custome_sublime /usr/bin/sublime

OK,搞定了~
附上我文件的显示图供大家参考:

目录图片