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
。
背景故事:我希望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
。