在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>
Run Code Online (Sandbox Code Playgroud)
没有设置指定文件类型的正确方法是什么?换句话说,只有在未设置文件类型(或文本或降价)时才应定义此映射.在任何其他文件类型上,映射应该是未定义的.
注意:映射是设计的,因为它不是问题的有趣部分.
这是一种方式:
autocmd FileType markdown,text nnoremap <buffer> <leader>f :1,$! cat
autocmd BufNewFile,BufRead * if empty(&filetype) | execute 'nnoremap <buffer> <leader>f :1,$! cat' | endif
Run Code Online (Sandbox Code Playgroud)
由于FileType
未检测到文件类型时未触发事件,因此必须使用原始文件类型检测事件,并检查空文件类型.把这些行:filetype on
放在你的后面~/.vimrc
,这样autocmd的顺序是正确的.
请注意,您的问题中的代码仍定义全局映射(在加载其中一个文件类型之后); 你需要添加<buffer>
,使这些映射真正本地化.(并且要100%正确使用<LocalLeader>
,尽管大多数用户没有为此定义单独的密钥.)
如果你对全局映射很好,你也可以去除所有的autocmds并且只是在运行时执行文件类型检查(如果这是真的有必要;我没有看到你的示例中的其他文件类型的不良行为),例如用:help :map-expr
:
nnoremap <expr> <leader>f index(['markdown', 'text', ''], &filetype) == -1 ? '': ':1,$! cat')
Run Code Online (Sandbox Code Playgroud)
<CR>
完成它.1,$
,你可以使用%
范围. 归档时间: |
|
查看次数: |
572 次 |
最近记录: |