Sublime Text:一款编辑器,称霸天下?

作者: Ken Kinder

Sublime Text 是一款专有的、跨平台的文本编辑器,专为花费大量时间处理代码的人员设计。作为一款程序员编辑器,Sublime Text 是长期存在的“Vi 或 Emacs”难题的第三种选择。除了基本的语法高亮和代码折叠之外,Sublime 还提供了一系列创新和独特的功能。随着 3.0 版本即将到来,我将带您了解 Sublime 最令人信服的功能和附加软件包。

在撰写本文时,Sublime Text 2 版本的售价为 70 美元,升级到 3.0 版本(目前处于 beta 测试阶段)将是付费的。Version 2 可作为试用版下载,允许您在决定购买之前,根据您的需要使用时长来感受编辑器。由于该应用程序适用于 Linux、Windows 和 Mac OS X,因此您无需为每个平台购买单独的许可证。70 美元对于文本编辑器来说似乎很多,但如果您每月花费数百小时面对编辑器,那么这是一项值得的投资。

本文中的大部分内容应适用于 Sublime Text 2 或 3。Sublime Text 3 不可用于预先购买评估,因此如果您是 Sublime Text 的新手,那么您目前只能使用 version 2。您可以从 https://text.sublime.net.cn 下载 Sublime Text。

Sublime Text 使用入门

启动 Sublime Text,首先映入眼帘的是一个炭黑色编辑器窗口。左侧是传统的项目侧边栏,右侧是 Sublime 所谓的 Minimap。Minimap 是当前打开文件的缩小视图,其工作方式有点像 WYSIWYG 滚动条。打开一些源代码,Minimap 提供了一种以可视化方式导航大型文件的有用方法。

图 1. Sublime Text 编辑器窗口

如果您有一个包含要处理的项目的目录,请选择 “文件”→“打开文件夹” 以选择项目文件夹,然后使用 “项目”→“另存为项目” 保存项目。与 Sublime Text 的精神一致,您只需直接打开 .sublime-project 文件并编辑其内容即可调整项目属性。

在 Sublime Text 中打开的文件显示在类似于 Chrome 的选项卡中。您可以像在 Chrome 或 Firefox 中一样,在打开的 Sublime Text 窗口之间重新排序和拖动它们。如果您有多个显示器,此功能尤其好用,因为它使您可以快速组织一个广阔的工作空间。如果您想集中精力(例如,撰写一篇 Linux Journal 文章),请使用 “视图”→“进入免打扰模式” (Shift-F11) 以全屏模式查看文件,所有导航小部件都将被隐藏。

Sublime Text 的吸引力之一是速度,包括应用程序性能和 UI 设计。各种高度可定制的键盘快捷键使使用鼠标成为可选。我最常用的热键称为 “跳转到任何内容”,可从 “跳转”→“跳转到任何内容” 菜单项 (Ctrl-p) 中使用。前提是您已安装相关的语言支持(稍后会详细介绍),“跳转到任何内容” 使您可以在键入时快速访问文件、类、函数,甚至普通变量。例如,我将通过按 Ctrl-p 打开我项目的 icongrabber.py 文件,并且当我键入所需的文件名时,Sublime Text 会缩小可能的补全范围。使用 “跳转到任何内容” 时,您可以在查询前加上 @ 以查找符号,加上 # 以在文件中搜索,或加上 : 以跳转到行号。遗憾的是,Sublime Text 不会在未打开的文件中搜索符号。

图 2. 当您键入文件名时,Sublime Text 会缩小可能的补全范围。

在有用的键盘快捷键中,紧随其后的是命令面板。与 Emacs 中的 Escape/Command 提示符类似,Sublime 的命令面板使您可以快速执行 Sublime Text 内部的命令或由您安装的附加软件包提供的命令。例如,要切换自动换行,请使用 “工具”→“命令面板” (Shift-Ctrl-p) 并键入 “wrap”。Sublime 足够智能,可以建议 “切换自动换行” 作为补全。请注意,Sublime Text 还显示具有键盘快捷键的命令的快捷键。

