如何为 &packpath 中的任何文件设置 Vim autocmd?

How to set a Vim autocmd for any file in &packpath?

我需要设置一个自动命令,在写入 vim 的 &packpath(及其子目录)中的任何文件后执行。 鉴于 &packpath 是许多目录的列表,我将如何去做?我不太了解vim脚本,如果这是一个简单的问题,请原谅。

我试过:

autocmd BufWritePost &packpath/* [command here]

但这不起作用。

如何做到这一点?

您的问题分为两部分。

第一部分是关于在 Ex 命令中使用表达式,第二部分是关于构建正确的自动命令模式。

在 Vim 中,表达式是任何必须求值才能产生值的东西。在这种情况下,&packpath 是一个表达式,其计算结果生成以下形式的字符串:

dirA,dirB,dirC

虽然大多数 Ex 命令都需要字符串,而不是表达式,但解决这个“问题”的经典方法是使用 :help :execute:

execute 'autocmd BufWritePost ' .. &packpath .. ' echomsg "Hello."'

将这些字符串和求值表达式连接成适当的自动命令:

autocmd BufWritePost dirA,dirB,dirC echomsg "Hello."

那...什么都不做,因为我们还有第二部分要处理。

:help file-pattern 所示,自动命令“模式”很像您在 shell 中习惯使用的通配模式,带有少量正则表达式。就像在您的 shell 中一样,“&runtimepath 中任何目录下的任何 Vim 文件”的正确“模式”是:

{dirA,dirB,dirC}/*.vim

和“&runtimepath 中任何目录下的任何 Vim 文件,递归地”的那个将是:

{dirA,dirB,dirC}/**/*.vim

让我们调整我们的命令:

execute 'autocmd BufWritePost {' .. &packpath .. '}/**/*.vim echomsg "Hello."'

每次我们在 &runtimepath.

中的某处写入文件时,确实会令人讨厌地打印 Hello.