我正在尝试在 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'