要查看默认键绑定的完整列表,请单击 “首选项” 菜单并选择 “快捷键绑定 - 默认”。这将打开系统范围的快捷键绑定文件。要创建您自己的快捷键绑定首选项,请选择 “快捷键绑定 - 用户”,并使用与默认文件相同的语法。

编辑技巧

现在来谈谈使 Sublime Text 成为如此强大的编辑器的核心:其独特的文本编辑功能组合。Sublime Text 最受赞誉的编辑功能是多重选择,起初可能有点难以掌握。大多数编辑器只允许您选择一个连续的文本跨度;有些允许您以块状选择文本。Sublime Text 允许您选择多个不连续的文本跨度并对它们进行集体操作。在您开始使用此功能后,其强大之处将变得显而易见,尤其是在编辑代码或任何具有规范语法的文件时。

例如,假设我要将以下源代码从 Python 2 转换为 3。我要做的第一件事是将 “raw_input” 重命名为 “input”。


your_name = raw_input('Enter your name: ')
print 'Hello,', your_name

printer_model = raw_input("What kind of printer do you have?: ")
print your_name, 'has a', printer_model

使用 Sublime Text,这样的任务很容易。我将选择第一个出现的 “raw_input” 并按 Ctrl-d。请密切注意,您会注意到现在已选中两个出现的 raw_input,每个都有自己的闪烁光标。当我开始键入单词 “input” 时,两个出现都被替换了。诚然,这样的更改可以通过搜索和替换轻松完成,但我仅仅触及了多重选择的表面。

接下来,我想将两个 “print” 语句替换为 Python 3 的 “print” 函数,这意味着使命令看起来像 print(...)。由于文本 “print” 在本文档中出现四次,因此上一个技巧将不起作用,因此我将向您展示另一种进行多重选择的方法。我将首先将光标定位在第一个 print 语句上。然后,我将按住 Ctrl 键并单击另一个 print 语句。

图 3. 编辑器光标为蓝色,鼠标指针为红色。通过按住 Ctrl 键并单击,您可以创建多个编辑器光标。

虽然我没有选择任何文本,但我有两个闪烁的光标。我键入的任何内容都将影响这两行。我将键入 (,按 End 键,然后键入 )。两行都接收了这些键,现在我的文件符合 Python 3 规范。

在 Sublime Text 中还有其他几种选择多个文本跨度的方法,当您尝试使用它们时,您会对如何使用它们有所了解。最终,当高效使用时,Sublime 的多重选择功能一次性取代了大多数编辑器宏、查找/替换操作和重构操作。例如,想象一下您如何使用多重选择将纯文本列表转换为 HTML <ul> 列表。如果您可以想象这是如何完成的,那么您就开始理解多重选择了。如果不能,别担心:这是一项新的编辑器功能。几次 YouTube 之行和一些视频演示将帮助您理解这个概念。

查找和替换

当需要进行大规模重构时,请忘记在代码库中进行 grepping。Sublime Text 提供了强大的递归查找和替换功能。对于许多用户来说,递归查找和替换消除了对 GNU grep 和 find 命令的需求。许多编辑器都提供递归查找和替换,但我发现 Sublime Text 在这方面做得非常出色,这是其他项目很少能做到的。

单击 “查找”→“在文件中查找”,编辑器底部将出现一个大型搜索栏。使用左侧的切换按钮,您可以切换正则表达式匹配、区分大小写和全字匹配。将鼠标悬停在各个图标上可查看其功能。您还可以选择要搜索的目录,并可选择指定替换文本。

如果您期望获得许多结果或计划长期参考搜索结果,请切换搜索区域中的 “使用缓冲区” 图标。启用后,Sublime Text 将在其自己的编辑器缓冲区中打开搜索结果摘要。当使用多显示器工作站时,我发现将搜索结果放在一个显示器中,将代码放在另一个显示器中非常有用。切换 “显示上下文” 将在结果中包含每次命中的前后几行。

图 4. Sublime Text 可以在其自己的缓冲区中打开您的搜索结果。单击任何结果以跳转到其来源。

