删除后缀后委派vim文件类型

删除后缀后委派vim文件类型,vim,Vim,我知道如何配置vim以根据扩展选择特定的文件类型: au BufNewFile,BufRead *.foo set filetype=foo 然而,对于我来说,一个常见的情况是打开一个带有附加后缀的文件。一个特定的场景是在合并期间解决版本控制冲突。我将有像“foo.cpp.orig”或“foo.java.merge”等文件。我想配置vim,以便如果它打开一个以“.orig”结尾的文件,它将去掉后缀,并使用剩余的文件扩展名来选择文件类型 是的,我知道我可以做类似的事情 au BufNewFile

我知道如何配置vim以根据扩展选择特定的文件类型:

au BufNewFile,BufRead *.foo set filetype=foo
然而,对于我来说,一个常见的情况是打开一个带有附加后缀的文件。一个特定的场景是在合并期间解决版本控制冲突。我将有像“foo.cpp.orig”或“foo.java.merge”等文件。我想配置vim,以便如果它打开一个以“.orig”结尾的文件,它将去掉后缀,并使用剩余的文件扩展名来选择文件类型

是的,我知道我可以做类似的事情

au BufNewFile,BufRead *.java.* set filetype=java
但这并不理想,因为我必须手动为所有可能编辑的文件类型添加一个条目。

“忽略扩展名
" Ignored extensions
if exists("*fnameescape")
au BufNewFile,BufRead ?\+.orig,?\+.bak,?\+.old,?\+.new,?\+.dpkg-dist,?\+.dpkg-old,?\+.dpkg-new,?\+.dpkg-bak,?\+.rpmsave,?\+.rpmnew
        \ exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r"))
au BufNewFile,BufRead *~
        \ let s:name = expand("<afile>") |
        \ let s:short = substitute(s:name, '\~$', '', '') |
        \ if s:name != s:short && s:short != "" |
        \   exe "doau filetypedetect BufRead " . fnameescape(s:short) |
        \ endif |
        \ unlet! s:name s:short
au BufNewFile,BufRead ?\+.in
        \ if expand("<afile>:t") != "configure.in" |
        \   exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r")) |
        \ endif
elseif &verbose > 0
  echomsg "Warning: some filetypes will not be recognized because this version of Vim does not have fnameescape()"
endif
如果存在(“*fnameescape”) au BufNewFile,BufRead?\+.原始、\+.bak、\+.旧、\+.新、\+.dpkg区、\+.dpkg旧、\+.dpkg新、\+.dpkg bak、\+.rpmsave、\+.rpmnew \exe“doau filetypedetect BufRead”.fnameescape(展开(“:r”)) 布夫奈维尔酒店*~ \让s:name=expand(“”)| \让s:short=替换(s:name,\~$,“”)| \如果s:name!=s:short&&s:short!=“”| \exe“doau filetypedetect BufRead”.fnameescape(s:short)| \恩迪夫| \unlet!s:name s:short au BufNewFile,BufRead?\+.英寸 \如果展开(“:t”)!=“配置.in”| \exe“doau filetypedetect BufRead”.fnameescape(展开(“:r”))| \恩迪夫 elseif&详细>0 echomsg“警告:某些文件类型将无法识别,因为此版本的Vim没有fnameescape() 恩迪夫

实际上,Vim已经考虑过了。上面的代码来自
文件类型。Vim

在查看Dyno指向我的代码后,我想我要添加的是

au BufNewFile,BufRead ?\+.merge
        \ exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r"))
au BufNewFile,BufRead?\+.merge
\exe“doau filetypedetect BufRead”.fnameescape(展开(“:r”))

对于my.vimrc来说,这不如设置一些变量来扩展已知模式列表那么好,但也不像修改原始的filetype.vim那么麻烦。

:filetype
具有
检测:ON
时,vim仍然无法检测到正确的类型?是的。只是为了确保我检查过并且:filetype告诉我检测:在插件上:在缩进上:在我的回答上,作者似乎已经考虑过了。您可能需要对您的情况进行一些调整。将所有这些行添加到vimrc将比键入此问题更快、更简单。我猜如果您认为添加l,您可能对我编辑的文件类型有错误的印象ines对于每一个都是有效的。问题是如何以正确的方式解决问题,而不是愚蠢的暴力方式。啊,我实际上没有尝试过。orig首先,因为我假设当它失败时。merge根本无法处理它。所以这很好,但并没有真正给我一种方法来扩展它知道的后缀集。patch
filetype.vim
或重命名备份文件:)这是一个相当不符合标准的解决方案。