有没有一种方法可以映射插件特定的键以在 Vim 中执行多个键?

Is there a way to map plugin specific keys to do multiple keys in Vim?

我想映射 NERDTree 的选项卡打开键 't',以执行多项操作。也就是说,我希望它打开选项卡,然后执行以下命令列表:TlistToggle Ctrl W、Ctrl T、Ctrl W、Shift K、30、Ctrl W、减号。所以我打开文件的标签列表,然后水平拆分列表和文件,然后调整标签列表的大小。

我试过以下方法:

nnoremap <t> NERDTree-t TlistToggle <C-W><C-T><C-W><S-K>30<C-W> -

但这似乎没有任何作用。

想法?我只是完全做错了吗?这甚至可能吗?

  • NERDTree 映射不是全局映射,它只存在于(并且有意义)在插件的侧边栏中。这使得它更难覆盖,但是你可以挂钩到 NERDTree 设置它的 'filetype',然后定义一个 buffer-local 映射来覆盖 NERDTree 的:

    :autocmd 文件类型 nerdtree nnoremap t ...

  • 虽然 normal 模式命令(如 <C-w>... 东西)确实可以连接,但对于插件调用而言并非如此。您可以通过 :nmap <buffer> t:

    找到 NERDTree's

    :调用 nerdtree#invokeKeyMap("t")

Taglist 也是一个 Ex 命令;您可以将两者与 | 结合使用(在映射中写为 <Bar>):

:call nerdtree#invokeKeyMap("t")<Bar>TlistToggle<CR>

所以,像这样的东西应该可以工作(我没有测试):

:autocmd FileType nerdtree nnoremap <buffer> t :call nerdtree#invokeKeyMap("t")<Bar>TlistToggle<CR><C-W><C-T><C-W>K30<C-W>-

这是我用来在 NERDTree 的新选项卡中打开文件然后拆分文件和调整文件大小 & TlistToggle 的最终解决方案:

autocmd FileType nerdtree nnoremap <buffer> t :call nerdtree#ui_glue#invokeKeyMap("t")<CR> :TlistToggle<CR> <C-w><C-t><C-w>K :exe "resize " . ((winheight(0) + winheight(1)) * 3/20)<CR>

这会将在水平选项卡中打开的标签列表的大小调整为整个 window 中总行数的 15%。