ソフトウェアとハードウェアの境界

ホビー開発に関する誰得情報満載☆

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()

こんなテキストファイルを用意して、vimで開いてみる。

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の起動コマンドを変更するといい。