我想在创建特定文件类型的新文件时运行一些vim命令,这是BufNewFile
和FileType
自动命令事件的组合。
我在filetype.vim中设置了BufNewFile
自动命令,以根据文件扩展名设置文件类型,但我有多个扩展名,它们都对应于同一文件类型。我想将关于哪些文件扩展名对应于特定文件类型的信息封装在这个地方,然后让其他自动命令仅基于该文件类型运行。但是,我不能只使用FileType
事件,因为我只想为新文件执行命令,而不是在编辑现有文件时执行命令。
例如,在filetype.vim中,我有:
au BufRead,BufNewFile *.cir setfiletype spice
au BufRead,BufNewFile *.sp setfiletype spice
au BufRead,BufNewFile *.spice setfiletype spice
我想也许我可以在这个文件类型的ftplugin文件中添加一个BufNewFile
自动命令,如下所示:
echo "Spice file."
au BufNewFile <buffer> echo "New spice file!"
但是,当我创建一个新文件,例如"test.cir"时,它不会运行auto命令。它在ftplugin文件中运行其他命令(例如,我得到的是"Spice file."echo(,但不是自动命令。
或者,如果在vimscript中有某种方法可以判断文件是否是新的,那么我可以直接在ftplugin中运行命令,条件是它是否是新文件。
ftplugin文件中的BufNewFile
自动命令不起作用,因为事件顺序错误。BufNewFile
触发FileType
,而不是相反。
您可以将au BufRead,BufNewFile
拆分为两个单独的命令,并在第一个命令中设置缓冲区本地变量b:isNew
。
但我认为在你的ftplugin中检查文件是否是新的确实是最简单的。由于这取决于编辑后的文件是否已经存在于磁盘上,因此应该使用一个简单的条件:
if filereadable(expand('%'))
" BufRead
else
" BufNewFile
endif
以下自动命令应该足以根据这三个扩展设置文件类型:
autocmd BufRead,BufNewFile *.{cir,sp,spice} setlocal filetype=spice
一旦执行了该自动命令,就会触发FileType
事件,并且Vim知道您正在编辑文件类型为spice
的文件:您可以在~/.vim/ftplugin/spice.vim
:中自由放置您想要的任何花哨的选项/映射
setlocal tabstop=23
nnoremap <buffer> <F7> :echo "Woot!"<CR>
不过,有些事情还不清楚:当你创建一个"香料"缓冲区时,你想执行一个特定的操作,还是不清楚如何定义你的文件类型?