6

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

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

/tmp/tmp.24673.23

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

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

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

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

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

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

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

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

4

2 回答 2

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)
于 2013-03-12T22:30:09.857 回答
3

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

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

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

如需更多帮助,请参阅:

:h :windo
:h 'ft'
:h getwinvar(
于 2013-03-12T21:18:24.043 回答