4

在 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

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

shell returned 1

E485: Can't read file C:\tmp\VIoC935.tmp

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

shell returned 1

E485: Can't read file C:\Users\ksk\AppData\Local\Temp\VIfFA01.tmp

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

:w C:\Users\ksk\AppData\Local\Temp\VIfFA01.tmp

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

有趣的是,在写这个的时候,我发现如果我创建一个新的缓冲区,并删除原来的缓冲区,equalprg 函数运行没有错误(有和没有 vimrc 中的“let”语句)

4

2 回答 2

6

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

于 2013-02-06T19:53:49.510 回答
3

有趣的是,在写这个的时候,我发现如果我创建一个新的缓冲区,并删除原来的缓冲区,equalprg 函数运行没有错误(有和没有 vimrc 中的“let”语句)

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

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

我知道原因,但我不知道如何在不更改缩进选项的情况下解决它。该问题是由'>'您的 indent 命令的符号引起的,它应该在删除它的最后一部分甚至仅删除该'>'符号后工作。之所以如此,是因为'>'在 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>"
于 2012-07-24T12:13:08.023 回答