Vim: BufNewFile autocmd 在文件类型插件中不起作用

Vim: BufNewFile autocmd does not work when inside filetype plugin

背景故事:我希望vim在编辑新的java文件时生成一个publicclass声明,所以我写了下面的augroup:

augroup generate_public_class_declaration_upon_creation
    au!
    autocmd BufNewFile *.java execute "normal! ipublic class " . expand('%:t:r') . "\<CR>{}\<Left>\<CR>\<CR>\<Up>\<Tab>" | startinsert
augroup END

放入 .vimrc 时工作正常,但在转移到 ftplugin/java.vim 后不再起作用。我尝试了一些其他事件,例如BufWritePre, BufWinEnter inside java.vim 没有任何问题。发生什么事了?

当该代码段从您的 ftplugin 执行时,已经来不及捕捉 BufNewFile 事件了。

您可以将它留在您的 vimrc 中,已知它可以工作,或者修改它以便它可以从您的 ftplugin 中执行。

这是一个快速而肮脏的解决方案:

" in after/ftplugin/java.vim
if !(bufname()->filereadable())
    execute "normal! ipublic class " . expand('%:t:r') . "\<CR>{}\<Left>\<CR>\<CR>\<Up>\<Tab>" | startinsert!
endif

我们在插入骨架之前检查当前缓冲区是否有文件。

基本上,当您执行 :e foo.java$ vim foo.java 时,会创建一个名为 foo.java 的缓冲区,它应该是关联文件的名称并且可以检索:help bufname()。如果不存在具有该名称的文件,我们检查 :help filereadable(),我们可以插入骨架。

请注意 startinsert 之后的 !:如果没有它,插入将发生在 <Tab> 之前。参见 :help :startinsert