ホーム > タグ > plugin

plugin

Hack #238: neobundle.vim で plugin をモダンに管理する

こんにちは。Shougoです。Vimテクニックバイブルの執筆で長らくお休みを頂いていました。 執筆が終わってからも、プラグインの更新で忙しいのが難点です。 とはいえ、あまりに間隔が空いているのは執筆者としてまずいと感じたため、久しぶりに復帰します。

みなさん、Vimプラグイン管理には何をお使いでしょうか。残念ながら、Vimのプラグイン管理には良い方法がなく、 各々が「自分の考える最強のプラグイン管理プラグイン」を作ってきました。 つまり、長らくプラグイン管理プラグインは戦国時代の様相を呈していたわけです。 実装が存在しないVimJoltsもその一つです:-)。 しかし最近、Vimのプラグイン管理はVundleに一元化されることが多くなってきました。 「Hack #215: Vundleでプラグインをモダンに管理する」やVimテクニックバイブルでも紹介されています。 私も最初はpathogenを使っていましたが、アップデートが簡単なVundleに乗り換えた経緯があります。 ただしVundleにもいくつか不満があったため、自分でforkしたVundleをしばらく使用していました。 しかし、最終的にVundleの仕様変更に追随できなくなったため、forkしたVundleを元にneobundle.vimを開発することにしました。 変更点をVundleにマージするには、変更点が多すぎたということもあります。 今回はneobundle.vimについて紹介します。

neobundle.vimとVundleの違い

Vundleをベースにしたため、基本的な機能は同じです。 Vundleを知っているなら、すぐに乗り換えることも可能でしょう。 変更点は幾つかありますが、主なものは以下の通りです。

コマンド名が改善されている

VundleはBundleを意識して付けられたコマンド名になっているため、コマンド名とプラグイン名が対応していません。 例えば、プラグインをインストールするコマンド名は:VundleInstallではなく、:BundleInstallです。 この辺りは、議論がされているようですが、まだ結論は出ていません。 neobundle.vimはプラグイン名をプレフィクスとした、:NeoBundleInstallとなっています。 BundleをNeoBundleに改名するだけで、基本的に使用することができます。

vital化されている

ルーチンを他のプラグインと共通化するために、vital.vimを使用しています。 プラグインの開発が楽になります。

shellslashがオンでも動作する

shellescape()を使用していますが、shellslashオプションがオンの場合、クオートが”になってしまうという問題があります。 つまりWindows環境で、cmd.exeをshellとして使用している場合、shellslashを有効にしていると動きません。 neobundle.vimではshellescape()を使用していません。

vimprocに対応している

vimprocが利用できる環境では、アップデートにvimprocを使用します。 Windows環境では、DOS窓が出ないという利点につながります。

unite.vimインタフェースの実装

実は、これがneobundle.vimで一番やりたかった機能です。 neobundle.vimはunite.vimのインタフェースを実装しているため、unite.vimからVimプラグインをアップデートすることができます。 非同期でアップデートを行うため、使用にはvimprocが必要です。 neobundle.vimはunite.vimやvimprocがない環境でも動作しなくてはならないため、従来のインタフェースも残っています。 ただし、従来のインタフェースは緊急用のため重視していません。

Subversion, Mercurialへの対応

tsukkeeさんがVundleに追加していた機能をマージし、Subversion, Mercurialに試験的な対応をしました。 まだ実験段階ですが、試していただければと思います。

リビジョン指定

:NeoBundle {repository} {revision}という構文でリビジョン指定ができます。まだ実験段階の機能です。 不具合のあるプラグインのバージョンを固定する時に便利だと思います。

neobundle.vimの導入

neobundle.vimの開発は、github上で行われています。https://github.com/Shougo/neobundle.vim 導入する場合、~/.vimにリポジトリをcloneすると楽でしょう。

$ git clone https://github.com/Shougo/neobundle.vim ~/.vim/neobundle.vim.git

plugin の管理

plugin の管理は以下の様に .vimrc に NeoBundle 'plugin name' と記述することで行います。 極端な話、BundleNeoBundleに変更するだけです。

set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+='path to neobundle directory'

  call neobundle#rc(expand('~/.bundle'))
endif

NeoBundle 'git://github.com/Shougo/clang_complete.git'
NeoBundle 'git://github.com/Shougo/echodoc.git'
NeoBundle 'git://github.com/Shougo/neocomplcache.git'
NeoBundle 'git://github.com/Shougo/neobundle.vim.git'
NeoBundle 'git://github.com/Shougo/unite.vim.git'
NeoBundle 'git://github.com/Shougo/vim-vcs.git'
NeoBundle 'git://github.com/Shougo/vimfiler.git'
NeoBundle 'git://github.com/Shougo/vimshell.git'
NeoBundle 'git://github.com/Shougo/vinarise.git'

filetype plugin on
filetype indent on

