Vimのmakeで任意の名前のMakefileを指定する

はじめに

Vimmakeコマンドは便利ですが、任意の名前のMakefileをオプションで指定できそうもありません (カレントディレクトリのMakefileを探しにいきます)。
そのため所属するプロジェクトでMakefileの格納先ディレクトリや命名規則が規定されている場合は不便です。

そこで本エントリではこの問題の解決策をまとめます。

問題

Cobolプログラムで説明します。
次に示す例では、cobファイルとMakefileを格納しているディレクトリが異なり、 Makefileには<PROGRAM-ID>.makといった名称をつけるルールが定められています。

$ tree
.
├── make
│   └── hello.mak
└── source
    └── hello.cob

hello.cob

       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       PROCEDURE DIVISION.
       MAIN SECTION.
           DISPLAY 'HELLO WORLD!!'.
           STOP RUN.

hello.mak

hello.o    :    hello.cob
  cobc -x --free hello.cob

このような環境においてhello.cobVimで編集中にmakeしたい時、../make/hello.makを指定する方法を考えます。

対応策

ただ単にmakeしたいだけであれば、:!make -f <makefile_name>を実行すれば良いです。
しかしこの場合、Quickfixリストが機能しないため良い解決策とは言えないでしょう。

そこでmakeprgを使用します。
makeprgを使用することで:makeを実行した時に発行されるコマンドを任意に設定することができます。

次の設定を.vimrcに追加します。
ノーマルモードでF5を押下した時にCBLCOMP関数を呼び出す(1行目)
makeprgmake -f ../make/<cob_file_name>.makを組み立てて設定(4行目〜8行目)
makeコマンドを実行(9行目)

.vimrc

001 nnoremap <F5> :call CBLCOMP()<CR>
002 
003 function! CBLCOMP()
004  let &makeprg='make -f '
005  let &makeprg.=expand('%:p:h:h')
006  let &makeprg.='/make/'
007  let &makeprg.=expand('%:t:r')
008  let &makeprg.='.mak'
009  exec ':make'
010 endfunction

これで、Vim上でF5を押すだけで編集中のプログラムに対応したMakefileを指定してmakeを実行し、make結果をQuickfixリストで確認できるようになりました。

f:id:hiroki-sawano:20180501235608p:plain
makeで構文エラーを検出した場合