スニペット(英語: snippet)とは、「断片」という意味で、再利用可能なソースコード、マシンコード、またはテキストの小さな領域を表すプログラミング用語である。 通常、これらはより大きなプログラミングモジュールに組み込むために正式に定義された操作ユニットである。スニペット管理は、一部のテキストエディタ、ソースコードエディタ、統合開発環境、および関連ソフトウェアの機能である。 これにより、ユーザーは日常の編集操作中に繰り返し入力する必要がなくなる。

## 概要

スニペット管理は、繰り返し入力されるテキストのカタログ(ソースコードやボイラープレート 等)のコンテンツを日常的に必要とするソフトウェア開発者やその他の人に人気のテキストエディタ機能である。 コンテンツが入力されるたびにコンテンツが僅かに(または全く)変化しないため、多くの場合、この機能は正当化される。

### テキストエディタのスニペット

この機能を含むテキストエディタは通常、カタログを管理するメカニズムを提供し、テキストエディタとオペレーティングシステムが個別のファイルを管理できるのと同じ方法で「スニペット」を分離する。 これらの基本的な管理機能には、リポジトリ、カタログ、またはデータベースへのスニペットの表示、追加、編集、削除、並べ替え、フィルタリング、グループ化、名前変更、および保存などの操作が含まれる。一部のテキストエディタは、スニペットにマクロ機能を提供し、標準テンプレートに基づいて関数プロトタイプと変数制御構造を生成できるようにする。

### 統合開発環境のスニペット

Eclipse、NetBeans、Microsoft Visual Studioその他の統合開発環境など、一部のプログラマのアプリケーションにはコーディングを容易にするため、構造の組み込み部分が含まれている。

Adobe Dreamweaverなど他のアプリケーションは、これらのコードスニペットをWeb開発にも使用する。

#### JITコンパイラのスニペット

実行時コンパイラすなわちジャスト・イン・タイム(JIT)コンパイラは、プリコンパイルされたコードのセクションをより長いオブジェクトコード/機械語セグメントとして「つなぎ合わせる」ことができる。これにより、解釈時間が大幅に短縮され、同時に実行が高速化される。

## 定義

プログラミングの実践において、「スニペット」とは文字通りエディタープログラムによってファイルに含まれるソースコードの一部を指し、コピー・アンド・ペーストプログラミングの形式である。この具体的な包含は、言語内で抽象化される関数やマクロなどの抽象化メソッドとは対照的である。したがって、スニペットは主に、これらの抽象化が利用できない、または望まれない場合、たとえば抽象化が不足している言語で、または明確さとオーバーヘッドがないために使用される。

スニペットは、エディタに静的前処理を含めるのと似ており、コンパイラによるサポートを必要としない。反対に、これはスニペットが事後に変更できないことは決してないため、コピー・アンド・ペーストプログラミングのすべての問題に対して脆弱であることを意味する。このため、スニペットは主にコードの単純なセクション(ほとんどロジックなし)、または著作権情報、関数プロトタイプ、共通制御構造、標準ライブラリのインポートなどの定型文に使用される。

## 例

2つの変数xとyの値を交換するプロセスを考える。弱い型付けで名前の衝突を気にしないと仮定すると次のコードで示される:

スニペットが挿入されると、プログラマは2つのパラメータの値の入力を求められる。それらがタイプfoo とbar であり、それらが交換したい変数の実際の名前であると仮定すると次のコードを生成する:

後でスニペットが変更された場合、例えばtemp ではなく\_\_temp を使用すると、すでに挿入されているコードは変更されないが、スニペットの後続の挿入で使用される。このスニペットは次のように示される:

## 規約

前述の基本的な管理機能に加えて、スニペット管理機能はスニペットとそれをホストするテキストエディタまたはアプリケーションの間の対話性の範囲に応じて分類できる。

これらのスニペット機能グループは次の通り:

- プレーンテキストまたは「静的」スニペット
- インタラクティブまたは「動的」スニペット
- スクリプト可能なスニペット

静的スニペットは主に、ユーザが現在のドキュメントに挿入することを選択できる固定テキストで構成される。ユーザは、新しく挿入されたテキストに対するカーソルの位置を除いて、何も指定できない。静的スニペットは単純なマクロに似ている。

動的スニペットは、動的要素と組み合わせた固定テキストで構成される。ユーザは、現在のドキュメントに何を挿入するかを選択する一環として、動的要素のコンテンツと、固定テキストに対する相対位置の両方を指定できる。動的要素の例には、現在の日付やシステム時刻などの変数、GUIを介して提供されるユーザからの入力、別のアプリケーションからの入力等がある。(参照: プログラム可能なマクロ)。

スクリプト可能なスニペットは、マクロ言語またはスクリプト言語で実行可能なコードのセグメントで構成されている。スクリプト可能なスニペットは、ユーザに最大の柔軟性を提供される。テキストエディタでサポートされているプログラミング言語がよく知られているか、特定のエディタに固有であるかによって多少異なる。

