すぐにこれを行うにはかなりの作業が必要になりますが、Unite.vimプラグインを使用してかなり簡単に何かを行うことができると思います。さまざまなソースからメニューを作成するための統合インターフェイスを提供します。(実際、CtrlPをUniteに置き換えたものもあります。)Uniteのドキュメントのこの例(または:help g:unite_source_menu_menus
Uniteをインストールしたら、をご覧ください)では、コマンドの基本メニューの作成方法について詳しく説明しています。
そのドキュメンテーションに続いて、コマンドのメニューを提供する簡単な例を思いつきました。デモンストレーションのために、(NERDTreeプラグインから)NERDTreeを開き、(fugitive.vimプラグインから)git blameを表示し、プロジェクトのTODOをgrepする(組み込みを使用して)コマンドでセットアップしました:grep
。でメニューを開くマッピングを定義しました<Leader>c
。
# Initialize Unite's global list of menus
if !exists('g:unite_source_menu_menus')
let g:unite_source_menu_menus = {}
endif
# Create an entry for our new menu of commands
let g:unite_source_menu_menus.my_commands = {
\ 'description': 'My Commands'
\ }
# Define the function that maps our command labels to the commands they execute
function! g:unite_source_menu_menus.my_commands.map(key, value)
return {
\ 'word': a:key,
\ 'kind': 'command',
\ 'action__command': a:value
\ }
endfunction
# Define our list of [Label, Command] pairs
let g:unite_source_menu_menus.my_commands.command_candidates = [
\ ['Open/Close NERDTree', 'NERDTreeToggle'],
\ ['Git Blame', 'Gblame'],
\ ['Grep for TODOs', 'grep TODO']
\ ]
# Create a mapping to open our menu
nnoremap <Leader>c :<C-U>Unite menu:my_commands -start-insert -ignorecase<CR>
これをにコピーしてvimrc
、配列で定義されたコマンドのリストを編集できますg:unite_source_menu_menus.my_commands.command_candidates
。配列の各項目は、形式の配列です[Label, Command]
。
私の例でmy_commands
は、メニューを識別するために選択した名前でした。好きな名前を使用できます。
お役に立てれば!
編集:絞り込みモード(ファジー検索など)でメニューを開始するためのマッピング-start-insert
と-ignorecase
オプションを追加しました。