vimスニペットプラグインの違いは何ですか?


25

vimには多数のスニペットプラグインがあります:ultisnipssnipmatexptemplateneosnippetなど。

それらにはすべて長所と短所があり、多かれ少なかれ依存関係があります。これまで、私はアルティスニップを使用してきましたが、完全に満足することはありませんでした。

プラグインマネージャについて非常に興味深い完全な質問があるので、スニペットプラグインについて同様の説明をすることは非常に役立つと思います。

ここには良い出発点になる可能性のあるリストがありますが、私たちのコミュニティが書くことができるいくつかの完全で明確で正確な答えは非常に便利です。


1
:あなたはまた、マーク・ウェーバーウィキに提供されるこのマトリックス持っvim-wiki.mawercer.de/wiki/topic/...
リュックHermitte

2
私見これは非常に一般的です。おそらく「これに完全に満足したことはありません」と説明するなら?Shougoの「neosnippet.vim」を使用します。
ヴァンレーザー

ここからの情報でウィキを更新する必要があります。ありがとう。
クリスチャンブラバンド16

@ChristianBrabandt:うん、しばらくしてから(数日中に)更新します。
statox

回答:


22

私は今、数週間にわたってアルティスニップを使用しています。

このプラグインの主な利点は次のとおりです。

  • 多数のスニペットを使用できる場合でも、かなり高速です。
  • 新しいスニペットを定義するための基本的な構文は理解しやすいため、目的の処理を実行する新しいスニペットを簡単にすばやく作成できます。(より複雑なスニペットの場合、追加の作業が必要になる場合があります。)
  • すぐに使用できます。基本設定により、スニペットを非常にすばやく使用できます。
  • それは本当に設定可能です。基本設定がうまく機能していても、パワーユーザーであれば、かなり細かく調整できます。

まず、ultisnipsはスニペットエンジンです。つまり、プラグインはスニペットを使用する機能を提供しますが、スニペット自体は提供しません。スニペットを取得するために、著者はvim-snippetsを推奨してい ます

両方のプラグインをインストールしたら、スニペットを使用できるようになります。

