6

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

这是我的情况:我用vimdiffgvimdiff作为我P4DIFF工具,它显示了在我的本地副本的文件,并从Perforce服务器的那些之间的变化。 Perforce公司似乎在文件中把从Perforce服务器到/ tmp目录,并使用PID命名文件,例如:

/tmp/tmp.24673.23 

这是一个C++源文件。

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

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

  • This提到了一种可能的搜索和识别魔法模式的方法。我找不到任何一贯的魔法模式,我可以获得高成功率。

  • 尝试在我的Linux机器上使用file二进制文件来查看我得到的结果。看来,以确定C/C++源代码很好,但失败了的Makefile,甚至Python脚本(这没有hashbang)

一个好处是,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或Windows不能正常intialized尚未
  • vimdiff可能已经触发在右边或分割左侧的旧文件,所以我们认为这两种情况。
  • 2/winnr()是数学特技1和2之间翻转(2/2 = 1,2/1 = 2)
+0

非常好。我喜欢'2/winnr()'技巧! – 2013-03-12 22:52:21

+0

酷!这真的很好......只是将if-endif移到一个函数中,并用该函数的调用替换了该命令。 :) – Tuxdude 2013-03-12 23:31:47

3

假设你有开放的只有2次分裂,在左侧的分裂是您的本地文件,你可以做以下

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

这将filetype设置为最高值最左边的窗口所有的窗户。

如需更多帮助,请参见:

:h :windo 
:h 'ft' 
:h getwinvar(
+0

谢谢,它的工作原理。由于右窗口具有正确的文件类型,因此我必须使用'windo let&ft = getwinvar(2,'&ft')'。有没有办法将它添加到'.vimrc'中,以便对于每个vimdiff,它会自动执行此操作?仅仅将'windo'命令添加到.vimrc中并不能解决问题。我猜它会在稍后被覆盖。 – Tuxdude 2013-03-12 21:39:04

+0

尽管我确信可以创建这样一个'autocmd',我觉得最简单的解决方案是创建一个自定义命令:'命令! -bar -nargs = 0 SameFiletype exe'windo set ft ='。&ft'将它添加到你的'〜/ .vimrc'文件中。下一次出现的情况移动到正确的文件类型的缓冲区并执行':SameFiletype' – 2013-03-12 22:02:56

+0

谢谢,这听起来像一个合理的方法:) – Tuxdude 2013-03-12 22:04:04

相关问题