在vim中检测文件类型而没有有效的文件扩展名

Tux*_*ude 6 vim file-type syntax-highlighting vim-syntax-highlighting

我正在寻找一种方法来确定vim中文件的文件类型,并根据文件类型设置语法高亮.唯一的问题是我无法使用文件扩展名来确定文件类型.

这是我的场景:我使用vimdiffgvimdiff作为我的P4DIFF工具,它显示本地副本中的文件与perforce服务器中的文件之间的更改.Perforce似乎将perforce服务器中的文件引入/ tmp目录并使用PID命名文件,例如:

/tmp/tmp.24673.23
Run Code Online (Sandbox Code Playgroud)

这是一个C++源文件.

我在perforce存储库中遇到的最常见的文件类型是C/C++源代码和头文件,Makefile,python脚本,perl脚本,ruby脚本和tcl脚本.

  • 我已经开始使用了modeline,但是我们树中的大多数源都没有嵌入文件中的这些信息.

  • 这篇文章提到了一种搜索和识别魔术模式的可能方法.我找不到任何一致的魔术模式,我可以获得很高的成功率.

  • 尝试使用file我的linux盒子上的二进制文件来查看我得到的结果.它似乎很好地识别了C/C++源代码,但是对于Makefile甚至python脚本(没有hashbang)都失败了

一个好处是,在比较的2个文件中,右边的文件来自我的本地副本,因此具有带扩展名的正确文件名,因此右侧的文件正确启用了语法突出显示.

有没有办法可以利用它为左侧显示的文件设置相同的语法高亮显示?

对此问题的任何替代解决方案也是受欢迎的.

Daa*_*ker 6

这是一个有趣的难题.:)

aug SmartDiffType
  au!
  au VimEnter * :if &diff && len(&ft) | call setwinvar(2/winnr(),'&ft',&ft) | elseif &diff | let &ft=getwinvar(2/winnr(),'&ft') | endif
aug END
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 在上面的4行中,您只需要au VimEnter行,但通常最好将自动命令放在某个自动命令组au!中,顶部有一个reset().
  • 自动命令,VimEnter因为否则diff或窗口尚未正确初始化
  • vimdiff 可能是由于拆分右侧或左侧的旧文件触发,因此我们考虑两种情况.
  • 2/winnr()是一个在1到2之间翻转的数学技巧(2/2 = 1,2/1 = 2)