跳至内容

代码片段

无论您是编写代码还是撰写下一部吸血鬼畅销书,您都可能需要反复使用某些简短的文本片段。使用代码片段可以节省您繁琐的打字工作。代码片段是智能模板,可以为您插入文本并根据其上下文进行调整。

要创建新的代码片段,请选择 **工具 | 开发者 | 新代码片段...** Sublime Text 将为您提供一个代码片段的骨架。

代码片段可以存储在任何包的文件夹下,但为了在学习过程中保持简单,您可以将它们保存到您的 Packages/User 文件夹中。

代码片段文件格式

代码片段通常位于 Sublime Text 包中。它们是扩展名为 .sublime-snippet 的简化 XML 文件。例如,您可以在 Email 包中有一个 greeting.sublime-snippet 文件。

典型代码片段的结构如下(包括 Sublime Text 为方便起见插入的默认提示)

xml
<snippet>
    <content><![CDATA[Type your snippet here]]></content>
    <!-- Optional: Tab trigger to activate the snippet -->
    <tabTrigger>xyzzy</tabTrigger>
    <!-- Optional: Scope the tab trigger will be active in -->
    <scope>source.python</scope>
    <!-- Optional: Description to show in the menu -->
    <description>My Fancy Snippet</description>
</snippet>

snippet 元素包含 Sublime Text 需要的所有信息,以便知道 要插入什么是否 要插入以及 何时 插入。让我们依次查看这些部分。

content : 实际的代码片段。代码片段可以从简单的模板到相当复杂的模板。我们将在后面查看这两个方面的示例。

编写自己的代码片段时,请牢记以下几点

  • 如果您想获得一个字面上的 $,您必须像这样对其进行转义:\$

  • 编写包含缩进的代码片段时,始终使用制表符。当插入代码片段时,如果选项 translate_tabs_to_spacestrue,则制表符将转换为空格。

  • content 必须包含在 <![CDATA[…]]> 部分中。如果您不这样做,代码片段将无法正常工作!

  • 代码片段的 content 必须不包含 ]]>,因为这串字符将过早地关闭 <![CDATA[…]]> 部分,导致 XML 错误。为了解决这个问题,您可以在字符串中插入一个未定义的变量,例如:]]$NOT_DEFINED>。此修改后的字符串将通过 XML 解析器,而不会关闭 content 元素的 <![CDATA[…]]> 部分,但 Sublime Text 将在将代码片段插入文件之前将 $NOT_DEFINED 替换为空字符串。换句话说,代码片段文件 content 中的 ]]$NOT_DEFINED> 将在您触发代码片段时被写入为 ]]>

tabTrigger : 定义必须按下的键序列以插入此代码片段。在键入此序列后,只要您按下 键,代码片段就会生效。

scope : 范围选择器,用于确定代码片段将处于活动状态的上下文。有关更多信息,请参阅 范围

description : 用于在代码片段菜单中显示代码片段。如果不存在,Sublime Text 将默认使用代码片段的文件名。

有了这些信息,您可以开始编写自己的代码片段,如下一节所述。

注意

为了简洁起见,除非另有说明,否则我们只在示例中包含content元素的文本。

代码片段功能

环境变量

代码片段可以访问环境变量形式的上下文信息。下面列出的变量的值由 Sublime Text 自动设置。

变量描述
$PARAM1 .. $PARAMn传递给insert_snippet命令的参数。(此处不介绍。)
$SELECTION触发代码片段时选中的文本。
$TM_CURRENT_LINE触发代码片段时光标所在行的内容。
$TM_CURRENT_WORD触发代码片段时光标下的单词。
$TM_DIRECTORY正在编辑的文件的目录名称。(从 3154 版本开始)
$TM_FILENAME正在编辑的文件的名称,包括扩展名。
$TM_FILEPATH正在编辑的文件的路径。
$TM_FULLNAME用户的用户名。
$TM_LINE_INDEX插入代码片段的列,从 0 开始。
$TM_LINE_NUMBER插入代码片段的行,从 1 开始。
$TM_SELECTED_TEXT$SELECTION 的别名。
$TM_SCOPE每个选定区域开头的范围。(从 3154 版本开始)
$TM_SOFT_TABS如果translate_tabs_to_spaces为真,则为YES,否则为NO
$TM_TAB_SIZE每个制表符的空格数(由tab_size选项控制)。