Vundleと同様、先にfiletypeをoffにしてから、neobundle.vimの設定を行います。 最初、neobudle.vimの関数を呼べるよう、neobundle.vimのパスを&runtimepathに追加します。 そしてneobundle#rc(expand('~/.bundle'))で初期化します。 neobudle#rc()の引数はプラグインをインストールする基準となるパスです。 NeoBundleコマンドで設定をしたあと、最後にfiletype pluginをオンにします。

NeoBundle コマンドの使い方

Vundleと全く同じです。基本的にBundleコマンドがNeoBundleコマンドに変わっただけです。

Github 上のリポジトリから取得する

NeoBundle 'user_name/repository_name'

vim-scripts 上のリポジトリから取得する

NeoBundle 'script_name'

それ以外のリポジトリから取得する

NeoBundle 'git://repository_url'
NeoBundle 'http://svn.macports.org/repository/macports/contrib/mpvim/'
NeoBundle 'https://bitbucket.org/ns9tks/vim-fuzzyfinder'

Gitリポジトリのフルパスを指定します。 MercurialやSubversionにも試験的に対応しています。

pluginの管理

plugin のインストールには、:NeoBundleInstall コマンドを使用します。 .vimrcで設定したplugin が自動的に取得され、インストールまで行われます。 ただし、アップデートしたプラグインを使用するには、Vimを再起動したほうが良いです。

:NeoBundleInstall

既にインストールされている plugin をアップデートするには、 :NeoBundleInstall! コマンドを利用します。 通常のNeoBundleInstallでは、アップデートが行われないからです。

:NeoBundleInstall!

不要になったプラグインを削除するには、:NeoBundleの設定を.vimrcから削除した後、 :NeoBundleCleanコマンドを実行します。

neobundle.vimはplugin検索には対応していません。

neobudle.vimはneobundle/install sourceを使用することで、 unite.vimインタフェースによりアップデートを行うことができます。 アップデートは非同期に行われます。 neobundle/install sourceの引数に!を与えると、:NeoBundleInstall!相当になります。 プラグイン名を引数に与えることで、個別にアップデートをすることも可能です。

:Unite neobundle/install:!
:Unite neobundle/install:neocomplcache
:Unite neobundle/install:neocomplcache:unite.vim

ドキュメントの更新

プラグインのインストール時に、自動的に:helptagsコマンドが実行されるため、 ユーザーは何もする必要がありません。

参考

  • :help neobundle
Shougo

Vimテクニックバイブル紹介(Shougo版)

この記事について

この記事は、開発環境勉強会における「Vimテクニックバイブル」紹介スライドの完全版です。 「Vimテクニックバイブル」については、taku_oさんやmattnさんなども記事を書いていますが、 私の場合はできるだけ本の内容に触れたものにしています。 これを読んでVimテクニックバイブルを購入していただける人が増えれば、著者達にとって最高の喜びです。

Vimテクニックバイブルができた背景

以前にもブログの記事で触れていますが、Vim界には良質な記事や書籍が不足しています。 特に、まともにVim scriptを書ける人が書いた書籍がほとんどありません。 これはVim界の大きな損失であり、Vim scriptプログラマーが育たない大きな原因となっています。 私がVim勉強会に参加すると、必ずといっていいほど聞かれるのが 「Shougoさんは、Vimの書籍を書かないんですか?」ということです。 この声になかなか答えられないのは悲しいものがありました。

Vimテクニックバイブル

と、いうことで……今年ついにVimの書籍が刊行されます! 書名は「Vimテクニックバイブル」です。 中身は「Emacsテクニックバイブル」のVim版となっており、イメージカラーは当然Vimグリーンです。 そういえば、EmacsテクニックバイブルはEmacsブルー(パープル)でしたね。 キャッチコピーは、「unite.vimで進化する新しいVimの常識を教えます。あなたはVimの本当の姿を知っていますか?」 Emacsテクニックバイブルとは違い、unite.vimを全面に押し出しています。

執筆者紹介

執筆陣はかなり豪華です。おそらく、これだけの人達が一冊の書籍を作るために集まることはもうないでしょう。

taku_o

人気サイト「名無しのVim使い」の管理人です。雑誌にVimの記事を執筆したことがあります。 サイトで紹介しているだけあって、様々なプラグインについて、かなりの知見を持っています。

yukimi

章の基礎知識や用語の統一など、細かいところで手伝ってもらっています。Vim使いです。

mattn

webapi-vimやzencoding.vimの作者です。他にも細かなプラグインを作っています。 KaoriYaさんと同じく、昔からVimにパッチを多数送っており、Vimの内部実装や黒魔術に詳しいです。

thinca

quickrunやref.vim, scouter.vimなどの作者です。unite.vimのsourceやvital.vim, eskk.vimなどにも関わっています。 Vim scriptにかなり詳しいです。

fuenor

