在Vim中,仅当文件类型为markdown,text或none(即NULL)时,我才希望设置特定的映射。指定“none”是困难的部分。
如果:set filetype?
返回filetype=markdown
或filetype=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,$
范围代替%
。