vimでプロジェクト管理風味 NERDTreeを使って
なんかシンプルにプロジェクト管理したい
僕はその昔、仕事で出会った「PeggyPro」という非常に非常に使いやすいテキストエディタを、vimに隠れながら愛用していた。僕はsubversionは使ったことがないので、その機能は使わなかったが、そんなことは抜きにしてPeggyProは偉大であった。
非常に見やすく操作しやすいプロジェクト管理、検索置換もお手の物、TAGSを作れば定義へジャンプしてくれるし、痒いところに手が届くASCIIコード表も搭載、プロジェクト内の.batもコンテキストメニューから実行できて、makeの出力はoutputペインに表示され、もちろんコンパイルエラー部へのジャンプも可能。
IDEとしてではなく、テキストエディタとして、シンプルで非常に使いやすかった。
残念ながらPeggyProは、株式会社エスコアハーツのソフトウェア事業の縮小に伴い、2014-05-30を持って、提供を停止してしまった。
しかし、悲しんでばかりはいられない。
僕達は、前に進むべきなんだ。
(そう、ここはそういうジョークだ。)
ということで、gvimでもそんなことができないかと思い、いろいろと試行錯誤してみた。
NERDTreeというPlugin
vimでプロジェクト管理ができる有名なPluginとして、「project.vim」が挙げられる。
しかし、あえてこれは使用しない。
実際使用してみたのだが、なんかしっくりこない…。
もっとシンプルに軽ぅーい気持ちでプロジェクト管理っぽいことをする方法がないかと調べてみた。
そこでNERDTreeに出会った。
「NERDTree」はvimでファイルシステムを検索して、ファイルやディレクトリを開くことができるPluginだ。
vimは標準でnetrwというファイルエクスプローラが含まれているようだが、それよりも高機能なものだと思われる。
neobundleでPluginを追加する方法もあるようだが、僕は上記のページからzipをダウンロードして解凍してruntimepathを通している。
プロジェクトファイルっぽいファイルから指定ディレクトリを開く
こんなスクリプトを.vimrcに書いてみよう。
let s:NerdtProject = "close" let g:NerdtPrjPath = "." " Nerdtreeを使用したプロジェクトのパスを変更 function! ProjectPathSet(path) let g:NerdtPrjPath = a:path exec ":set tags=./tags,tags," . g:NerdtPrjPath . "/tags" endfunction " プロジェクトパスを指すNERDTreeペインのトグル function! ToggleNerdtPrj() if has('win32') if "open" ==? s:NerdtProject let s:NerdtProject = "close" exe ":wincmd h" exe ":bd" else let s:NerdtProject = "open" exe ":cd " . strpart(g:NerdtPrjPath, 0, 3) exe ":NERDTree " . expand(g:NerdtPrjPath) endif else if "open" ==? s:NerdtProject let s:NerdtProject = "close" exe ":bd" else let s:NerdtProject = "open" exe ":NERDTree " . expand(g:NerdtPrjPath) endif endif endfunction " make function! MakeFunc(dir) if(a:dir != "") exec ":cd " . a:dir endif pwd let target=input("input target: ") if(target != "") execute ":make " . target else make endif endfunction " プロジェクトパス表示 function! ShowPrjPathFunc() echo g:NerdtPrjPath endfunction " プロジェクトファイルをオープン function! PrjOpen() let g:NerdtPrjPath=getline(1) call ToggleNerdtPrj() endfunction " NERDTreeのトグル nmap <silent> <C-r> :call ToggleNerdtPrj()<CR> imap <silent> <C-r> :call ToggleNerdtPrj()<CR> " .vimpjファイルを開いた時のautocommand au BufRead *.vimpj call PrjOpen() " 上記の関数をコマンドから呼ぶ command! -nargs=+ PrjPathSet call ProjectPathSet(<f-args>) command! PrjMake call MakeFunc(g:NerdtPrjPath) command! PrjPathShow call ShowPrjPathFunc()
prj.vimpj
/home/USERNAME/Document/Project/
これで、NERDTreeに上記のディレクトリが開かれた状態でvimがスタートする。
あくまでも「プロジェクト風味」である。
「風」でもない。
「っぽい感じみたいな」くらいに考えてもらえるとありがたい。
NERDTreeというPluginはどういうものか理解できている読者は声を揃えて、「指定したディレクトリ開いてるだけじゃん」と言うことはわかっているのだが、ファイルマネージャから直接一発で開きたいディレクトリをNERDTreeが開いてくれるということをしたかっただけです、すみません。
とりあえず、プロジェクトフォルダみたいなものを設定し、それを起点にしてNERDTreeを開くことがとりあえずできた。
もちろん、今後、このプロジェクト管理っぽい機能を対象に検索や置換、右クリックメニュー(コンテキストメニュー)なども追加していく所存である。
NERTreeペインのディレクトリ/ファイルパスの取得方法
以下のようにすると、NERDTreeペインに表示されているディレクトリやファイルのパスを取得できる。
function! PathGetNerdtree() let treenode = g:NERDTreeFileNode.GetSelected() let nerdtfilepath = treenode.path.str({'escape': 1}) echo nerdtfilepath endfunction " コンテキストメニュー(右クリックメニュー)から実行 nnoremenu 1.10 PopUp.実行(exe,bat) :call PathGetNerdtree()<CR>
これを利用することで、スクリプトを実行したり、選択ファイル内で検索したり、いろいろできるはず。
ちなみにLinuxでデフォルト状態のgvimの問題点
LinuxBean14.04でgvimをインストールすると、標準状態では以下の困った点があった。
- 右クリックでメニューが表示されない。
- Fcitx-Mozcで、インサート入力されない(文字入力中、未確定文字が、エディタ上に挿入されない)。
マウスの問題は以下を.vimrcで設定。
" 右クリックメニュー(コンテキストメニュー)を有効にする set mousemodel=popup_setpos
Fcitx-Mozcは、このページのmattnさん達の会話を読ませて頂いて、gvimの起動を「vim -gf」にて行うようにした。
LinuxBean利用者なら、[スタートメニュー]→[アクセサリ]→[メニューエディタ]なんかでgvimの起動コマンドを変更するといい。