这篇文章集中写一些在使用 Sublime Text 3 时遇到的问题以及解决办法,某些问题在不同系统的解决办法可能都是一样的,但是未经测试,所以使用的时候请先验证。

打开中文文件乱码 [Windows, Linux]

如果中文文件是使用的 GBK 等中文独有的编码方式,而不是通用的 UTF-8 编码,使用 Sublime Text 打开以后会发现文件显示乱码,因为 Sublime Text 目前为止并不原生支持 GBK 等中文编码。 好在有一款 Sublime Text 的插件,可以帮助解决这个问题。 这款插件名字叫 “ConvertToUTF8”,安装好以后打开中文编码文件就可以自动转换为 UTF-8 编码,值得注意的是关闭文件以后,这个库默认把 UTF-8 编码再转为该文件初始编码,如果不想要这种行为,可以通过设定 "convert_on_save" : false 来关闭这项功能。 如果不想下载这个插件,用系统自带的记事本打开文件,然后另存为 UTF-8 编码也可以。

新建一个 build system,编译运行 C++ 文件[Linux, Windows]

Sublime Text 3 自带 CPP 的 build system: “C++ Single File”,但是这个 build system 只能编译,不能直接运行编译好的程序,所以运行简单的 CPP 文件有点麻烦,编译好以后,还需要自己去 shell 里面运行。 我们可以新建一个简单的 build system,实现自己的需求,依次点击 “Tools–>Build System–>New Build System”,使用下面的配置

{
"cmd" : ["g++ -std=c++11 -Wall ${file_name} -o ${file_base_name} && ./${file_base_name}"], 
"selector" : "source.c",
"shell": true,
"working_dir" : "$file_path"
}

如何使程序直接在系统的 terminal 或者 console 运行

Sublime Text 运行需要从 standard input (一般来说就是 console) 输入数据的程序时,该程序无法正常接收输入,如何解决这个问题呢? 我们可以给编译 C++ 增加一个可选的方式,Sublime Text 里面称为 “variants”,然后指定在 GUI terminal 里面运行编译好的文件。 Linux 系统与 Windows 系统设置稍有不同。

Linux 配置

完整的配置文件如下

{
    "shell_cmd": "g++ -std=c++11 -Wall \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c++, source.cpp, source.cc, source.cxx",

    "variants":
    [
        {
            "name": "Run in Terminal",
            "shell_cmd": "g++ -std=c++11 -Wall \"${file}\" -o \"${file_path}/${file_base_name}\" && xterm -e '${file_path}/${file_base_name} && echo && echo Press ENTER to continue && read line && exit'",
           // "shell_cmd": "gnome-terminal -e 'bash -c \"${file_path}/${file_base_name}&& echo && echo Press ENTER to continue && read line && exit\"'", // for gnome-terminal 
           // "shell_cmd": "xterm -e '${file_path}/${file_base_name}; bash'", // for xterm
           // "shell_cmd": "xterm -hold -e ${file_path}/${file_base_name}", // for xterm
           // "shell_cmd": "konsole --hold -e ${file_path}/./${file_base_name}", // for konsole
            "shell": true,
        },
    ]
}

上述配置文件提供了针对 genome-terminal, xterm, Konsole 的配置,可以按照自己正在使用的 GUI terminal 选择对应的配置。 上述配置还可以保证程序在运行结束以后,terminal 的窗口不会立即关闭。 当运行需要从 console 输入数据的程序时,直接使用 CTRL + SHIFT + B 快捷键,然后选择 “Run in Terminal” 选项即可。

Windows 配置

以上的配置针对的 Linux 系统,如果你使用的是 Windows 系统,情况会稍有不同,下面的配置是适用于 Windows 的配置,

