片段

片段（Snippet）是一个编程用语，指的是源代码、机器码、文本中可重复使用的小区块。通常它们是有正式定义的执行单位，以纳入更大的编程模块。片段经常用来明晰其他“凌乱”函式的功用，或尽量减少使用与其他函式共用的重复代码。

片段管理是某些文本编辑器、程式源代码编辑器、IDE、与相关软件的其中一项功能。其使得使用者能够在反复的编辑作业中保持和使用这些片段。

## 概要

片段管理是文本编辑器一项受欢迎的功能，诸如软件开发人员，经常要求从目录重复输入文字（像是源代码或样板文件）。由于每次输入的内容变化相当轻微（或者完全相同），因此可以把可重复使用的程式码分割储存，方便除错与加速开发。

iWeb或一些部落格系统允许使用者编辑HTML片段，在文章区域外加入像是气象报告之类的Web widget小工具或AdSense网络广告等。

### 在文本编辑器

包括此功能的文本编辑器通常提供一种机制来管理目录，并以和操作系统允许管理不同档案同样的方式来区别“片段”。这些包括操作的基本管理能力，有检视、添加、编辑、删除、排序、筛选、分组、重命名、储存片段在储藏库、目录或数据库。

### 在IDE环境

一些开发人员的应用程序，如微软的Visual Studio（关键字和Tab），与其他的整合开发环境，包含内建结构部分以易于编码。

其他应用程序像是Macromedia Dreamweaver，同样利用这些代码片段在网页开发上。

### 在JIT编译器

及时编译（JIT）编译器能够将预先编译的代码部分“拼接在一起”，成为一段较长的目的码/机器码分段。这能显著地减少演绎时间，同时促进执行效率。

## 常见方法

除了前述的基本管理能力外，片段管理功能可以按片段之间的互动和片段和文本编辑器的互动范围，或主宰的应用程序做区分。

这些片段功能群组包括：

- 纯文字或"静态"片段
- 互动或"动态"片段
- 脚本片段

静态（Static）片段主要包括固定文本，使用者可以选择插入到当前文件内。也许除了相对于新插入文字的游标位置之外，使用者不能做其他任何指定。静态片段类似于简单的宏。

动态（Dynamic）片段包括与动态因素结合的固定文本。使用者可以同时指定动态因素的内容，以及它们相对于固定文本的位置，选择部分插入到当前文件内。动态因素可能随着当前日期、系统时间、或使用者透过GUI输入的文字、来自其他应用程序的内容等。（参见：宏编程）。

脚本（Scriptable）片段包括可运行在宏语言或脚本语言的部分源代码。脚本片段提供使用者最大程度的灵活性，然而这会取决于文本编辑器对程式语言的支援程度，对该编辑器而言程式语言是否有名、或者特殊与罕见。

脚本支援的类型不同，但可能包括的功能，像是运行shell命令、提供GUI对话框、或其他使用者与操作系统的互动方法；其他应用程序；或其他主控应用程序本身的子元件。

## 片段编程功能

支援脚本片段的应用程序，所支援的程度编程功能各不相同。下面列举一些常用的可程式化片段功能。

### 纯文字

虽然纯文字是应用程序的一项基本功能，只支援非可程式化的“静态”片段，不过可程式化片段也用来和纯文字一起运作。

然而常见的复杂问题，支援可程式化片段的环境经常要辨别哪些是“纯文字”、哪些算作“程式指令”。更复杂化这种辨识的是，事实上支援可程式化片段的应用程序几乎总是包括支援认识多种程式语言，以及强调显示基本语法标亮或执行嵌入式命令。

基于诸如此类理由，可程式化片段所夹带的纯文字总需要特别小心，以避免语法和定界符冲突。

### 常数与变数

可程式化片段往往有能力将现有的变数范围或命名空间做结合，使用者可以从中任意选择各种常数或变数。这可能包括一些值，像是当前登入使用者的电子邮件地址、当前系统时间和日期、或函式的输出值。

脚本片段往往与一或多个当前可用文件关联。因此，变数可能还包括环境变数和指定档名的参数、游标位置、母目录、和其他有关当前编辑文件的状态资料。

### 演绎码

脚本片段可能允许执行一或多个程式语言的程式码。这可能包括一或多独立的语言，或在特定应用程序中为主体的语言。

### 填空占位符

脚本片段通常包括一项制度，指定的用户提供值不会确定，直到片段项目的文本在编辑中被插入或启用。有些应用程序定义的特殊标记语法，允许编辑器确定相对于当前编辑缓冲区其他文本的占位符边界。

其他采用图形使用者界面和模式对话框的应用程序，允许使用者输入一或多个提供给占位符的值。

#### 占位符识别符

占位符通常用一些特殊字元或序列表示，以区别它们是来自其他片段文本。有些系统允许片段占位符被命名为识别符。该识别符可能有助于支援占位符复制或占位符转换之类的功能。

以下示例使用识别符`first_name`、`last_name`和`item`：

```
Hello {%first_name%} {%last_name%},

Your shipment of {%item%} is now ready to pick up.

Thanks {%first_name%}!
```

#### 占位符复制

这功能允许使用者标示出提供给一个占位符的值，该占位符相对于可程式化片段的整个文本，应该复制到多个地方。在前述范例中，命名的占位符`first_name`就是这种用法的一个例子。

#### 占位符转换

这功能允许使用者标示一或多个值提供给一个占位符，该占位符应该在可程式化片段文本内其他地方被复制与转换。例如，使用者可能会在一个片段部分，提供一个文件标题，并指定文件标题应在其他地方重复，第一个实例作全字母大写，其他实例变小写。

## 应用程序支援

以下是部分文本编辑器与IDE对片段的支援简要。更多详细信息参见文件编辑器比较。

纯文字｜动态｜脚本

Textmate｜是｜是｜是

Textpad｜是｜否｜否

Emacs｜是｜是｜是

## 外部链接

- Snipt.net Social snippet repository that supports over 127 languages. Snipt.net is the original Snipt, and was launched in early December 2008.
- * Editable snipped search engine.
- Snipt.org The first social media service for sharing code snippets via Twitter, supports 126+ languages.
- Siafoo Social snippet sharing site. Supports 110+ languages.
- Snipplr Social snippet repository that supports over 60 languages.
- https://web.archive.org/web/20090227065727/http://snippets.dzone.com/ A public source code repository.
- https://web.archive.org/web/20090830054802/http://www.daniweb.com/code/java.html
- https://web.archive.org/web/20090531155130/http://www.codesnippt.com/
- https://web.archive.org/web/20090919121217/http://c.snippets.org/ The original C code snippets archive, maintained in memoriam: Auke Reitsma 1947-2003
- The HTML SWAG Home Page Source code collection for Pascal
- PHPSnips PHP-only source code repository.
- PHPSnaps PHP-only source code repository.
- The Pastebin, Evolved , article at Dr. Dobb's blog about publicly sharing code snippets
- TYPO3 snippet collection
- gist.github
- Django Snippets

Snippet application server :

- Cab is a simple Django-based application designed to make it easy for a team, or a community, to share code snippets