5

在 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>

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

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

4

2 回答 2

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>,尽管大多数用户没有为此定义单独的密钥。)

如果你对全局映射没问题,你也可以去掉所有的自动命令,只在运行时执行文件类型检查(如果真的有必要的话;我没有看到你的例子中其他文件类型的不良行为),例如与:help :map-expr

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

后记

  • 您的映射不完整,即光标处于命令行模式;这是故意的吗?追加<CR>以完成它。
  • 代替1,$,您可以使用%范围。
于 2017-10-11T07:03:30.533 回答
1

这个怎么样?

autocmd BufEnter * :call SetFiletypeNewBuffer()
function! SetFiletypeNewBuffer()
  if @% == ""
    :set filetype=none
  endif
endfunction
autocmd FileType markdown,text,none  nnoremap <leader>f :1,$! cat
于 2017-10-11T06:13:24.367 回答