QFixHowm, QFixGrep, JPFormat.vimの作者で、Vim-UTF8を配布しています。 Windows環境での日本語の扱いについて詳しいです。

Shougo

neocomplcache, vimshell, vimproc, unite.vim, vimfilerなどを作っています。 メンテナンスしているプラグインが多すぎて、なかなか時間が足りないのが悩みです。Vimは環境だと思っています。

内容紹介

もう執筆がほぼ終わっているため、中身は確定しています。プラグインの紹介を中心とした豪華な内容となるようにしました。 紹介しているプラグインは定番からマイナーまで幅広く、作者自ら解説していることもあります。 まだ発売まで期間があるため、詳しい目次を挙げることはできませんが、以下のような内容が含まれています。

vimfiler

vimfilerの使い方や、キーマッピング、マニアックなところではvimfilerを用いた拡張リネーム機能について解説しています。

netrw

netrwによる遠隔地ファイル編集、netrwによるブックマーク、netrwによるファイル操作が解説されています。

quickrun

quickrunの使い方、各種オプション、設定方法について解説されています。

ref.vim

ref.vimの使い方、各種sourceについて解説されています。

vimshell(インタプリタ通信機能を含む)

vimshellの使い方、よく使われる内部コマンド、vimshellのインタプリタ通信機能を解説しています。 ちなみに、Emacsテクニックバイブルでは、eshellについて触れられていません。

Conque

Vimで端末を実現するプラグインであるConqueの使い方、vimshellとの違いについて解説しています。

skk.vim

SKKについて解説しています。eskk.vimも少しだけ書いてあります。それほどページはありません。

neocomplcache

neocomplcacheの使い方、設定方法、neocomplcacheのスニペット機能、スニペットの書き方、 neocomplcacheのsourceの作り方と、大変豪華な内容となっています。 以前Vim Hacksに書いた内容の完全版と言っても良いでしょう。

zencoding.vim

zencoding.vimの基本から、任意の言語への応用例まで挙げられています。

QFixHowm

QFixHowmの使い方、メモの作成方法、メモの検索、ToDo管理について解説されています。

QFixGrep

Windows環境のgrepの注意点についても解説されています。

JPFormat.vim

JPFormatによる日本語の整形方法について解説されています。

autodate.vim

webapi-vim

VimからWebサービスを扱う方法について解説されています。

project.vim

project.vimによるプロジェクト管理やproject.vimの設定方法について解説されています。

Vim scriptが分からない初心者でも安心!

Vimの設定や、Vim pluginについての解説を中心とした書籍となっていますが、 ある程度のVim scriptの知識は必要不可欠です。 そこで、次のような項目について解説しています。 これ以上の詳しい解説については、Vimのヘルプを参照してください。

:helpの読み方

Vimの:helpをすぐに引けるかどうかは、初心者と初級者を分ける大変重要なファクターとなっています。 この本では、Vimの:helpの使い方について解説しています。

Vim script基礎文法最速マスター(改訂版)

これは、thincaさんが以前ブログで書いていた「Vim script基礎文法最速マスター」の改訂版です。 Vim scriptについて一通り学ぶことができます。

マッピングについて

Vimのキーマッピングは大変ややこしいですが、詳しく解説しています。

オプションについて

Vimのオプションには落とし穴が多数あります。Vimのオプションにおける仕様について解説しています。

Vimプラグインの管理

Vimのプラグインをインストールするなら、パッケージマネージャは必要不可欠です。 定番のVundle, pathogenから、vimballに至るまで解説をしています。

テキストオブジェクト

最近のVimを語るにはなくてはならない機能です。 テキストオブジェクトの拡張についても触れられています。

QuickFix

grepやmakeには欠かせない機能です。

:autocmd

外部インタフェース

ちょっとレベルが高いですが、Perl, Pythonの外部インタフェースについて解説されています。

最近のVimといえば、unite.vimは外せないよね!

当然unite.vimについては、1つのChapterを贅沢に使用して解説しています。 Emacsテクニックバイブルはanything.elについて2つのChapterを使っているので、そちらよりは若干量が減ります。 それでも、30ページくらいはあるため、十分満足できると思います。 unite.vimの章では、次の内容を解説しています。 これを読めばあなたもunite.vimマスターに!

vimfiler, vimshellなどといった他のプラグインとの連携

unite.vimの有用なsource

カスタマイズ方法についての解説

unite.vimの各種オプションについて、解説しています。 マニアックなところでは、buffer-name-optionについての解説もあります。

source, kind, action, filterの解説

特にsourceを自作する場合、source, kind, action, filterの概念は重要です。それぞれの仕様について詳しく解説しています。 作者が自ら書いているため、情報が正確で安心です。

sourceの作り方まで載っている!

サンプルsourceの作り方が書いてあります。マニアックなところでは、非同期sourceの仕様についても書いています。

unite.vim Ver.2.2対応(一応)

