ルモーリン

Vimの自作コマンドにオプション補完

投稿:2018-08-10

作ったVimScriptで自作のコマンドからメニューを選択して実行できるようにしました。 以前書いた記事です→Vimscirptでプラグインを作ってみた
このコマンドを入力する際にオプションを指定できればメニューの選択が不要だし、オプションを補完できればタイプしなくて良いなと考えるようになりました。

今回はこのコマンドにオプションとその補完を追加します。 コマンドを実行すると メニューが表示されて選択できます。

自作コマンドを追加する処理で補完関数を指定します。 それと自作コマンドPpmodMenuを実行した時に関数ppmod#Menuへオプションを渡します。

command! -nargs=? -bar -complete=custom,ppmod#PpmodMenuComplete PpmodMenu call ppmod#Menu(<f-args>)

補完関数を定義します。 今回は固定のオプション一覧から選択させるので常に同じ改行区切りの文字列を返します。 この「補完関数が改行区切りの文字列を返せば良い」と言うのが、ヘルプにも、検索ヒットしたブログのいくつかにもないので試行錯誤したよ。

function! ppmod#PpmodMenuComplete(ArgLead, CmdLine, CusorPos)
	return "New\nEdit\nCompile\nUpload\nCopyJpeg\n"
endfunction

関数がオプションを受け取るようにします。 「...」で可変長引数になり、「a:0」で個数チェック、「a:1」で1個目の引数を参照します。

function! ppmod#Menu(...)
	if 0 == a:0
		let MenuSelected = inputlist(['PPMODメニュー', '1. ページを作成', '2. ページを編集', '3. コンパイル', '4. アップロード', '5. 画像コピー'])
	else
		let MenuSelected = a:1
	endif
	if 'New' == MenuSelected || 1 == MenuSelected
		call New()
	elseif 'Edit' == MenuSelected || 2 == MenuSelected
		call Edit()
	elseif 'Compile' == MenuSelected || 3 == MenuSelected
		call Compile()
	elseif 'Upload' == MenuSelected || 4 == MenuSelected
		call Upload()
	elseif 'CopyJpeg' == MenuSelected || 5 == MenuSelected
		call CopyJpeg()
	endif
endfunction

コマンド名をタイプする時も「ppm+タブ」でppmで始まるコマンド2個が補完候補に挙がります。 今回、修正したPpmodMenuを選択します。 オプションを指定するのでスペースを入力します。 ここでタブを入力するとオプションの一覧が表示されて補完できます。 補完は便利にできているので、例えばオプションの後ろのほう、Uploadを選択するのが面倒になりません。 オプションの1文字目「u」だけを入力して 更にタブを入力するとuで始まるUploadだけが補完されて、即実行できます。 補完のことを考えていなかったのでCompileとCopyJpegの頭文字を一緒にしちゃった。 将来、別のコマンドを作る時はコマンド名やオプションの頭文字が重複しないように工夫しよう。