目次
- はじめに (vim_lib)
- 致命的な欠陥のないプラグインマネージャー (vim_lib、vim_plugmanager)
- プロジェクトレベルとファイルシステム (vim_prj、nerdtree)
- スニペットとファイルテンプレート (UltiSnips、vim_template)
- コンパイルと実行 (vim-quickrun)
- Gitを使用する (vim_git)
- デプロイ (vim_deploy)
- xUnitを使用したテスト (vim_unittest)
- すべてが置かれているライブラリ (vim_lib)
- その他の便利なプラグイン
コードとデザインを再利用することでプログラマーの生活が楽になることを教えてください。 しかし、私たち全員がそれを再利用できますか? 私のプロジェクトでは、コードのコピー&ペーストが必要なタスクに遭遇することが非常に多く、これを回避することは不可能です。 この「繰り返される」コードのカテゴリには、使用される言語のすべての構造、多くのプロジェクトクラス、およびテストケースが含まれます。 幸いなことに、そのようなコードをより速く、より適切に操作できるソリューションがずっと前に発明されています。
コードレベルの重複
必然的に、繰り返されるコードは、規模に応じて2つのグループに分けることができます。
- YaP構造またはコードブロック-たとえば、for、if / else、while、クラス構造、およびコピーアンドペーストが不可能な既製のソリューション
- ファイル全体-単体テストファイル、ドキュメント、エンティティクラスなど
グループごとに、さまざまなソリューションを使用して、コピーアンドペーストコードを簡単かつ迅速にします。 当然、これらのソリューションはすでにVimエディターに実装されているので、試してみることをお勧めします。
スニペット
スニペットは、コードの名前付きスニペット(何でも)であり、スニペットの名前を入力してホットキーを押すことですばやく挿入できます。 たとえば、クラスにgetterメソッドを挿入すると、 ログインプロパティが返されます 。 スニペットを使用して行う必要があるのは、メソッドが配置される場所にgetと入力し、 Tabキーを押すだけです。 結果として、メソッドのゲッターテンプレートが挿入され、返されるプロパティの名前を指定できるように、ポインターがメソッドの本体に配置されます。
例
public function get(){ return $this->_; }
例を見てみましょう。 ポインターは下線(_)の代わりに配置されます。 loginという単語を入力すると、メソッド名が自動的に変更されます。
例
public function getLogin(){ return $this->login; }
便利ですね。 しかし、 UltiSnipsプラグインを使用すると、言語構造であってもクラス全体であっても、あらゆる複雑なタスクのテンプレートを実装できます 。 私はかなり長い間、Vimにスニペットを実装するためにこのプラグインを使用しています。
たとえば、高いセキュリティが重要なプロジェクトの1つでは、安全なプログラミングを使用しています。 このプロジェクトでは、メソッドの入力パラメーターをすばやく確認できるスニペットをいくつか実装しました。 したがって、 assertpositiveと入力すると、次の形式のテンプレートが取得されます。
assert('is_int(_) && _ > 0');
つまり、タイプintおよびゼロより大きい値に属する入力パラメーターをチェックします。
もう1つの例は、Habrのスニペットです。 VimperatorというFirefoxプラグインを使用すると、Vimから直接Habrに関する記事を作成できることをご存知ですか? これを行うには、記事編集ウィンドウを開き、ポインターをtextareaに置き、 Ctrl + iの組み合わせを押します。 その後、Vimエディターが開き、保存後に書き込む( :wq )すべてがこのテキストエリアにコピーされます。 かっこいい スニペットを使用してhtmlタグを挿入するのはどうですか? そのため、habracutを追加するには、 cutと入力してTabを押すだけで、準備ができたタグを取得できます。 スニペットは既にメニューに実装されていると言うでしょう:

しかし、あなたはVimを使用しています。つまり、コンピューターのマウスが一番の敵です!
異なる言語で記述する必要がある場合は、スニペットが大好きです。 この場合、これらまたはそれらの構造が特定の言語でどのように記述されているかを正確に覚える必要はありませんが、似たような名前のスニペットを実装すれば十分です。 例えば、私はif 、 for 、 foreachなどのスニペットを使用するだけなので、特定の構造がどのようにBashに実装されているかを常に忘れています。
この記事ではUltiSnipsのスニペットの書き方を説明したくありません。公式のドキュメンテーションが私よりもはるかに優れているので、ゲッターメソッドを作成するためのスニペット宣言の小さな例を示します。
例
snippet get "public function get ..." b /** * $2. * @return ${3:mixed} */ public function get${1/\w+\s*/\u$0/}(){ return $this->$1; }$0 endsnippet
パターン
Vimプラグインのドキュメントの作成にどれだけの時間を費やさなければならないかに気付いたとき。 実際、ドキュメントファイルには特定の構造があります。
例
.txt Vim 7.0. ` ` 1. -description 2. -requirements 3. -install 4. -use 5. -opt 6. -commands 7. -menu 8. -events ================================================================================ 1. -description ... ================================================================================ 2. -requirements Vim 7.0 . vim_lib https://github.com/Bashka/vim_lib vim_lib#sys#Plugin#, .
通常、Vimプラグインのドキュメントには約100行が含まれており、そのうち約60行はヘッダー、目次、セクションなどのテンプレートデータです。 スニペットを使用してドキュメントを作成するには、繰り返しの操作が必要になりますが、これは望ましくありません。 次に、 vim_templateプラグインを作成することにしました。 このプラグインは空のファイルにデータを入力し、テンプレートを作成して、同じ操作を繰り返して作業用のファイルを準備する必要性を奪います。 VimLanguageを使用すると、ファイルテンプレートを非常に柔軟に構成できます。これにより、非常に複雑な構造を持つファイルを作成できます(たとえば、ファイルシステム内のクラスの場所を考慮して、ファイルの先頭に名前空間を自動的に追加します)。 プラグインの別の機能は、テンプレートのコンテキストを定義する機能です。 たとえば、テストケースファイルまたは〜/ .vim / bundle /ディレクトリにあるファイルに対してのみテンプレートを作成でき、前の記事で述べたプロジェクトレベルをロードすると、特定のプロジェクトに対してのみテンプレートを定義できます。
vim_templateプラグインは非常にシンプルです。 ファイルを開くと、そのファイルのテンプレートファイル(ディレクトリ./.vim/templates、〜/ .vim / templatesおよび$ VIMRUNTIME / templates )が順番に検索され、その内容がコンパイルされてこのファイルに挿入されます。 テンプレートファイルの検索ロジックでは、ファイル名から開始するだけでなく、ファイルシステム内の場所を考慮することもできます。 以下に例を示します。
- ___。Phpテンプレートがある場合、この拡張子を持つすべてのファイルに適用されます
- ___ Test.phpテンプレートがある場合、以前のテンプレートをオーバーライドするPHPクラスのすべてのテストケースに適用されます
- autoload / ___。Vimテンプレートがある場合、autoloadディレクトリにあるvim拡張子を持つすべてのファイルに適用されます
- テンプレートがプロジェクトに関連して配置されている場合(ディレクトリ./.vim/templatesにある )、そのプロジェクトでのみ使用されます
快適で柔軟ですね。 実際のプロジェクトの例を次に示します。
- Vimプラグインドキュメントテンプレート
- プラグインおよび自動ロードディレクトリにあるVimプラグインファイルのテンプレート(通常、同様の構造を持っています)
- テストケーステンプレート
- エンティティとマッパーのテンプレート
既に述べたように、テンプレートの内容は新しいファイルにコピーされるだけでなく、プリコンパイルされるため、テンプレートが挿入された場合にのみ取得可能なデータを新しいファイルに挿入できます。次に例を示します。
- 著者、ライセンス、作成日に関する情報
- ファイル名から派生したクラス名
- ファイルシステムのファイルの場所から取得したクラス名前空間
- ファイルシステム内のファイル名または場所に基づいて値が計算される定数
これはすべて、テンプレートの挿入中に値で置き換えられる特別なマーカーの助けを借りて行われます(これらは、次のレコード<+ name +>の形式でテンプレートに挿入されます)。 これらのマーカーは、辞書vim_template#キーワードおよびvim_prj#optにリストできます 。 個人的には、著者、メール、ライセンスなどのマーカーを使用しています。 リストしたマーカーに加えて、事前定義されたマーカーも使用できます。
- 日付-現在の日付
- 時間-現在の時間
- 日時-日付と時刻
- file-現在のファイルの名前
- ftype-現在のファイルの拡張子
- fname-拡張子なしの現在のファイルの名前
- dir-現在のファイルが置かれているディレクトリのアドレス、プロジェクトルートに対する相対アドレス
- 名前空間-プロジェクトのルートに対する現在のファイルのアドレス
ただし、事前に定義されたマーカーを使用することはできません。そのため、「実行可能なマーカー」を使用することができます(それらは斜めの引用符で囲まれています)。 これらは、テンプレートが挿入されたときに実行されるVimLanguageコードブロックです。 彼らの助けを借りて、マーカーの変換(たとえば、スラッシュをドットに置き換えることでdirマーカーを現在のクラスの名前空間に変換)、新しいマーカーの計算などを行うことができます。 ここでのすべての標準マーカーは、ローカルVim変数の形式( l:日付 、 l:dir 、 l:ファイルなど)で利用できます 。
例として、現在のプロジェクトで使用されているマッパークラスのテンプレートを示します。
例
<?php /** * <++> * * @author <+author+> */ class `substitute(strpart(l:dir, strlen('application/')), '/', '_', 'g')`_<+fname+> extends My_Db_Mapper{ /** * @see My_Db_Mapper::getDefaultTable */ public function getDefaultTable(){ $tableName = '`tolower(substitute(strpart(l:dir, strlen("application/db/")), "/", "_", "g") . "_" . strpart(l:fname, 0, strlen(l:fname) - strlen("Mapper")))`'; $table = new My_Db_Table([ 'name' => $tableName, ]); $table->_linkedCacheTags = [$tableName]; return $table; } /** * @see My_Db_Mapper::getStateEntity */ protected function getStateEntity(\My_Db_Entity $entity){ return [ '' => $entity->(), ]; } /** * @see My_Db_Mapper::setStateEntity */ protected function setStateEntity(array $state, \My_Db_Entity $entity){ $entity->($state['']); } /** * @see My_Db_Mapper::getEmptyEntity */ protected function getEmptyEntity(){ return new `substitute(strpart(l:dir, strlen('application/')), '/', '_', 'g')`_`strpart(l:fname, 0, strlen(l:fname) - strlen('Mapper'))`; } }
ClientMapper.phpなどの新しいファイルを作成するとき、プラグインは次のようにそれを入力します。
例
<?php /** * * * @author Artur Sh. Mamedbekov */ class Db_ClientMapper extends My_Db_Mapper{ /** * @see My_Db_Mapper::getDefaultTable */ public function getDefaultTable(){ $tableName = '_client'; $table = new My_Db_Table([ 'name' => $tableName, ]); $table->_linkedCacheTags = [$tableName]; return $table; } /** * @see My_Db_Mapper::getStateEntity */ protected function getStateEntity(\My_Db_Entity $entity){ return [ '' => $entity->(), ]; } /** * @see My_Db_Mapper::setStateEntity */ protected function setStateEntity(array $state, \My_Db_Entity $entity){ $entity->($state['']); } /** * @see My_Db_Mapper::getEmptyEntity */ protected function getEmptyEntity(){ return new Db_Client; } }
クラスの名前空間は自動的に計算されることに注意してください。 クラスにプライベートソリューションをわずかに追加するだけで、すぐに使用できます。
さようなら
Vimでの作業中に同じ構造を繰り返す必要がある場合は、適切なスニペットまたはテンプレートファイルを実装してみてください。これにより、時間を大幅に節約できます。 もちろん、VimLanguageとスニペットを書くための言語を習得する必要がありますが、数時間でプロジェクト全体を作成し始めると、それ以上の成果が得られます。