一応最新版のunite.vimの仕様に準拠しています。残念ながら、あまりにも新しい機能は解説できていません。 不変的な情報に絞って解説しています。 現在開発中のunite.vim Ver.3.0について少しだけ触れています。

もちろん、Emacsの人達にもオススメ

EmacsテクニックバイブルがVimmerにも有用な本であったように、 当然VimテクニックバイブルはEmacsを使っている方々にもオススメです。 Emacsを使っている人も、異文化交流は重要です。 同じ環境で満足していたら、何も生まれません。 auto-complete.elもVimの補完機能を参考にしています。 つまり、Emacs使いであってもVimや他のエディタからも刺激を受けるべきなのです。 この本を読めば、最近のVimの機能やプラグインについて分かります。 例えば、unite.vimとanything.elの違いが分かります。 新人にVimを教えざるをえないときにも使えます。 さらに、一身上の理由により、Vimに乗り換えざるをえないときもVimテクニックバイブルの知識があれば安心ですね。

現在確定している情報

ページ数は384Pで、Emacsテクニックバイブルと同じです。 値段は¥2, 980+税です。基本的に技術書というのは、¥3000を越えると購入までのハードルが上がってしまいます。 ページをできるだけ減らしたこともあり、税抜きでなんとか¥3000は切ったのですが、若干Emacsテクニックバイブルより高くなってしまいました。 発売日は9月中旬予定ですが、詳しい日付けの確定はしていません。 目次については、八月中に確定する予定なので、九月には詳しい情報が出せるでしょう。 まだ発売まで時間があるので、しばらくお待ちください。

残念ながら載せられなかった内容

できるだけ、著名なプラグインは載せるように心がけましたが、 ページ数の都合やその他様々な理由により載せられなかったプラグインがあります。 ここではそれらについて紹介します。

VCSとの連携

VCSと連携できるプラグインとしては、git-vimやfugitive.vimがありますが、決定版と呼べるようなものがなかったためです。 vcs.vimが候補だったんですが、未完成でした。

shadow.vim

時間とページ数の都合が付きませんでした。

snipMate

neocomplcacheのスニペット機能で十分だったためです。解説する人もいませんでした。 ちなみに、snippetsEmuはページ数が足りませんでした。

echodoc

入れてもよかったんですが、他のTipsが削られすぎて入れる暇がありませんでした。

netrwについての詳しい解説

時間とページ数の都合がつきませんでした。 ただし、一部のTipsでnetrwの機能について触れられています。

metarw

使っている人があまりに少ないため削られました。metarwがやっていることは、vimfiler+unite.vimでできるようになる予定です。

vimprocの使い方について

書籍では簡単にvimprocについて触れていますが、さすがに詳しい解説はできませんでした。 想定読者にとっては難しすぎるからです。vimprocをバリバリ使えるような層では、Vim scriptから使い方を解読するのも簡単だと思います。

vital.vim

このプラグインは、プラグイン制作者のためのものです。この本の対象読者にはレベルが高すぎました。 それに、ページ数の余裕もありませんでした。

内容の陳腐化への懸念について

書籍は生物です。コンピュータに関する書籍は出たばかりのときに購入しておかないと、役に立つ前に時代遅れとなってしまうでしょう。 だからこの本が必要なら、発売されたらすぐに購入するのが適切です。特に、一度絶版になってしまったら取り返しがつきません。 本の売り上げが上がると、出版社に対するVimへの印象が良くなり、続編などが企画されるかもしれません:-)

特に私のプラグインは進化が早いため、本が出たらすぐに時代遅れとならないか心配してくれている人がいるようです。 はい。それは正しい指摘です。 ただ、私もそのことは分かっていました。だからわざと新しすぎる機能や、あまり使われない機能については本の中では解説せず、 「適時:helpを参照してください」ということになっています。できるだけ不変であろうことについて解説するようにしています。 それでも現在の実装と齟齬がでてきてしまった場合は、正誤表にて何かしらのフォローをする予定です。

「:helpに全部書いてあるから書籍は必要ない」という意見について

これはある意味事実です。だからこそ、本の対象とする読者は「Vimの基本的な操作や設定はできるが、:helpを自在に引くことはできない層」なのです。 :helpはリファレンスマニュアル的であり、分からない語句を検索するときに使います。 初心者が通読するには向いていません。 本というのは初心者が参照しやすいように、重要な情報をふるい分けることに価値があると考えています。

ただし、私が自分の記事の中で気をつけたのは、できるだけ「設計思想や使い方について解説をする」ことです。 これは:helpに書いていないことが多いうえに、内容が陳腐化することも少ないと考えました。 だから、ヘルプを自由自在に参照することができる、レベルが高いVim使いにとっても役立つ書籍だとは思います。 これが本当かどうかは、自分の目で本を見て確認してください。

なぜ「Vimテクニックバイブル」はVim scriptを学ぶ本ではないのか