Sublime Text 使用使用 Boost C++ 库实现的 Perl 风格正则表达式。Sublime Text 还支持正则表达式替换。

代码片段

尽管程序员尽了最大努力避免重复自己,但他们经常发现自己在整个项目中键入常见的文本块。示例包括标准类文件布局、单元测试以及程序员放在每个文件顶部的许可证警告。

为了支持此工作流程,Sublime Text 具有 “代码片段” 功能。假设我为我的 Python 项目设置了一个标准单元测试布局


"""
Unit tests for <MODULE> in <PROJECT>.
"""
import unittest

class UnitTest(unittest.TestCase):
    def setUp(self):
        """
        Called before each test to set up the environment.
        """
        pass

    def tearDown(self):
        """
        Called after each test to clean up.
        """
        pass

    def test<METHOD>(self):
        pass

    if __name__ == '__main__':
        unittest.main()

我可以使用 “工具”→“新建代码片段”。Sublime Text 将为我提供一个示例代码片段文件。我将对其进行修改,使其如下所示


<snippet>
    <content><![CDATA[
"""
Unit tests for ${1:module} in ${1:project}.
"""
import unittest

class UnitTest(unittest.TestCase):
    def setUp(self):
        """
        Called before each test to set up the environment.
        """
        pass

    def tearDown(self):
        """
        Called after each test to clean up.
        """
        pass

    def test${1:method}(self):
        pass

if __name__ == '__main__':
    unittest.main()


]]></content>
    <tabTrigger>unittest</tabTrigger>
    <scope>source.python</scope>
</snippet>

请注意,我在代码片段文件中创建了 “tabTrigger” 标签和 “scope” 标签。使用我给出的设置,无论何时我在 Python 文件中键入单词 “unittest”,我都可以按 Tab 键,代码片段将插入到光标所在的位置。为了试用它,我将代码片段另存为默认目录中的 “unittest.sublime-snippet”。现在我可以使用代码片段快速创建单元测试。

丰富的软件包

可以使用 Python 编写的插件对 Sublime Text 进行脚本化。这些插件存储在软件包中,可以使用文件管理器或您喜欢的 shell 在本地安装。如果您感到有必要解决其他人尚未发现的需求,您可以使用 Python 编写软件包(稍后会详细介绍)。

我喜欢将 Sublime 视为介于 IDE 和文本编辑器之间的平衡点。它的速度和初始的简洁性使其既适合编辑 /etc 文件,也适合编辑源代码。然而,Sublime 的真正威力在于用户可以编写和安装附加软件包,以执行从通过 SSH 同步文件到重构代码的各种操作。基本语法高亮包含在主要语言中,但是要将 Python 用作编程工具,我发现最好安装一些方便的软件包。

首先,您很可能需要安装名为 Package Control 的东西,它有点像 Sublime Text 的 apt-get。Package Control 本身就是一个软件包,用于管理其他软件包的下载、安装、更新和删除。从 http://wbond.net/sublime_packages/package_control 下载 Package Control。要安装软件包,只需使用 “工具”→“命令面板” (Shift-Ctrl-P),然后键入 “Package Control”。与其他操作一起,“Install Package” 将作为补全提供。

查找编码错误

IDE 优于文本编辑器的最引人注目的功能之一是实时错误检测。例如,如果您在 Eclipse 中键入 Java 语法错误,编辑器会意识到您的错误并实时警告您。

SublimeLinter 在 Sublime Text 中为各种语言提供了类似的功能。使用上面描述的 Package Control “Install Package” 命令安装 SublimeLinter,或从 https://github.com/SublimeLinter/SublimeLinter 下载它。

SublimeLinter 包装了本机语言工具,例如 C 的 cppcheck 和 XML 的 xmllint,因此您需要为您使用的语言安装相关的工具。让我们尝试一个 XML 错误。

图 5. 请注意,Sublime Text 高亮显示了有错误的行,并在状态栏中描述了错误本身。

