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

时间:2013-03-12 20:30:25

标签: vim syntax-highlighting file-type vim-syntax-highlighting

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

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

/tmp/tmp.24673.23

这是针对C ++源文件的。

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

  • 我已经研究过使用modeline,但我们树中的大部分资源都没有将此信息嵌入文件中。

  • This发帖提到了搜索和识别魔法模式的可能方法。我无法找到任何一致的魔术模式,我可以获得很高的成功率。

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

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

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

这个问题的任何替代解决方案也是受欢迎的。

2 个答案:

答案 0 :(得分: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

注意:

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

答案 1 :(得分:3)

假设您只打开了2个拆分而左侧的拆分是您的本地文件,您可以执行以下操作

:windo let &ft = getwinvar(1, '&ft')

这会将filetype设置为所有窗口左上角窗口的值。

如需更多帮助,请参阅:

:h :windo
:h 'ft'
:h getwinvar(
相关问题