文档章节

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

阿信sxq
 阿信sxq
发布于 2017/05/27 16:49
字数 864
阅读 107
收藏 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

粉丝 227
博文 83
码字总数 73652
作品 1
成都
后端工程师
私信 提问
配置Elementary OS作为工作环境

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

halfcoder
2013/10/12
0
0
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
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
完美解决 Linux 下 Sublime Text 中文输入

参考Sublime Text官方论坛一位中国哥们的 回复,通过以下方法完美解决Sublime Text 2中文输入的问题。这几天讨论区老是有人提问,就写个教程吧。 系统:Linux Mint 14 Nadia 输入法:Fcitx 4...

tsl0922
2013/03/13
0
43

没有更多内容

加载失败,请刷新页面

加载更多

rabbitMQ 在spring 的使用

一、准备工作 maven依赖 <dependency>  <groupId>com.rabbitmq</groupId>  <artifactId>amqp-client</artifactId>  <version>4.0.2</version></dependency> <dependency......

狼王黄师傅
昨天
1
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
1
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
3
0
跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解

Hystrix提供了监控Hystrix Command的能力,本节来详细探讨。 监控端点与数据 应用整合Hystrix,同时应用包含spring-boot-starter-actuator 依赖,就会存在一个/actuator/hystrix.stream 端点...

周立_ITMuch
昨天
6
0
day26:shell题

1、 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。 如果其生产商为AuthenticAMD,就显示其为AMD公司; 如果其生产商为GenuineIntel,就显示其为Intel公司; 否则,...

芬野de博客
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部