片段

**片段**（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 對片段的支援簡要。更多詳細資訊參見檔案編輯器比較。

## 參見

* 自動完成
* Codebase
* 整合開發環境（IDE）
* 巨集
* 預處理器（Preprocessor）
* 版本控制
* Web widget 網路小工具
* JIT 即時編譯

## 註腳與參考資料

## 外部連結

* Snipt.net （頁面存檔備份，存於網際網路檔案館） Social snippet repository that supports over 127 languages. Snipt.net is the original Snipt, and was launched in early December 2008.
* \* [1] （頁面存檔備份，存於網際網路檔案館） 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