文档章节

在linux中安装sublime并解决无法输入中文的问题

阿信sxq
 阿信sxq
发布于 2017/05/27 16:49
字数 864
阅读 87
收藏 0

由于众所周知的原因,在linux中使用中文一直有一些尴尬的情况,其中在sublime中无法切换输入法输入中文就是一个,下面介绍一种解决方案。

安装sublime

首先需要到sublime的官网下载程序,http://www.sublimetext.com/3 下载得到一个tar.bz2的文件,将这个文件解压缩得到一个文件夹,放置在自己喜欢的地方,假设放置为 /opt/sublime_text_3/。

在解压得到的文件夹中有个 .desktop 的文件,将其中的关于路径的描述进行修改,修改为实际的路径,然后保存到 /usr/local/share/applications 中,需要sudo的权限。

此时,在菜单中已经能够看到sublime的图片,并且已经可以使用。

配置sublime

默认的sublime配置有一些地方需要调整,Preferences->settings,然后将下面的配置粘贴进配置文件中

{
	"color_scheme": "Packages/Color Scheme - Default/Monokai Bright.tmTheme",
	"expand_tabs_on_save": true,
	"font_face": "Microsoft Yahei Mono",
	"font_size": 14,
	"tab_size": 4,
	"translate_tabs_to_spaces": true,
	"update_check": false
}

Preferences->key bindings,粘贴下面的配置,快捷键的配置

[
    { "keys": ["alt+down"], "command": "swap_line_down" },
    { "keys": ["alt+up"], "command": "swap_line_up" },
    { "keys": ["ctrl+d"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Line.sublime-macro"} },
    { "keys": ["ctrl+alt+up"], "command": "duplicate_line" },
]

解决输入中文的问题

linux上的sublime不知道为何,默认情况下无法切换中文进行输入,但是复制中文过来可以进行粘贴。

下面提供一种不是非常完美但是能够工作的解决方法。

首先需要安装fcitx与搜狗输入法,参考我写的另一篇文章

将下面的代码保存为 sublime_imfix.c ,

/*
sublime-imfix.c
Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.
By Cjacker Huang

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);
}

为了编译这个代码,需要特别安装编译 gtk2-devel ,编译的命令

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

将编译得到的libsublime-imfix.so放到sublime的程序目录中。

将下面的代码保存为 /usr/bin/sublime

#!/bin/bash

export LD_PRELOAD=/opt/sublime_text_3/libsublime-imfix.so
exec /opt/sublime_text_3/sublime_text "$@"

并且赋予执行权限,同时修改sublime的desktop文件中的执行程序路径,修改为 /usr/bin/sublime ,

效果

修改之后需要重新登陆系统才能完全生效,切换之后能够输入中文,但是选词框总是在左下角,即使拖动到想要出现的地方,下次输入依然是左下角,不能跟随,这就是这个方法还不太完美的地方。

如果谁有更好的方法,希望不吝赐教。

© 著作权归作者所有

共有 人打赏支持
阿信sxq

阿信sxq

粉丝 226
博文 82
码字总数 72407
作品 1
成都
后端工程师
私信 提问
Ubuntu 系统 sublime3 中文输入

转载自 http://doc.polarwin.cn/tutorial/Ubuntusublime3chineseinput.html -------------本文完全复制的上面的文章-------------------- Ubuntu安装sublime3并解决中文输入问题 1 安装 首先...

求学ing
2015/11/05
0
0
在Ubuntu 14.04中使SublimeText 3支持中文输入法

在Ubuntu 14.04中安装了SublimeText 3之后发现既然不支持输入中文,于是在网上搜罗一下,发现很多人遇到了同样的问题,但是解决办法大该就只有一个。下面根据自身的安装及解决办法总结如下:...

赵小宾
2015/05/19
0
0
配置Elementary OS作为工作环境

买了新电脑之后,就换上Elementary OS作为自己的Linux版本。不得不说,Elementary OS确实是我见过的最漂亮的Linux发行版,而且它的panel+dock的设计也很适合用来工作。折腾一番之后终于配置好...

halfcoder
2013/10/12
0
0
Ubuntu下Sublime Text 3解决无法输入中文的方法

环境: Ubuntu14.04 搜狗输入法 for Linux Sublime text 3 提示:编译请在非root下进行 本经验目前在Ubuntu14.04环境下,已有搜狗输入法 for Linux和Sublime Text 3的情况下安装成功。 保存下...

zhangsirsdo
2014/11/04
0
0
ubuntu下的sublime不能输入汉字(转)

先安装能在sublime text 2显示中文的字体,有一个非常好的开源字体,叫做“文泉驿字体”,安装如下: sudo apt-get install xfonts-wqy 官方网站:http://wenq.org/index.cgi?%E9%A6%96%E9%...

JenGuo
2013/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在ubuntu下选择crontab计划任务的编辑器

在ubuntu下,首次编辑crontab计划任务的时候,会提示让选择编辑器。由于对nano编辑器不是很熟悉,若是选择nova编辑的话,会有些麻烦。 可以重置编辑器,方法如下: [root@wang ~]# select-...

季书歌
34分钟前
4
0
在线BASE64加密解密、UrlEncode编码/解码、native/ascii在线转换工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
35分钟前
1
0
laravel命令

https://blog.csdn.net/aaroun/article/details/79140618

vio小黑
36分钟前
3
0
记录一个vue directive实现点击指令外部区域调用函数的方案

根据directive提供的API来写一个点击外部区域可以让其下拉列表消失的菜单 <div id="app" v-clock> <div class="main" v-clickoutside="handleClose"> <button @click="show = !show">点......

呵呵闯
39分钟前
3
0
Oracle一列的多行数据拼成一行显示字符

Oracle一列的多行数据拼成一行显示字符 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数。 先介绍:WMSYS.WM_CONCAT 例: id name 1 aa 2 bb 3 cc 要的结果是"aa,bb,cc" select WMSYS...

voole
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部