それは需要がないからです。考えてみてください。あなたの周囲にVim scriptをバリバリ書けるような人はいますか? Vimが好きだから、Vim scriptを本格的に学びたいと考えている人はいますか? まずいないでしょう。「Vimテクニックバイブル」の内容ですら出版社からはリスクがあると考えられている現状において、 日本でVim scriptを学ぶための書籍が出る確率は0です。おそらく売れません。 「Vimテクニックバイブル」にはVim scriptの解説がある程度書いてあります。 しかし、一流のVim scripterになるための道はまだまだ険しいのです。

それでもVim script本の構想を諦めきれない場合は、まず「Vimテクニックバイブル」を購入し、その本に書いてあることを全てマスターしてください。 さらに「Vimテクニックバイブル」を周囲に宣伝し、全国のVimmerのVimレベルを上昇させてください。 その暁には、Vim script本の出版リスクは低減され、いつの日か発売されるかもしれません。

オマケ

今後、vim-users.jpで「Vimテクニックバイブル」に関する何かが掲載されるかもしれません。こうご期待! ちなみに、Vimテクニックバイブルを購入してもらった場合、勉強会でShougoのサインが貰えるかもしれませんよ!

Shougo

quickrun 0.5.0がリリースされました

変更点1 非同期出力

quickrunは従来から非同期実行を行っていましたが、今回さらにそれに加え、非同期出力も行うようになりました。

例:

(1..20).each do |i|
  sleep 0.2
  puts i
  STDOUT.flush
end

という内容に対し

:QuickRun -runner vimproc:100

のように実行させると、ちょっとずつ結果が出ます。(*1)

変更点2 モジュール化

ところで先ほど-runnerという新しい記法がでていました。これはquickrunのモジュール化に密接に関わってくるオプションです。

quickrun 0.5.0では、実行部分と出力部分をモジュール化しました。

runmode => runner
output => outputter

名前なども変わっております。詳しくは :help quickrun を見てください。

モジュール一覧:

  • runner
    • system
    • shell
    • vimproc
    • remote
    • python
  • outputter
    • buffer
    • message
    • variable
    • file
    • buffered
    • multi

変更点3 式展開記法

quickrun-syntax-option で {} が式展開になっていたものが、%{} に変更されました。多くの人は ~/.vimrc の変更が必要になります。これは大事なところなので、ぜひ一日三回はtweetしてください。

参考文献

http://d.hatena.ne.jp/thinca/20110529/1306677726

  • *1 すごい気がしないでもないけど、通常のプログラムは出力先が端末でない場合自動でバッファリングしちゃうみたいなので、残念ながら普段は恩恵に授かれないと思います。過度な期待はしないでください。
  • *2 ちなみに著者ujihisaは英語版documentの翻訳を行うなどしました。tyruさんとujihisaさんの英語を世界に広めましょう!

author: ujihisa

Hack #193: neocomplcacheの設定について知る 後編

後編では残りの設定について解説をします。

設定例

    " Shell like behavior(not recommended).
    "set completeopt+=longest
    "let g:neocomplcache_enable_auto_select = 1
    "let g:neocomplcache_disable_auto_complete = 1
    "inoremap <expr><TAB>  pumvisible() ? "\<Down>" : "\<TAB>"
    "inoremap <expr><CR>  neocomplcache#smart_close_popup() . "\<CR>"
    
    " Enable omni completion.
    autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
    autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
    autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
    autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
    autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags
    
    " Enable heavy omni completion.
    if !exists('g:neocomplcache_omni_patterns')
        let g:neocomplcache_omni_patterns = {}
    endif
    let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\w*\|\h\w*::'
    "autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete

Shell like behavior(not recommended).

set completeopt+=longest

let g:neocomplcache_enable_auto_select = 1

let g:neocomplcache_disable_auto_complete = 1

inoremap <expr><TAB> pumvisible() ? “\<Down>” : “\<TAB>”

inoremap <expr><CR> neocomplcache#smart_close_popup() . “\<CR>”

neocomplcacheをShellのような手動補完をするようにする設定です。 (not recommended)という文面からも分かる通り、オススメの設定ではありません。 要望が来たので対応させて、設定例として書いたものです。 これを設定すると自動補完が無効になる点に注意してください。

” Enable omni completion.

ここは、Vimに用意されているオムニ補完を有効化するものです。すでに設定されている場合は必要ありません。 neocomplcacheからオムニ補完を呼びたい場合には必要になります。 オムニ補完関数を設定するだけでは実際にはだめで、後述するg:neocomplcache_omni_patternsも同時に設定する必要があります。

” Enable heavy omni completion.

g:neocomplcache_omni_patternsは、neocomplcacheがオムニ補完の関数を呼び出すためのキーワードパターンを設定します。 主な言語にはデフォルトで対応していますが、RubyやPHPなど重いものは無効化されています。 設定例のようにすれば有効化できますが、Vimがフリーズする可能性もあります。自己責任で使用してください。