您能发现图 5 中的错误吗?请注意,在编辑器的装订线中,有一个警告图标。您将在状态栏中看到,SublimeLint 正在解释问题:我忘记关闭 <head> 标记。修复问题后,按 Ctrl-Shift-L 将强制 SublimeLint 立即重新扫描文件,错误将消失。

对于 Python 程序员

如果您是 Python 程序员,那么您为 Python 开发下载的第一个软件包无疑将是 SublimeRope。SublimeRope 将 Python 的 Rope 源代码分析和重构库与 Sublime Text 相结合,提供上下文相关的补全、重构、使用 Sublime Text 的 “跳转到任何内容” 功能跳转到符号等功能。

使用 Package Control “Install Package” 命令安装 SublimeRope。要测试 Sublime Rope 的一个功能,请尝试以下代码


#!/usr/bin/env python2.7


def hello(name):
    print 'Hello, %s' % name

hello(raw_input('Enter your name: '))

将光标移动到 hello 函数的定义上。要使用 SublimeRope 命令将 “hello” 重命名为 “greet”,请使用命令面板 (Shift-Ctrl-P) 并键入 “rename”。您应该会注意到 “Rope Refactoring: Rename” 命令。选择 Rename 命令后,输入 “greeting” 作为函数的新名称,并注意该名称已在两个位置都被替换。

要探索 SublimeRope 的其他功能,包括组织导入和显示 Python 方法的文档,只需使用命令面板并键入 “rope” 即可查看 SublimeRope 提供的一些命令。一般来说,这是探索您添加到 Sublime Text 的软件包提供的命令的快速方法。

将代码同步到服务器

作为一名 Web 开发人员,我发现自己需要在服务器上测试和开发代码。虽然一种方法是在本地进行更改,然后在每次编辑后将它们 rsync 到服务器,但对于大型代码库来说,这是一种非常缓慢的解决方案。另一种选择是使用 sshfs 在本地挂载远程文件系统,但这也有其自身的问题,尤其是在典型宽带连接的延迟方面。

输入 Sublime SFTP。虽然 Sublime SFTP 是一个 16 美元的 “共享软件” 软件包,但就像 Sublime Text 本身一样,对于任何以 Sublime Text 为生的人来说,SFTP 支持都是一项合理的支出。在撰写本文时,Sublime SFTP 仅适用于 Sublime Text 2。使用与其他软件包相同的方法安装 Sublime FTP。使用 Package Control 的 “Install Package” 命令,并在列表中找到名为 “SFTP” 的软件包。

图 6. Sublime SFTP 使用您的 ~/.ssh 配置进行身份验证。

要开始使用,请选择 “文件”→“SFTP/FTP”→“设置服务器”。Sublime Text 将打开一个文件,让您指定主机名、用户名等。Sublime SFTP 将使用您的默认 SSH 密钥,因此如果您已经配置了登录到远程主机,这将很容易。远程服务器的设置存储为 ~/.config/sublime-text-2/Packages/User/sftp_servers 中的文件。此目录中的每个文件代表一个远程服务器,并且可以直接操作文件以更新设置。

配置服务器后,您可以通过转到 “文件”→“SFTP/FTP”→“浏览服务器” 远程打开文件,或者通过右键单击项目中的目录并选择 “SFTP/FTP”→“映射到远程” 来映射要远程同步的本地目录。

作为一名开发人员,根据我的经验,Sublime SFTP 是一个非常可靠且制作精良的软件包,非常值得其异常高的价格。

后续步骤

当然,在本文中,我只是略微介绍了 Sublime Text 的功能。我忽略或遗漏了许多出色的功能,随着您使用 Sublime Text,您会发现更多。如果我已经激起了您学习更多知识的兴趣,请尝试阅读 Sublime Text 非官方文档,网址为 http://docs.sublimetext.info/en/latest。论坛在 https://text.sublime.net.cn 上也很活跃,许多程序员(尤其是在 Python 社区中)都在积极使用该编辑器,使其社区充满活力。祝您使用愉快,编码快乐。

加载 Disqus 评论