如何在 vim 自动命令中连接组中的变量和地址中的名称?

如何在 vim 自动命令中连接组中的变量和地址中的名称?

我正在尝试在 vim 上创建自动标题功能,为任何文件类型 c、php、python 等生成自动标题,并且我只在文件夹 ~/.vim 中创建模板,但我想在变量中获取类型并发送到自动命令 BufNewFile 的组和地址。

类似这样的:

let type=expand('%:e')
au BufNewFile *. .type  so '~/.vim/.type._header.txt'

但是 vim 看不到变量之类的类型,而是看到字符串,有人有什么想法吗?

答案1

Vim 的求值规则与大多数编程语言不同。您需要使用:execute来求值变量(或表达式);否则,将按字面意思执行;即 Vim 使用变量名本身作为参数。

let type = expand('%:e')
execute 'au BufNewFile *.'  . type  'so ~/.vim/' . type . '_header.txt'

我可能会使用printf()而不是连接来提高可读性。

execute printf('au BufNewFile *.%s so ~/.vim/%s_header.txt', type, type)

请注意,使用你的方法,你基本上是在复制内置的文件类型检测,它已经提供了文件扩展名到类型的映射。我宁愿定义一个通用钩子到BufNewFile,然后评估&filetype。你只需要确保你的事件已定义用于文件类型检测的方法,例如将定义从移动~/.vimrc到脚本中~/.vim/plugin/

答案2

我认为你最好使用其中一个模板扩展插件。有很多,它们已经可以完成工作,甚至更多。

至于如何mu-template,我有一个au BufNewFile触发函数调用的,我只需使用&ft(而不是expand('%:e'))来选择正确的模板文件。

关于字符串操作,Ingo 已经指出您忘记从字符串中提取变量名称。即它应该是:

au BufNewFile * exe '0read ~/.vim/'.&ft.'_header.txt'

相关内容