Shougo

Hack #189: Emacsのプラグインに対応するVimプラグイン

Vim使いのなかには、様々な理由によりEmacsから乗り変えてきた人も多いかと思います。しかしEmacsからVimに乗り換えようとする場合、キーバインドの違いもさることながら、自分が今まで使っていたEmacsのプラグインと対応するVimのプラグインにはどのようなものがあるか、についてはほとんど情報がありません。ここではEmacsのプラグインと対応するVimプラグインを紹介します。

anything.el≒FuzzyFinder, ku.vim, unite.vim

anything.elとはインタフェースを統一するプラグインです。 「Emacsテクニックバイブル」にて大々的に紹介され、Emacsのキラープラグインとして名高いです。 Vimにも当然それに相当するものが複数存在します。 FuzzyFinderはns9tksさんが開発したプラグインで、高機能なことが特徴です。 Fuzzyと名前についているだけに、候補の曖昧検索ができます。学習機能と複雑なアルゴリズムにより、最適な候補を簡単に選択することが可能です。 FuzzyFinderで開けるsourceは、バッファ、最近使ったファイル、タグなどです。ただし、それぞれのsourceを同時に検索することはできません。 一年ほど開発が止まっていたのですが、最近になって更新が再開されたようです。今後も目が離せません。 ku.vimはVim界の神ことkanaさんが開発したプラグインです。 FuzzyFinderのように曖昧検索もできますが、標準ではタグ検索ができないなど、機能はFuzzyFinderよりも少ないです。 しかし、ku.vimの魅力は豊富な拡張性とユーザーが自由にsourceを追加できることにあります。 anything.elのように、sourceを統合できるku.vim Ver.0.3というものが開発されていて、私も以前使っていたのですが、最近は更新されていないので残念です。 unite.vimは筆者が開発したプラグインで、今までのanything系プラグインを統一することを目指しています。 Vimの補完を使わず自前で検索などを実装していること、Normal mode/Insert modeの両方に対応、sourceの統一、豊富なカスタマイズ、複数候補のマークが特徴です。 sourceを追加すればタグ検索も可能です。最近までマイナーでしたが、徐々にユーザーの数が増えてきています。

dired.el, wdired.el≒netrw, vimfiler

dired.elはEmacsに標準で添付されているファイラーです。 必要十分な機能は揃っていて、情報も多いので人気があります。 ただし、設定しないと標準では使いづらいです。 Vimに標準添付のファイラーとしては、netrwというものがあり、:Exploreで立ち上げることができます。 こちらもシンプルなファイラーで、kanaさんのように普段から愛用する人もいるようです。 しかしファイル操作という観点からいうと、netrwは使いにくいです。 ディレクトリ毎にバッファが残ってしまうのも難点で、私は好きじゃありません。 よって、私が開発したのがvimfilerです。 Windowsで有名な二画面ファイラーである、あふのような操作感を目標にしています。 二画面ファイラーですが、一画面でも普通に使えます。 ただしnetrwに実装されている、リモートファイルや圧縮ファイルのアクセスはまだ実装されていません。 ネットワークドライブへのアクセスは可能です。

eldoc.el≒echodoc

eldoc.elはエコーエリアに関数の引数を表示させることができるプラグインです。 これと同様なものとして、私はechodocを開発しました。 現在neocomplcacheが対応しています。 eldocのように対応プラグインが自由に機能を追加できるのですが、難点として、まだドキュメントがありません。

org-mode.el≒howm-mode.vim, QFixHowm, VimOrganizer

org-modeはEmacs用のドキュメント編集環境です。あの「るびきち」さんがEmacsテクニックバイブルの執筆に使っていたほどの機能を持ちます。 メモ書きだけなら、howm-mode.vimというものがあります。QFixHowmはより高機能のようです。howm-mode.vimは更新が止まっていますが、QFixHowmはまだメンテナンスされています。 長らく、Vimにはorg-modeのようなものは存在しなかったのですが、最近になりVimにおけるorg-modeクローンが現れました。それがVimOrganizerです。 このヘルプを見れば分かるとおり、かなり高機能のようです。

auto-complete.el≒AutoComplPop, neocomplcache

Emacsの自動補完としては、m2ymさんが開発したauto-complete.elが有名です。これはどうやら、Vimの補完ウインドウを参考にして作られたようです。 Vimで対応するプラグインとしては、AutoComplPopneocomplcacheが挙げられます。 これらの詳細については、他のHacksで散々やってきたのでここでは触れません。

shell-mode.el, comint-mode.el, eshell-mode.el ≒vimproc, vimshell

