選択肢からコマンドを選んで実行する

Intro

新しいPluginを入れてもコマンドやキーバインドが覚えきれないので、
あらかじめ用意して選択肢から実行出来るようにする。
選択肢から実行するための関数として、inputlistがあるので使用する。(詳細は、:h inputlist)

Contents

.vimrcでも何処でも良いので以下を記載する。

let g:scc = {}
" sample
let g:scc.unite = [
	\ ['Sample Uniteの選択リスト', ''],
	\ ['> File', 'Unite file'],
	\ ['> Find', 'Unite find'],
	\ ['> Dir', 'Unite direcotry']]

function! SelectCmd(key)
	let a:viewlist = []
	let a:idx = 0
	let a:input = 0
	let a:slist = g:scc[a:key]
	let a:head = ''

	while a:idx < len(a:slist)
		if a:idx == 0
			call add(a:viewlist, a:slist[a:idx][0])
		else
			execute 'let a:head = printf("[%-' . strlen(len(a:slist)) . 's]", a:idx)'
			call add(a:viewlist, a:head . ' ' . a:slist[a:idx][0])
		endif
		let a:idx = a:idx + 1
	endwhile

	let a:input = inputlist(a:viewlist)
	echo "\n"

	if a:input < 1 || a:input > len(a:slist)
		echohl ErrorMsg
		echo 'Selected-Number('.a:input.') is range over.(0-' . (len(a:slist) - 1) . ')'
		echohl None
		return
	endif

	echohl MoreMsg
	echo '> ' . a:slist[a:input][1]
	echohl None

	execute a:slist[a:input][1]
endfunction

command! -nargs=1 SelectCmd 
	\ call SelectCmd(<q-args>)

実行する

:SelectCmd unite

サンプルの実行結果

自分で好きな選択肢を作りたい場合、下記形式で追加する

let g:scc.[任意のa-z,A-Z,0-9,_(アンダースコア)] = [
	" 第1要素は、表示される文字列
	" 第2要素は、選択時に実行されるコマンド(例> :ls, :h inputlist,など)
	" このサンプルだと> Fileを選択した場合、:Unite fileが実行される
	\ ['Sample Uniteの選択リスト', ''], " 説明文
	\ ['> File', 'Unite file'],         " 選択肢1
	\ ['> Find', 'Unite find'],         " 選択肢2
	\ ['> Dir', 'Unite direcotry']]     " 選択肢3
	" 何個でも良い。

inputlistからinputlistを呼び出すことも出来る

" Sample
let g:scc.unite = [
	\ ['Sample Uniteの選択リスト', ''],
	\ ['> File', 'Unite file'],
	\ ['> Find', 'Unite find'],
	\ ['> Dir', 'Unite direcotry'],
	\ ['> SampleCmd MRUから選択', 'SelectCmd mru']]
let g:scc.mru = [
	\ ['Sample MRUの選択リスト', ''],
	\ ['> ファイルのMRU', 'MRUFile'],
	\ ['> フォルダのMRU', 'MRUDir'],
	\ ['> NetrwのMRU', 'MRUHistory']]

inputlistからinputlistを呼び出すサンプルの実行結果