{
    "shell_cmd": "g++ -Wall -std=c++11 \"${file}\" -o \"${file_path}/${file_base_name}.exe\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c++",

    "variants":
    [
        {
            "name": "Run",
            "shell_cmd":"\"${file_path}/${file_base_name}\""
        },
        {
            "name": "Run in CMD",
            "shell_cmd":   "start cmd /k  $file_base_name "
            // "shell_cmd":   "start \"$file_base_name\" call $file_base_name"
        }
    ]
}

使用 CTRL + B 来编译源代码,然后使用 CTRL + SHIFT + B 来选择在 Sublime Text 的 console 运行还是直接在 Windows CMD 窗口运行,上述的配置也可以保证程序运行以后,terminal 的窗口不会自动关闭,方便用户查看输出结果。

输入法图标不跟随输入光标

在 Sublime Text 中使用中文时,发现输入法的候选字的框不跟随输入光标,这个 bug 官方没有解决,有一个插件 IMESupport 可以解决这个问题。

更改 package 的 user setting,保存的时候一直提示 “Unexpect trailing characters”[Windows, Linux]

安装了一个 package 以后,需要进行个性化设置,然后保存设置的时候一直提示错误,错误信息如下

Error trying to parse settings: unexpected trailing characters

这个原因是输入的 setting 不是有效的 JSON 格式,我的问题是忘记在 setting 外加大括号了。例如下面的 setting 就是有问题的

    // Convert when previewing file: true or false
    "preview_action" : false,

正确的写法应该是

{
 // Convert when previewing file: true or false
    "preview_action" : false,
}

新建一个 snippet [Windows, Linux]

所谓 snippet,简单来说就是一个代码片段,你为这个 snippet 设立一个关键词,当你输入关键词以后,就会激活这个 snippet,省去了重复输入的麻烦。 在编写 C++ 程序的时候每次都需要输入头文件,using declaration,比较麻烦,可以创立一个 snippet,建立好 CPP 文件以后输入关键词,自动填充预定义的模板。 建立方法如下,依次打开 Tools -> Developer -> New Snippet..., 在生成的文件里填写如下内容,

<snippet>
    <content><![CDATA[
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using std::cout;
using std::vector;
using std::string;

int main(){
    return 0;
}

]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>cpp</tabTrigger>
    <!-- Optional: Set a scope to limit where the snippet will trigger -->
    <!-- <scope>source.python</scope> -->
</snippet>

然后给创建的 snippet 起一个名字,如 “C++_default_template.sublime-snippet”, 然后在文件中输入 cpp,再点击Tab,就会直接输入对应的 snippet。

如何编辑 Sublime Text 自带的 build system [Windows, Linux]

在 Sublime Text 中,package 都是以 .sublime-package 的压缩文件形式存在,以 C++ build system 为例,如果要编辑 Sublime Text 自带的 C++ build system,首先要安装 PackageResourceViewer,然后使用 Ctrl+Shift+P,打开 Package Control 的窗口,输入 prv, 选择 Open Resource,然后输入 C++,向下移动光标,选择 C++ Single File.sublime-build,打开这个文件,按照自己意愿编辑,编辑以后保存就可以了。

使用 Package Control 安装插件的时候提示 “There are no packages available for installation”[Windows, Linux]

问题如题所示,重装 Package Control 解决了这个问题。 首先,卸载 Package Control,然后,重新安装 Package Control

使用 Ctrl + backtick 无法打开 console[Windows, Linux]

Sublime Text 默认打开 console 的快捷键 (shortcut) 是 Ctrl+`,但是在我的系统上,按这个组合键,没有任何反应,根据 Stackoverflow 上的回答, 点击打开 console,然后输入 sublime.log_input(True), 监听按键,发现按下 Ctrl+` 时,Sublime 并未记录到按键。于是根据别人的答案,自己设置了另外一个快捷键组合 Ctrl+ 来打开 console, 在自己的 user key binding 设置里面加上一项:

    { "keys": ["ctrl+'"], "command": "show_panel", "args": {"panel": "console", "toggle": true} },

参考