Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测vim中没有有效文件扩展名的文件类型_Vim_Syntax Highlighting_File Type_Vim Syntax Highlighting - Fatal编程技术网

检测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+

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

这是我的场景:我使用
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)都失败了

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

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


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

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

: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