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

时间:2017-10-11 02:03:05

标签: vim autocmd

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

如果:set filetype?返回filetype=markdownfiletype=text,则以下命令有效。但如果:set filetype?返回filetype=(在我的状态行中显示为none),则无效。

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

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

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

2 个答案:

答案 0 :(得分: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

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

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

如果您对全局映射感觉不错,您还可以摆脱所有autocmds并执行文件类型检查(如果真的有必要;我不会看到不良行为在运行时使用其他文件类型),例如与:help :map-expr

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

后记

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

答案 1 :(得分:1)

这个怎么样?

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