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

How do you set an autocmd to take effect when filetype is none?

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

如果 :set filetype? returns filetype=markdownfiletype=text,则下面的命令有效。但是,如果 :set filetype? returns filetype=(在我的状态行中显示为 none),则它不起作用。

autocmd FileType markdown,text,none  nnoremap <leader>f :%! cat<CR>

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

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

这个怎么样?

autocmd BufEnter * :call SetFiletypeNewBuffer()
function! SetFiletypeNewBuffer()
  if @% == ""
    :set filetype=none
  endif
endfunction
autocmd FileType markdown,text,none  nnoremap <leader>f :1,$! cat

这是一种方法:

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

由于未检测到文件类型时不会触发FileType事件,因此您必须使用原始文件类型检测事件,并检查空文件类型。将这些行放在 ~/.vimrc 中的 :filetype on 之后,以便 autocmd 顺序正确。

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

如果您不介意全局映射,您也可以去掉所有的自动命令,只执行文件类型检查(如果确实有必要;对于您的示例,我没有看到其他文件类型的不良行为) 在运行时,例如:help :map-expr:

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

后记

  • 您的映射不完整,即它使光标处于命令行模式;这是故意的吗?追加 <CR> 完成。
  • 您可以使用 % 范围而不是 1,$