检测vim中没有有效文件扩展名的文件类型
我正在寻找一种方法来确定vim中文件的文件类型,并根据文件类型设置语法高亮显示。唯一的问题是我不能使用文件扩展名来确定文件类型 这是我的场景:我使用检测vim中没有有效文件扩展名的文件类型,vim,syntax-highlighting,file-type,vim-syntax-highlighting,Vim,Syntax Highlighting,File Type,Vim Syntax Highlighting,我正在寻找一种方法来确定vim中文件的文件类型,并根据文件类型设置语法高亮显示。唯一的问题是我不能使用文件扩展名来确定文件类型 这是我的场景:我使用vimdiff或gvimdiff作为我的P4DIFF工具,它显示本地副本中的文件与Performce服务器中的文件之间的更改。Perforce似乎将文件从Perforce服务器引入/tmp目录,并使用PID命名文件,例如: /tmp/tmp.24673.23 这是C++源文件。< /P> 我在perforce存储库中遇到的最常见的文件类型是C/C+
vimdiff
或gvimdiff
作为我的P4DIFF
工具,它显示本地副本中的文件与Performce服务器中的文件之间的更改。Perforce似乎将文件从Perforce服务器引入/tmp目录,并使用PID
命名文件,例如:
/tmp/tmp.24673.23
这是C++源文件。< /P> 我在perforce存储库中遇到的最常见的文件类型是C/C++源代码和头文件、makefile、python脚本、perl脚本、ruby脚本和tcl脚本
- 我已经研究过如何使用
,但是我们树中的大多数源代码都没有在文件中嵌入这些信息modeline
- 这篇文章提到了一种搜索和识别魔法模式的可能方法。我找不到任何可以获得高成功率的一致魔法模式
- 尝试在我的linux设备上使用
二进制文件来查看得到的结果。它似乎能够很好地识别C/C++源代码,但对于Makefiles甚至python脚本(没有hashbang)都失败了文件
也欢迎对此问题的任何替代解决方案。假设您只打开了两个拆分,左侧的拆分是您的本地文件,则可以执行以下操作
:windo let &ft = getwinvar(1, '&ft')
这将为所有窗口将文件类型设置为最左上角窗口的值
有关更多帮助,请参阅:
:h :windo
:h 'ft'
:h getwinvar(
这是一个有趣的谜题
注:
- 在上面的4行中,您只需要使用
au-VimEnter
行,但通常最好将自动命令放在一些自动命令组中,并在顶部重置(au!
)
- 自动命令打开
VimCenter
,否则diff
或窗口尚未正确初始化
- <代码> VimDIF.<代码>可能是在拆分左边或右边的旧文件触发的,所以我们考虑这两种情况。<李>
2/winnr()
是一个在1和2之间切换的数学技巧(2/2=1,2/1=2)
谢谢,它很有效。我不得不使用windo let&ft=getwinvar(2,'&ft')
,因为正确的窗口具有正确的文件类型。是否有办法将其添加到.vimrc
,以便对每个vimdiff自动执行此操作?仅仅将windo
命令添加到.vimrc并没有起到作用。我猜它以后可能会被覆盖。虽然我确信可以创建这样一个autocmd
,但我觉得最简单的解决方案是创建一个自定义命令:command-bar-nargs=0 SameFiletype exe'windo set ft='。&ft
将其添加到~/.vimrc
文件中。下次出现这种情况时,使用正确的文件类型移动到缓冲区并执行:SameFiletype
谢谢,这听起来是一种合理的方法:)酷!这真的很好。。。只是将if-endif移到一个函数中,并将命令替换为对函数的调用。:)
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