让我们看一个使用变量的简单代码片段示例

perl
=================================
USER NAME:          $TM_FULLNAME
FILE NAME:          $TM_FILENAME
 TAB SIZE:          $TM_TAB_SIZE
SOFT TABS:          $TM_SOFT_TABS
=================================

# Output:
=============================
USER NAME:          guillermo
FILE NAME:          test.txt
 TAB SIZE:          4
SOFT TABS:          YES
=============================

字段

借助字段标记,您可以通过按键在代码片段中的位置之间循环。字段用于在插入代码片段后引导您完成代码片段的自定义过程。

perl
First Name: $1
Second Name: $2
Address: $3

在上面的示例中,如果您按一次,光标将跳到$1。如果您再次按,它将前进到$2,等等。您也可以使用 在系列中向后移动。如果您按

超过最高制表位,Sublime Text 将把光标放在

代码片段内容的末尾,以便您可以恢复正常的编辑。

如果您想控制退出点的位置,请使用$0标记。默认情况下,这是代码片段的末尾。

您可以随时按Esc退出字段循环。

镜像字段

相同的字段标记会相互镜像:当您编辑第一个标记时,其余标记会实时填充相同的值。

perl
First Name: $1
Second Name: $2
Address: $3
User name: $1

在这个例子中,“用户名”将填充与“名字”相同的值。

占位符

通过稍微扩展字段语法,您可以为字段定义默认值。占位符在您的代码片段存在一般情况但您仍想保持可自定义性时很有用。

perl
First Name: ${1:Guillermo}
Second Name: ${2:López}
Address: ${3:Main Street 1234}
User name: $1

变量可以用作占位符

perl
First Name: ${1:Guillermo}
Second Name: ${2:López}
Address: ${3:Main Street 1234}
User name: ${4:$TM_FULLNAME}

您也可以将占位符嵌套在其他占位符中

perl
Test: ${1:Nested ${2:Placeholder}}

替换

除了占位符语法之外,制表位还可以使用替换指定更复杂的操作。使用替换根据镜像制表位动态生成文本。当然,您要用作变量的制表位必须在代码片段中的其他地方镜像。

替换语法具有以下语法

  • ${var_name/regex/format_string/}
  • ${var_name/regex/format_string/options}

var_name : 变量名称:12… 或环境变量,例如 TM_FILENAMESELECTION

regex : Perl 风格的正则表达式:请参阅 Boost 库正则表达式文档

format_string : 请参阅 Boost 库格式字符串文档

options : 可选。可以是以下任何一项

i : 不区分大小写的正则表达式。

g : 替换 regex 的所有出现。

m : 不要忽略字符串中的换行符。

使用替换,您可以轻松地对文本进行下划线处理

perl

      Original: ${1:Hey, Joe!}
Transformation: ${1/./=/g}

# Output:

      Original: Hey, Joe!
Transformation: =========

另一个更复杂的示例可以将 snail_case 转换为 Tile Case With Spaces。基本上,它将两个单独的表达式组合在一起并替换为一个。它还说明了替换可能发生在实际制表符之前。


Transformation: ${1/^(\w)|(?:_(\w))/(?1\u$1:)(?2 \u$2:)/g}
      Original: ${1:text_in_snail_case}

# Output:

Transformation: Text In Snail Case
      Original: text_in_snail_case

perl
Transformation: ${1/^(\w)|(?:_(\w))/(?1\u$1:)(?2 \u$2:)/g}
      Original: ${1:text_in_snail_case}

# Output:

Transformation: Text In Snail Case
      Original: text_in_snail_case

您也可以在替换中使用环境变量

perl
# In file MyModule.js:

Transformation: ${TM_FILENAME/(\w+)\.js/\1/g}

# Output:

Transformation: MyModule