Vim 是否有在输入命令时触发的触发器或事件?

Does Vim have a trigger or event which is fired whenever a command is typed?

Vim 中是否有某种触发器或事件在执行 Vim 命令时触发?

例如。假设我执行 tabnextNERDTree 是否有一些功能可以设置为侦听所需的事件并在检测到这些事件时执行某些操作?

Vim 有一个叫做 "autocommands" (:help autocmd-intro) 的东西。这些允许您在保存文件或更改为不同的 window.

等事件时执行任意代码

不幸的是,据我所知,没有为任何命令执行的自动命令。不过,也许可以做一些不同的事情:

cnoremap <silent> <cr> <cr>:call <SID>CommandCallback()<cr>

function! s:CommandCallback()
  let last_command = @:

  if last_command =~ 'tabnew'
    echomsg "Tabnew was called"
  endif
endfunction

此代码在命令行模式下覆盖<cr>键("carriage return"、"enter"键)按<cr>然后调用函数s:CommandCallback.您可以使用 @: 魔术变量或使用 histget (:help histget()) 检查命令行历史记录中的最后一个命令。然后你可以检查命令并用它做任何你喜欢的事情。

编辑:对"do whatever you like with it"

的一些阐述

如果你想在状态行中看到一些状态消息,你可以设置一个全局变量的值,比如 let g:command_message = 'Tabnew was called'。然后,您可以使用 %{g:command_message} 在您的状态行中呈现它。您需要阅读 :help statusline 以了解如何将其适合您的特定状态行,但这应该不难。

在单独的 window 中打开它会更棘手,因为您需要打开一个具有特定设置的临时缓冲区,检查是否已经存在,等等。这是完全可行的,但这是一个很长的话题。我有一个可能有用的插件,但不确定它是否适合这个:https://github.com/AndrewRadev/bufferize.vim. You could also check out this plugin: https://github.com/mtth/scratch.vim。您需要进行试验,看看其中的任何一个是否适合您的用例,或者您可以查看它们的源代码,并尝试学习如何自己管理 window(这将是一项有用的技能有,所以我绝对会推荐它 :)).