当filetype为none时,如何设置autocmd才能生效?

MER*_*ERM 3 vim autocmd

在Vim中,我希望仅当文件类型为markdown,text或none(即NULL)时才设置某个映射集.指定"无"是困难的部分.

如果:set filetype?返回filetype=markdown或,则以下命令有效filetype=text.但是如果:set filetype?返回filetype=(显示none在我的状态行中)它不起作用.

autocmd FileType markdown,text,none  nnoremap <leader>f :%! cat<CR>
Run Code Online (Sandbox Code Playgroud)

没有设置指定文件类型的正确方法是什么?换句话说,只有在未设置文件类型(或文本或降价)时才应定义此映射.在任何其他文件类型上,映射应该是未定义的.

注意:映射是设计的,因为它不是问题的有趣部分.

Ing*_*kat 6

这是一种方式:

autocmd FileType markdown,text nnoremap <buffer> <leader>f :1,$! cat
autocmd BufNewFile,BufRead * if empty(&filetype) | execute 'nnoremap <buffer> <leader>f :1,$! cat' | endif
Run Code Online (Sandbox Code Playgroud)

由于FileType未检测到文件类型时未触发事件,因此必须使用原始文件类型检测事件,并检查空文件类型.把这些行:filetype on放在你的后面~/.vimrc,这样autocmd的顺序是正确的.

请注意,您的问题中的代码仍定义全局映射(在加载其中一个文件类型之后); 你需要添加<buffer>,使这些映射真正本地化.(并且要100%正确使用<LocalLeader>,尽管大多数用户没有为此定义单独的密钥.)

如果你对全局映射很好,你也可以去除所有的autocmds并且只是在运行时执行文件类型检查(如果这是真的有必要;我没有看到你的示例中的其他文件类型的不良行为),例如用:help :map-expr:

nnoremap <expr> <leader>f index(['markdown', 'text', ''], &filetype) == -1 ? '': ':1,$! cat')
Run Code Online (Sandbox Code Playgroud)

后记

  • 您的映射不完整,即它将光标留在命令行模式; 那打算?附加<CR>完成它.
  • 而不是1,$,你可以使用%范围.