Events Vim是否有一个触发器或事件,每当键入命令时都会触发该触发器或事件?

Events Vim是否有一个触发器或事件,每当键入命令时都会触发该触发器或事件?,events,vim,eventtrigger,Events,Vim,Eventtrigger,每当执行Vim命令时,Vim中是否会触发某种触发器或事件 例如,假设我执行tabnext或NERDTree是否有一些功能可以设置为侦听所需的事件,并在检测到这些事件时执行一些操作?Vim有一种称为“自动命令”(autocommands)的功能。这些允许您在保存文件或更改到其他窗口等事件时执行任意代码 不幸的是,据我所知,没有为任何命令执行的自动命令。也许可以做一些不同的事情,不过: cnoremap <silent> <cr> <cr>:call <SI

每当执行Vim命令时,Vim中是否会触发某种触发器或事件

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

Vim有一种称为“自动命令”(autocommands)的功能。这些允许您在保存文件或更改到其他窗口等事件时执行任意代码

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

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

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

  if last_command =~ 'tabnew'
    echomsg "Tabnew was called"
  endif
endfunction
cnoremap:callcommandcallback()
功能!s:CommandCallback()
让最后一个_命令=@:
如果最后一个命令=~'tabnew'
echomsg“Tabnew被调用”
恩迪夫
端功能
此代码覆盖命令行模式下的
键(“回车”,即“回车”键),按
,然后调用函数
s:CommandCallback
。您可以使用
@:
magic变量或使用
histget
()检查命令行历史记录中的最后一个命令。然后,您可以检查该命令并对其执行任何您喜欢的操作

编辑:关于“随心所欲”的详细说明

如果希望某些状态消息在statusline中可见,可以使用值设置一个全局变量,类似于
let g:command\u message='Tabnew was called'
。然后,您可以使用
%{g:command\u message}
在状态行中呈现它。您需要阅读
:help statusline
,以了解如何将其适应特定的statusline,但这并不困难


在一个单独的窗口中打开它会更加棘手,因为您需要打开一个具有特定设置的临时缓冲区,检查是否已经存在,等等。这是完全可行的,但这是一个相当长的话题。我有一个插件可能会有所帮助,但不确定它是否适用于此:。您还可以检查此插件:。您需要进行实验,看看其中是否有任何一个可以适合您的用例,或者您可以查看它们的源代码,并尝试学习如何自己管理窗口(这将是一项有用的技能,因此我绝对推荐:)。

您的示例中的所有行是否都包含在同一个脚本中,即包括cnoremap?是的,
s:CommandCallback
函数是脚本本地函数,因此需要从同一脚本调用它。您可以通过
:help s:
了解更多信息。当然,您不需要这样做,您可以使用
函数定义函数!CommandCallback()
并使用
调用它:调用CommandCallback
,但它将被全局定义。是否有某种方法将
echomsg
输出发送到其他窗口或其他状态行,这些信息始终可见,可能位于屏幕的某个设置区域,与哪个选项卡或窗口处于活动状态无关?我在答案中添加了更多信息。