如何在vimrc中定义自定义弹出窗口/菜单


19

将每个有用的功能分配给键对于经常使用的工具来说效果很好,但是我很少使用某些操作,因此我宁愿将它们分配给my中定义的某些弹出菜单vimrc

我见过像CtrlP这样的插件会打开一个弹出列表,因此应该可以实现。

所以我的问题是:

如何定义可以运行各种命令的自定义弹出菜单?


注意:这也应该在终端中运行。

X11上的CtrlP插件或dmenu之类的东西很理想,您可以在键入时细化选项,但是另一种菜单也很有用。

Answers:


11

开箱即用的工作需要大量工作,但是我认为您可以使用Unite.vim插件来做一些简单明了的事情。它提供了一个集成界面,用于从各种来源创建菜单。(实际上,有些人甚至用Unite代替了CtrlP。)Unite文档中的此示例(或在:help g:unite_source_menu_menus安装Unite后查看)详细介绍了如何创建基本的命令菜单。

根据该文档,我提出了一个简单的示例,其中提供了命令菜单。出于演示目的,我使用打开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选项,以使菜单以缩小模式(如模糊搜索)开始。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.