shell-mode.elはEmacs内でシェルを起動するプラグイン、eshell-mode.elはEmacsでシェルを模倣するプラグイン、comint-mode.elは外部インタプリタと通信するプラグインです。 eshell-mode.elは外部シェルに依存しないため、貧弱なシェルしかないWindowsでも使えます。 残念ながら、Vimにはshell-mode.elに相当するようなものはありません。 しかし、eshell-mode.elに相当するvimshellがあるので代用できます。当然外部のシェルに依存しないので、Windows環境でも動作します。 iexeコマンドや:VimShellInteractiveを使うとシェルを起動することもできます。 vimprocは外部コマンドと通信するためのプラグインです。コマンドラインのパーサを内蔵しており、vimshellが依存しています。 Windows環境でも動作しますが、使用するためにはコンパイルが必要です。

ansi-term.el, multi-term.el ≒Conque, vimshell

ansi-term.elやmulti-term.elはEmacs内で端末を模倣するプラグインです。 シェルプログラムを起動することで、shell-mode.elの代わりになります。 動作はあまり高速ではありませんが、根強い人気があるようです。 Vimで動作する端末のプラグインとしては、Conquevimshellが挙げられます。 Conqueは端末を模倣するためのプラグインです。EmacsやVimが内部で動作するなど、それなりに完成度が高いです。 ただし、プラグインの構造はごちゃごちゃしています。動作にはPythonインタフェースが必要で、Windowsでは動作しません。 vimshellは本来シェルを模倣するプラグインですが、端末機能を内蔵しているため、texeコマンドを用いてcursesプログラムを実行することができます。 ただし、まだ動作は不完全です。 Windowsでtexeを動作させるためには、fakecygptyとCygwinのインストールが必要です。 詳しくはヘルプを参照してください。

Shougo

Hack #169: neocomplcacheを拡張する 後編

前編からかなり間が空いてしまいましたが、ここではneocomplcacheのプラグインの記述方法を解説します。neocomplcache Ver.5.1ではプラグインの構成がかなり変化したので、この記事を参考にしてください。

プラグインの仕様

プラグインはautoload/neocomplcache/sourcesにインストールしたものが自動的に読み込まれます。 プラグインには、neocomplcache#sources#プラグイン名#define()が絶対必要です。 これはneocomplcacheが初期化するときに呼ばれ、neocomplcacheにディクショナリ変数を渡します。 ここではディクショナリ変数に必要な要素について説明をします。

name

プラグインの名前です。

kind

プラグインの種類を現します。plugin, ftplugin, complfuncの三種類があります。これらの違いについては後述します。

filetypes

ftpluginにのみ存在します。どのファイルタイプで補完するかを表すディクショナリ変数です。

initialize()

プラグインの初期化時に呼ばれます。コマンドの登録等を行います。ftpluginの場合、これが呼ばれるのはfiletypesに対応するバッファで補完されたときです。

finalize()

neocomplcacheの無効化されるときに呼ばれます。ここで不要になったコマンドやautocmdを削除します。

get_keyword_list(cur_keyword_str)

pluginにのみ存在します。a:cur_keyword_strにマッチするリストを返すために呼ばれる関数です。get_keyword_list()が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。

get_keyword_pos(cur_text)

ftpluginとcomplfuncに存在します。cur_textにマッチする補完位置を返します。

get_complete_words(cur_keyword_pos, cur_keyword_str)

ftpluginとcomplfuncに存在します。a:cur_keyword_strにマッチするリストを返すために呼ばれます。get_complete_words()が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。詳しくは「補完リストの仕様」の項を参照してください。

補完リストの仕様

get_keyword_list()get_complete_words()が返す補完リストは、特定のキーを含むディクショナリのリストとなっています。一部のキー以外はVim標準の補完で使用するものと同じです。

word, abbr, menu, info, icase, dup

