filetype为none时,如何设置autocmd生效?
How do you set an autocmd to take effect when filetype is none?
在Vim中,仅当且仅当文件类型为markdown、文本或none(即NULL)时,我才希望设置某个映射。指定 "none" 是困难的部分。
如果 :set filetype?
returns filetype=markdown
或 filetype=text
,则下面的命令有效。但是,如果 :set filetype?
returns filetype=
(在我的状态行中显示为 none
),则它不起作用。
autocmd FileType markdown,text,none nnoremap <leader>f :%! cat<CR>
指定未设置文件类型的正确方法是什么?换句话说,仅当未设置文件类型(或者是文本或降价)时才应定义此映射。在任何其他文件类型上,映射应该是未定义的。
注意:映射是人为设计的,因为它不是问题的有趣部分。
这个怎么样?
autocmd BufEnter * :call SetFiletypeNewBuffer()
function! SetFiletypeNewBuffer()
if @% == ""
:set filetype=none
endif
endfunction
autocmd FileType markdown,text,none nnoremap <leader>f :1,$! cat
这是一种方法:
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
事件,因此您必须使用原始文件类型检测事件,并检查空文件类型。将这些行放在 ~/.vimrc
中的 :filetype on
之后,以便 autocmd 顺序正确。
请注意,您问题中的代码仍然定义了 global 映射(在您的一种文件类型被加载之后);您需要添加 <buffer>
以使这些映射真正本地化。 (要 100% 正确使用 <LocalLeader>
,尽管大多数用户没有为此定义单独的密钥。)
如果您不介意全局映射,您也可以去掉所有的自动命令,只执行文件类型检查(如果确实有必要;对于您的示例,我没有看到其他文件类型的不良行为) 在运行时,例如:help :map-expr
:
nnoremap <expr> <leader>f index(['markdown', 'text', ''], &filetype) == -1 ? '': ':1,$! cat')
后记
- 您的映射不完整,即它使光标处于命令行模式;这是故意的吗?追加
<CR>
完成。
- 您可以使用
%
范围而不是 1,$
。
在Vim中,仅当且仅当文件类型为markdown、文本或none(即NULL)时,我才希望设置某个映射。指定 "none" 是困难的部分。
如果 :set filetype?
returns filetype=markdown
或 filetype=text
,则下面的命令有效。但是,如果 :set filetype?
returns filetype=
(在我的状态行中显示为 none
),则它不起作用。
autocmd FileType markdown,text,none nnoremap <leader>f :%! cat<CR>
指定未设置文件类型的正确方法是什么?换句话说,仅当未设置文件类型(或者是文本或降价)时才应定义此映射。在任何其他文件类型上,映射应该是未定义的。
注意:映射是人为设计的,因为它不是问题的有趣部分。
这个怎么样?
autocmd BufEnter * :call SetFiletypeNewBuffer()
function! SetFiletypeNewBuffer()
if @% == ""
:set filetype=none
endif
endfunction
autocmd FileType markdown,text,none nnoremap <leader>f :1,$! cat
这是一种方法:
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
事件,因此您必须使用原始文件类型检测事件,并检查空文件类型。将这些行放在 ~/.vimrc
中的 :filetype on
之后,以便 autocmd 顺序正确。
请注意,您问题中的代码仍然定义了 global 映射(在您的一种文件类型被加载之后);您需要添加 <buffer>
以使这些映射真正本地化。 (要 100% 正确使用 <LocalLeader>
,尽管大多数用户没有为此定义单独的密钥。)
如果您不介意全局映射,您也可以去掉所有的自动命令,只执行文件类型检查(如果确实有必要;对于您的示例,我没有看到其他文件类型的不良行为) 在运行时,例如:help :map-expr
:
nnoremap <expr> <leader>f index(['markdown', 'text', ''], &filetype) == -1 ? '': ':1,$! cat')
后记
- 您的映射不完整,即它使光标处于命令行模式;这是故意的吗?追加
<CR>
完成。 - 您可以使用
%
范围而不是1,$
。