在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>
未设置指定文件类型的正确方法是什么?换句话说,只有在未设置文件类型(或文本或降价)时才应定义此映射。在任何其他文件类型上,映射应该是未定义的。
注意:映射是设计的,因为它不是问题的有趣部分。
答案 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