Vim標準の補完で使用するものと同じです。word以外は省略することができます。詳しい解説は、[Hack #14: ]Insert mode補完 自作編を参照してください。 menuはどのプラグインの候補で補完しているかを[B]のような記号で表す習慣になっています。ftpluginは[vim]や[ghc]のように、長めの文字列を使います。

プラグイン用ヘルパ関数

autoload/neocomplcache.vimには、プラグインから呼び出せるようにヘルパ関数が実装されています。ここでは、よく使われる関数について解説します。

neocomplcache#keyword_filter(list, cur_keyword_str)

get_keyword_list()で使用できる、単純なフィルターです。a:listの中から、a:cur_keyword_strにマッチするリストを返します。filter()とは違って、listは変更されるとは限りません。

neocomplcache#unpack_dictionary(dict)

リストの辞書をリスト化して返します。

neocomplcache#unpack_dictionary_dictionary(dict)

辞書の辞書をリスト化して返します。

neocomplcache#keyword_escape(cur_keyword_str)

a:cur_keyword_strをマッチングに使えるようにエスケープします。

neocomplcache#get_cur_text()

現在のカーソル文字列を取得します。

neocomplcache#get_completion_length(plugin_name)

plugin_nameの自動補完する文字列長を返します。

neocomplcache#set_completion_length(plugin_name)

plugin_nameの自動補完する文字列長を設定します。ただし、これはプラグイン側で初期値を設定するためのもので、ユーザーが補完文字列長を設定している場合、そちらが優先されます。

neocomplcache#get_keyword_pattern_end(filetype)

文字列の最後にマッチするfiletypeのキーワードパターンを返します。filetypeは省略可能で、省略すると現在のバッファのfiletypeを参照します。

neocomplcache#get_keyword_pattern(filetype)

文字列にマッチするfiletypeのキーワードパターンを返します。filetypeは省略可能で、省略すると現在のバッファのfiletypeを参照します。

neocomplcache#is_auto_complete()

自動補完の時に1を返します。

neocomplcache#print_caching(string)

キャッシュ時のメッセージを表示します。

neocomplcache#print_error(string)

エラーメッセージを表示します。

キャッシュ用ヘルパ関数

autoload/neocomplcache/cache.vimには、プラグインから呼び出せるキャッシュのヘルパ関数が含まれます。 量が多いので、ここでは詳しく説明することは避けますが、うまく利用すると簡単にキャッシュを使ったプラグインを記述できます。 ちなみに、neocomplcache Ver.4以降では、ほとんどのプラグインがキャッシュ用ヘルパ関数を使うように書き直されています。

プラグインのサンプル

neocomplcacheに標準添付のプラグインを参考にしても良いのですが、機能が複雑化しているため、プラグイン作りの勉強のために見るのは大変です。 eagletmtさんが作成したghc_completeはfiletype pluginでほどよい長さなので、勉強に最適でしょう。

plugin, ftplugin, complfuncの違い

neocomplcache Ver.3.00より、complfuncが実装され、より自由度の高い補完が実装できるようになりました。 pluginとcomplfuncの違いは、pluginはカーソル前のキーワードから補完しますが、complfuncは独自に補完位置を決定できるというところです。 ftpluginとはneocomplcacheのオムニ補完です。 基本的な仕様はcomplfuncと同じです。ただし、必要な時にのみ初期化や呼び出しされるというところが違います。

Shougo

Hack #165: neocomplcache Hacks(6) インクルード補完

今回はインクルード補完です。neocomplcacheに実装されたインクルード補完はあらかじめ設定しておく必要がありますが、使いこなせばタグ補完を越えた使い勝手となります。

インクルード補完とは

インクルード補完とは、バッファ中のインクルード文を解析して、補完候補に加える補完のことです。Vim自体にもインクルード補完が備わっていますが、Perlなど'path'が多数のディレクトリに設定されている言語では重すぎて使いものになりません。neocomplcacheのインクルード補完は結果をキャッシュすることで、Vim標準のインクルード補完に存在する欠点を補うために開発されました。タグ補完と比較すると、インクルードしているファイルだけ解析するので補完候補が多すぎる問題が発生しにくい、あらかじめタグファイルを生成する必要がない、といった利点があります。

インクルード補完の制限

インクルード補完は強力ですが、万能ではありません。'path''includeexpr', 'include'といったオプションが適切に設定されている必要があります。特にWindows環境では、ftpluginなどで設定する必要があるかもしれません。インクルード補完ではctagsを利用するので、システムにインストールされている必要があります。ctagsが存在しなかったり、ctagsに対応していない言語の場合(D言語など)はバッファをそのまま解析するので、buffer_completeと動作が同じになります。

今後のインクルード補完

現在実装されているインクルード補完はまだ実験的な意味合いが強いです。 今後は、gtagsへの対応やechodocへの対応、遅延キャッシュなどを考えています。 ただしgtagsはカレントディレクトリにタグファイルを作るらしく、ctagsのように簡単に解析するのは難しそうです。

参考文献

neocomplcache.vim のインクルード補完の使い方 thincaさんのインクルード補完解説記事。neocomplcache Ver.3.06を対象としていて、neocomplcache Ver.5.0がリリースされた現在では変数名等が古くなっていますが、参考になると思います。

Shougo

Hack #139: screenのカレントディレクトリにcdする

問題

screen+zshで別スクリーンのカレントディレクトリに簡単にcdできるcddというzshスクリプトがあります。

cdd依存者はこれをvimでも使いたいと思った人は何人もいるかと思います。

解決

cdd.vimを使います。

まずcdd.vimをインストールし、:Cdd {スクリーン番号}を実行することで、 そのスクリーンのカレントディレクトリにcdできます。

使いやすくする

通常では:CddはCをShift-Cで入力しなければならず、非常に小指破壊的です。

そのため、cabbrevで略称を登録すると非常に快適になります。

以下を.vimrcに追記することにより、:cddと入力しスペースを入れると自動的に:Cddに変換されます。

cabbrev Cdd cdd

To-Do

  • vimからcddに登録できるようにする

参考

Sora Harakami

Home > Tags > plugin

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top