vimrcでカスタムポップアップ/メニューを定義する方法


19

便利な機能をすべてキーに割り当てることは、頻繁に使用するツールではうまく機能しますが、使用する操作はほとんどないため、で定義されたポップアップメニューに割り当てることをお勧めしますvimrc

CtrlPのようなプラグインがポップアップリストを開くのを見てきたので、これが可能になるはずです。

だから私の質問は:

さまざまなコマンドを実行できるカスタムポップアップメニューを定義する方法は?


注:これも端末で実行する必要があります。

X11のCtrlPプラグインやdmenuのようなものが理想的です。入力するときにオプションを調整できますが、別の種類のメニューも便利です。

回答:


11

すぐにこれを行うにはかなりの作業が必要になりますが、Unite.vimプラグインを使用してかなり簡単に何かを行うことができると思います。さまざまなソースからメニューを作成するための統合インターフェイスを提供します。(実際、CtrlPをUniteに置き換えたものもあります。)Uniteのドキュメントのこの例(または:help g:unite_source_menu_menusUniteをインストールしたら、をご覧ください)では、コマンドの基本メニューの作成方法について詳しく説明しています。

そのドキュメンテーションに続いて、コマンドのメニューを提供する簡単な例を思いつきました。デモンストレーションのために、(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オプションを追加しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.