vim在Windows上使用native vim的临时文件

Scr*_*ack 3 windows vim native temp

在Win7下运行gVim的本机编译时,我的vimrc中有以下内容:

if has ("win32")
  let $TMP="C:/tmp"
  setlocal equalprg=tidy\ --output-xhtml\ y\ -utf8\ --wrap-attributes\ 1\ --vertical-space\ 1\ --indent\ auto\ --wrap\ 0\ --show-body-only\ auto\ --preserve-entities\ 1\ -q\ -f\ shellpipe=2>
endif
Run Code Online (Sandbox Code Playgroud)

这应该创建一个临时文件.但是,运行命令后,我看到:

shell returned 1

E485: Can't read file C:\tmp\VIoC935.tmp
Run Code Online (Sandbox Code Playgroud)

本机Windows E485错误的常见建议是设置tmp变量,我可以从我的vimrc片段中看到.如果我删除let语句,我会得到类似的结果:

shell returned 1

E485: Can't read file C:\Users\ksk\AppData\Local\Temp\VIfFA01.tmp
Run Code Online (Sandbox Code Playgroud)

在这两种情况下; 两个目录都存在,gVim可以将文件写入这些位置,即

:w C:\Users\ksk\AppData\Local\Temp\VIfFA01.tmp
Run Code Online (Sandbox Code Playgroud)

在当前缓冲区中将写入此文件而不会出错.

有趣的是,在写这篇文章时,我发现如果我创建一个新的缓冲区并删除原始缓冲区,那么equalprg函数运行时没有错误(在vimrc中有和没有"let"语句)

dew*_*ell 5

这不适用于原始问题,但由于在gvim中设置了我的SHELL变量,我遇到了相同的症状.我是从Cygwin窗口启动gvim,它从cygwin:/ bin/bash中选择了SHELL设置.我必须在gvim中做一个":设置SHELL = C:/ cygwin/bin/bash",然后临时文件问题就消失了.因此,在尝试解决此类问题时,请检查gVim中的SHELL变量设置(通过":set shell").


xai*_*zek 3

有趣的是,在写这篇文章时,我发现如果我创建一个新的缓冲区,并删除原始缓冲区, equalprg 函数运行时不会出错(无论 vimrc 中是否有“let”语句)

这可能是因为你setlocal在你的vimrc

E485: 无法读取文件 C:\tmp\VIoC935.tmp

我知道原因,但我不知道如何在不更改缩进选项的情况下修复它。该问题是由缩进命令的符号引起的'>',在删除它的最后一部分甚至仅删除'>'符号后它应该可以工作。之所以如此,是因为'>'在 shell 命令中具有特殊含义。在 *nix 中,人们可能可以逃避它,但这对我在 Windows 中不起作用。

PS我知道这不是完整的答案,但也许它会帮助您解决问题。

更新。评论中的小讨论发现,转义的正确方法是将最后一个参数用双引号括起来(2)下面的变体)。所以工作命令是:

setlocal equalprg=tidy\ --output-xhtml\ y\ -utf8\ --wrap-attributes\ 1\ --vertical-space\ 1\ --indent\ auto\ --wrap\ 0\ --show-body-only\ auto\ --preserve-entities\ 1\ -q\ -f\ "shellpipe=2>"
Run Code Online (Sandbox Code Playgroud)