片段

片段（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