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

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

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

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

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

最佳答案

这是一种方法:

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

如果您对全局映射感到满意,则还可以在运行时摆脱所有autocmd的限制,仅执行文件类型检查(如果确实有必要;对于您的示例,我认为其他文件类型没有不良行为),例如用:help :map-expr:
nnoremap <expr> <leader>f index(['markdown', 'text', ''], &filetype) == -1 ? '': ':1,$! cat')

后记
  • 您的映射不完整,即,它使光标处于命令行模式;那是故意的吗?附加<CR>以完成它。
  • 可以使用1,$范围代替%
  • 09-27 05:58