スニペットの定義はft.snippets、次のパターンという名前のファイルに保存されます: 、、ft_*.snippetsまたはft/*。ここftで、現在のドキュメントの「ファイルタイプ」であり*、空の文字列を含む任意の文字列に一致するシェルのようなワイルドカードです。(点線のファイルタイプ構文cuda.cppがサポートされていることに注意してください。)

このようにして、ファイルタイプに固有のスニペットは、バッファのファイルタイプが設定されている場合にのみ展開されます。allすべてのバッファで展開されるスニペットを作成するための特別なファイルタイプが利用可能です。

vim-snippetsが提供するスニペットに加えて、ユーザーは独自のスニペットを定義できます。~/.vim/my-snippets/UltisnipsUltisnipsが追加設定なしでそれらを見つけるように、これらをディレクトリに配置することをお勧めし ます。ドットファイルリポジトリでそれらを維持するのは簡単です。

スニペットを展開するために、Ultisnipsはg:UltiSnipsExpandTrigger 、展開をトリガーするマッピングを定義する変数を提供します(私**にとって非常に便利なものを選択 しました)。統合は可能であるはずですが、私は自分でテストしませんでした)。

パワーユーザー向けに、Ultisnipsは拡張機能の動作をカスタマイズしたり、異なる方法でトリガーしたりするための機能も提供します。見る:h UltiSnips-trigger-functions


これは、私が実際に広範囲に使用した最初のスニペットマネージャーであり、最初から簡単に使用でき、調整できる可能性があるため、これは良いものだと思います。

最後に、プラグインの概要を説明するスクリーンキャストのリストを示します。


空白またはaが前にない限り、トリガー時に展開しないようにする方法を知っていますか>(HTMLの閉じ中括弧のように。オプションiはそれからそれがそれを作るので、たとえそれが良くない単語の途中であってもそれを拡張する
トールボーイ

12

Vimを使い始めてから、元のSnipMateを使用しています。

  • 外部依存関係はありません。
  • 非常に単純な構文を使用します。
  • 設定はとても簡単です。
  • 2009年以降廃止されています。

私は文句を言うことは何もありません。


16
放棄を機能として言及している人を見たのは初めてです。:D
ムル

6
放棄されたプロジェクトは安定したプロジェクトです。ローカルインスタンスが古くなっていることや、APIの変更によりワークフローが壊れていることを心配する必要はありません。インストール時にニーズを満たせば、いつまでもそうなります。ニーズが変化しない限り。安定性は、私があらゆるツールで探している一番の機能です。
ロメインル

3
「インストール時にニーズを満たせば、永久にそうなります。ニーズが変わらない限り。」または、バグを見つけたら、その時点で自分で修正するか、他の誰かを見つけて修正するか、代替を探す必要があります。おそらく放棄されていないもの。

1
あなたの答え@romainlをありがとう!私は1つの質問があります:プラグインは放棄されたと言いましたが、readme はかなりアクティブに見える新しいバージョンにリダイレクトされ、いくつかのコミットはいくつかのものを修正するようです新しいものを使用する方が良いですか?
statox

1
UltraSnipsにはいくつかのバグとドキュメンテーションエラーがあり、それらは入門的なエクスペリエンスよりも劣っています。最終的に実行した後、SnipMateをチェックして、安定性に関する@romainlの議論を理解することにしました。
chb

7

mu-templateの機能のリストを次に示します。Discl .:私はそのメンテナーです。

  • テンプレートファイルは展開できます。
    • 新しいバッファを開くときに自動的に(.vimrcで非アクティブ化されていない限り)、
    • メニューまたはコマンドラインを介して明示的に、
    • スニペットのような方法でINSERTモードから。
    • VISUALモードから選択範囲をスニペットで囲む-スニペット内の異なるゾーン(たとえば、whileコントロールステートメントのコードまたは条件ゾーン)に適用できます。
  • すべてのスニペットは独自のテンプレートファイルで定義されます。他のすべてのスニペットエンジンはファイルタイプごとに1つのファイルを使用し、すべてのスニペットをその中に入れます。
  • テンプレートファイルは、ユーザーによって、または特定のプロジェクトのコンテキストでオーバーライドできます。
  • ファイルタイプ固有のスニペットをINSERTモードに定義できます(たとえば、CスニペットをC ++、Javaなどから使用できるなど、継承できます)。一致するスニペットのリストには、各スニペットのヒントが表示されます。
  • 計算されたVimL式を挿入できます。
  • 拡張中にVimL命令を実行できます。これを使用して、欠落しているincludeステートメントまたはimportステートメントを自動的に追加します。
  • テンプレートファイルには、他のテンプレートファイルを関数のような方法で含めることができます(パラメーターもサポートされています)-よく知られていますが、これを実装するスニペットエンジンはほとんどなく、スニペットエイリアスをサポートすることすらできません。この機能 ;
  • プレースホルダーシステムと完全に統合されています。
  • 再インデント(必要な場合)およびPythonインデントをサポートします。
  • vim折り畳みでうまく機能します。
  • I18nフレンドリー;
  • いくつかのスニペットが一致すると、高度な補完メニューがポップアップします(YouCompleteMeポップアップメニューに触発されています)。
  • スタイルオプションが自動的に適用されます(あなたのブラケットを好む方法を教えてくださいif (...) {\n}if (...)\n{\n}何か他の?)、そしてもちろん、彼らは罰金現在のプロジェクト、または現在のファイルタイプ、あるいはその両方に応じて調整することができます。
  • プラグインは100%VimLです。ただし、テンプレートファイルからPythonを使用できます。
  • mu-templateは、2つのライブラリプラグイン(lh-vim-libおよびlh-dev)と私のプレースホルダーシステム(lh-brackets)に依存しています。そのため、宣言するファイルを提供するときにVAMまたはVimFlavorと共にインストールすることをお勧めします。依存関係;
  • ライセンスはコード生成と互換性があります。つまり、mu-templateコードはGPLv3の下にありますが、スニペットはプロプライエタリコードで使用できます。ただし、一部のスニペットはBoost Software Licenseの下にあります。

  • 展開は、ローカルのvimrcが読み込まれた後に行われます。これは、展開が完了する前にプロジェクト固有の変数を設定するためです。

  • Tom LinkのStakeHoldersプラグインのおかげで、µTemplateにはプレースホルダーが関連付けられています(1つの名前付きプレースホルダーを変更すると、同じ名前の他のプレースホルダーが変更されます)。利害関係者をインストールしなくても、µTemplateを使用できます。

正直に言うと、テンプレートの構文は少し面倒で、プレースホルダーシステムは最初のプレースホルダー世代に属します。mu-templateはVimの最も古いテンプレート/スニペットエンジンの1つです。

ただし、スニペットが他のスニペットを(条件付きで、パラメーター付きで)オーバーライドできるかどうかを許可するという事実は、非常に重要です。典型的なアプリケーションは

  • C ++ファイルテンプレート

    1. ファイルヘッダーが含まれます(通常、適切な著作権表示を含めるために、プロジェクトごとに微調整されます)
    2. 次に、現在の種類のファイル(.h、.cpp、または単体テストファイル)に最適なテンプレートを読み込みます。
      • ヘッダーファイルの場合、再包含防止ガードが含まれます-計算方法はオーバーライドされる可能性があります(再びプロジェクトポリシーに従う)
      • .cppファイルの場合、一致する.hファイルが見つかると自動的に含まれます
  • lh-cppに汎用クラススニペット/ウィザードがあります。そして、この共通のクラステンプレートを使用しますが、パラメータが異なるいくつかの特殊なクラス。


ご回答有難うございます!質問があります:All snippets are defined in their own template-file -- all other snippet engines use one file per filetype and put all snippets in it このアーキテクチャの利点は、通常のアーキテクチャ(ファイルタイプごとに1つのファイル)と比較して何ですか?
statox

@statoxこれはスニペットのメンテナンスの問題です。一部のスニペットは非常に複雑です。internals/class-skeletonたとえば、lh-cpp を見てください。コントロールステートメントスニペットとブレンドさせたくないです。しかし、すべての制御ステートメントを一緒に持つことはそれほど問題ではないことを認めなければなりません。また、このアプローチのおかげで、私は非常に簡単になど、私のスニペットをオーバーライドし、その場でそれらを更新、機能としてそれらを使用することができます
リュックHermitte

実際、あなたのリンクを見ると、一部のスニペットが独自のファイルに保存されている理由がわかります。ご説明いただきありがとうございます。
statox

1
@statox実際、私が持っているスニペットの多くは複雑になる傾向があります。可能な限り多くのスマートなものを検出、推測、実行しようとしています。ほとんどの場合、自動ロードされた関数にコードを移動しますが、時々、互いに呼び出す複数のスニペットを使用する方が理にかなっています(そして、プロジェクトのニーズに合わせて調整できるバリエーションポイントとして機能します->著作権ステートメント、...)
リュックエルミット

4

SnipMateとUltiSnipsは、Vimで最も人気のある2つのスニペットエンジンです。どちらもTextMateのスニペット構文に触発されています。UltiSnipsはすべてのSnipMateスニペットを実行できますが、より強力にするための追加の構文もあります。

経験則として、VimがPythonをサポートしている場合はUltiSnipsを使用してください。そうでない場合は、SnipMateを使用します。

.vimrc、Pythonの可用性に応じてプラグインを(プラグを使用して)ロードします。

if (has('python') || has('python3'))
    Plug 'SirVer/ultisnips'
else
    Plug 'garbas/vim-snipmate'
    Plug 'MarcWeber/vim-addon-mw-utils' "required for snipmate
    Plug 'tomtom/tlib_vim' "required for snipmate
endif

UltiSnipsは、スニペットでpythonコードを実行することもでき、クールなトリックを実行できます。これは、テキストの周りにボックスを描く私のお気に入りのスニペットの1つです(LaTeXとVimを使用して数学の講義でメモを取ることができる方法から| Gilles Castel

snippet box2 "Box"
`!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
│ $1 │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
$0
endsnippet

このスニペットを使用して、次のようなものを出力できます。

┌─────────────────────┐
│ this is a cool box! │
└─────────────────────┘
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.