スクリプトサポートの種類は様々だが、シェルコマンドの実行、GUIダイアログの提供、オペレーティングシステムとのユーザの対話の他の方法(他のアプリケーション又はホスティングアプリケーション自体の他のサブコンポーネント等)の機能が含まれる場合がある。

## スニペットプレースホルダー

プレースホルダーはスニペット内の要素であり、ユーザまたはその他の外部プロセスによって提供される。プレースホルダーの値は、編集セッション中にスニペットのテキストが挿入されるまで決定されない。

プレースホルダーには、エディタが現在の編集バッファ内の他のテキストに対するプレースホルダーの境界を識別できるようにマークアップ構文がある場合がある。

他のアプリケーションは、ユーザがプレースホルダーに提供される1つ以上の値を入力できるようにするグラフィカルユーザインタフェースとモーダルダイアログボックスを採用している。

### プレースホルダー識別子

プレースホルダーは通常、他のスニペットテキストと区別するために、いくつかの特殊文字または文字のシーケンスで示される。一部のシステムでは、スニペットプレースホルダーに識別子の名前を付けることができる。識別子は、複製のプレースホルダーやプレースホルダーの変換等の機能をサポートするのに役立つ。

次の例では、識別子first\_name、last\_name、およびitem を使用している。

<syntaxhighlight lang="jinja">

Hello {%first\_name%} {%last\_name%},

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

Thanks {%first\_name%}!

</syntaxhighlight>

### プレースホルダーの複製

これによりユーザは、プログラム可能なスニペットのテキスト全体に対して、1つのプレースホルダーに指定された値を複数の場所に複製する必要があることを示すことができる。名前付きプレースホルダーfirst\_name がこの使用例である。

### プレースホルダー変換

これによりユーザは、プレースホルダーに指定された1つ以上の値を、プログラム可能なスニペットのテキスト内の他の場所で複製および変換する必要があることを示すことができる。例えばユーザーは、スニペットの一部にドキュメントタイトルを指定し、ドキュメントタイトルを他の場所で繰り返すように指定できる。最初のインスタンスはすべて大文字で、他のすべてのインスタンスは小文字である。

## スニペットプログラミング機能

スクリプト可能なスニペットをサポートするアプリケーションの場合、サポートされるプログラミング機能の範囲は異なる。以下は、プログラム可能なスニペットに一般的に実装される機能の一部を列挙する。

### プレーンテキスト

プレーンテキストは、プログラムできない「静的」スニペットのみをサポートするアプリケーションにも含まれる基本的な機能だが、プログラム可能なスニペットはプレーンテキストの操作にも使用される。

ただし、一般的な問題の1つは、プログラム可能なスニペットをサポートする環境では「プレーンテキスト」と見なされるものと「プログラミング命令」と見なされるものを区別する必要があることが多いことである。この区別をさらに複雑にしているのは、プログラム可能なスニペットをサポートするアプリケーションには、ほとんどの場合、基本的な構文のシンタックスハイライトまたは埋め込みコマンドの実行による複数のプログラミング言語の認識のサポートが含まれているという事実である。

これらの理由やその他の理由により、プログラム可能なスニペットからプレーンテキストを出力するには、ほとんどの場合、シンタックスと区切り文字の衝突の問題を回避するように注意する必要がある。

### 定数と変数

プログラム可能なスニペットには、多くの場合、既存の変数スコープまたは名前空間へのバインディングを確立する機能が含まれており、ユーザはそこからさまざまな定数または変数を選択できる。これらには、特定のマシンに現在ログインしているユーザの電子メールアドレス、現在のシステム時刻と日付、または関数の出力値などの値が含まれる場合がある。

スクリプト可能なスニペットは、多くの場合、1つ以上の現在アクティブなファイルに関連付けられている。その結果、変数には現在の編集セッションのファイルに関連する他の統計情報の中で、ファイル名、カーソル位置、親ディレクトリを指定する環境変数と引数も含まれる場合がある。

### 解釈されたコード

スクリプト可能なスニペットにより、1つ以上のプログラミング言語でコードを実行できる場合がある。これには、1つ以上のスタンドアロン言語、またはその言語がホストされているアプリケーションに固有の言語が含まれる場合がある。

## 代替案

コードスニペットの最も基本的な代替手段は、サブルーチンである。 サブルーチンを再利用可能なソフトウェアライブラリに組み込み、複数のプログラミングプロジェクト間で共有できる。

オブジェクト指向プログラミングと関数型プログラミングのデザインパターンはどちらも、プログラマがスニペットをさまざまなコードに繰り返し挿入することを回避または削減できるようにするためのテクニックである。Cファミリ言語では、この目的でプリプロセッサが使用されることがある。

## 参照

- 自動補完 – ユーザが入力している単語の残りの部分を予測するアプリケーション
- Codebase
- リファクタリング – 外部の動作を変更せずに既存のソースコードを再構築するプロセス
- コンテンツ管理
- Pastebin – オンラインコンテンツホスティングサービス
- Scrapbook (Mac OS)
- バージョン管理
- Web ウィジェット

## スニペットを提供しているソフトウェア・サービス

- Gitlab
- C# コード スニペット
- Emeditor