vimrc
中定义的某些弹出菜单。我'我见过像CtrlP这样的插件会打开一个弹出列表,所以这应该是可能的。
所以我的问题是:
如何定义一个可以运行各种命令的自定义弹出菜单?
注意:它也应该在终端中运行。
X11上的CtrlP插件或dmenu之类的东西是理想的,您可以在键入时优化选项,但也可以使用其他菜单。
#1 楼
开箱即用的方法需要大量工作,但是我认为您可以使用Unite.vim插件来做一些简单明了的事情。它提供了用于从各种来源创建菜单的集成界面。 (实际上,有些人甚至用Unite代替了CtrlP。)Unite文档中的此示例(或在安装Unite后查看:help g:unite_source_menu_menus
)详细说明了如何创建命令的基本菜单。遵循该文档,我提出了一个简单的示例,其中提供了命令菜单。出于演示目的,我使用打开NERDTree的命令进行了设置(来自NERDTree插件),显示了git怪(来自fugitive.vim插件),并在项目中对TODO进行grepping(使用内置的
: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
选项,以使菜单以缩小模式(例如模糊搜索)。