当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 14 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : diff with vim 的bug
帖子发表于 : 2012-04-29 11:36 

注册: 2007-09-23 12:52
帖子: 23
送出感谢: 3
接收感谢: 0 次
本人的机子的环境是windows xp sp3,vim是安装官方的gvim73_46.exe,按照默认路径安装在
代码:
C:\Program Files\Vim


然后在官方网站(http://www.vim.org/download.php)上的Alternate distributions 中下载wuyongwei先生编译的版本(7.3.495)覆盖安装目录下的vim.exe和gvim.exe,现在的问题是:

鼠标选择任意两个文本文件,然后右键选择"diff with vim"比较两个文本文件的差异,gvim报错:

代码:
E810: Cannot read or write temp files;


在命令行中执行
代码:
 vim -d a.txt b.txt

vim报错:

代码:
'C:\Program' 不是内部或外部命令,也不是可运行的程序或批处理文件。

E810: Cannot read or write temp files;

但是使用manshow兄的7.3.353版本则没有这个问题

http://code.google.com/p/manshow/downlo ... e&can=2&q=

咨询过wuyongwei先生和manshow兄,他们在win7环境下均没有出现该问题,我开始怀疑是不是因为他们的更新补丁都是在win7环境下编译,然后放在XP SP3环境下运行导致出现的上述问题呢?

于是我自己编译看是否出现类似的问题,安装mingw-get-inst-20120426.exe,选择安装全部环境,在官网下载ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
然后下载所有的7.3版本的patch,第一次编译直接编译最新版本patch 1-509

代码:
make -f Make_ming.mak gvim.exe GUI=yes OLE=yes MBYTE=yes IME=yes GIME=yes CSCOPE=yes USERNAME=xuws USERDOMAIN=Changsha

make -f Make_ming.mak vim.exe GUI=no OLE=yes MBYTE=yes IME=yes GIME=yes CSCOPE=yes USERNAME=xuws USERDOMAIN=Changsha


得到的gvim.exe 和 vim.exe 覆盖C:\Program Files\Vim\vim73中的相应文件,测试发现竟然出现同样的问题,于是先排除之前关于win7编译不兼容的可能,鉴于manshow兄7.3.353版本正常,于是我编译了patch 1-453版本,用二分法找出出现问题的patch,patch 1-453同样报错,最后发现第一次出现该问题的patch是

http://ftp.vim.org/pub/vim/patches/7.3/7.3.443

代码:
Patch 7.3.443
Problem:    MS-Windows: 'shcf' and 'shellxquote' defaults are not very good.
Solution:   Make a better guess when 'shell' is set to "cmd.exe". (Ben Fritz)
Files:      src/option.c, runtime/doc/options.txt


于是我将patch 442 和 patch 443 的src/option.c进行了比对,以下为7.3.443中新增加的部分

代码:
  }
    else if (strstr((char *)gettail(p_sh), "cmd.exe") != NULL)
    {
   int   idx3;

   /*
    * cmd.exe on Windows will strip the first and last double quote given
    * on the command line, e.g. most of the time things like:
    *   cmd /c "my path/to/echo" "my args to echo"
    * become:
    *   my path/to/echo" "my args to echo
    * when executed.
    *
    * To avoid this, use the /s argument in addition to /c to force the
    * stripping behavior, and also set shellxquote to automatically
    * surround the entire command in quotes (which get stripped as
    * noted).
    */

   /* Set shellxquote default to add the quotes to be stripped. */
   idx3 = findoption((char_u *)"sxq");
   if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET))
   {
       p_sxq = (char_u *)"\"";
       options[idx3].def_val[VI_DEFAULT] = p_sxq;
   }

   /* Set shellcmdflag default to always strip the quotes, note the order
    * between /s and /c is important or cmd.exe will treat the /s as part
    * of the command to be executed.  */
   idx3 = findoption((char_u *)"shcf");
   if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET))
   {
       p_shcf = (char_u *)"/s /c";
       options[idx3].def_val[VI_DEFAULT] = p_shcf;
   }


由于本人并非开发人员,没办法发现问题根源,但是从之前
代码:
vim -d a.txt b.txt
vim的报错中可以隐隐感觉到是安装路径中存在空格导致出现问题的,于是我把
代码:
C:\Program Files\Vim\vim73
复制到
代码:
C:\Vim\vim73
修改环境变量后打开新的cmd再次执行vim -d a.txt b.txt,竟然正常出结果。

个人判断在patch 443后vim的安装路径出现空格,就会导致vim -d a.txt b.txt或 gvim -d a.txt b.txt出现问题,不知道该问题是不是普遍存在,是否可作为bug提交,由于本人水平有限,若作为bug提交,还请各位大牛帮忙;


页首
 用户资料  
 
2 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-29 13:23 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
提交了吧。
我再去编译个最新的 Windows 版 vim 试试好了。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
3 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-29 13:54 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
我编译了最新的 vim 7.3.509,没发现错误。编译环境为 Linux+mingw,运行环境为 Windows XP。安装文件可从这里下载:https://www.wuala.com/lilydjwg/%E8%BD%AF%E4%BB%B6/gvim_win/


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc



_________________
评价: 3.7% xwsnet
 
页首
 用户资料  
 
4 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-29 18:28 

注册: 2009-05-29 22:05
帖子: 151
送出感谢: 0 次
接收感谢: 0 次
:em20 我也用的wuyongwei的 495版本的
可以diff啊,也是XP SP3系统,没有你说的错误现象:


附件:
QQ截图20120429182811.png
QQ截图20120429182811.png [ 102.05 KiB | 被浏览 2334 次 ]

页首
 用户资料  
 
5 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-29 19:21 

注册: 2007-09-23 12:52
帖子: 23
送出感谢: 3
接收感谢: 0 次
niejieqiang 写道:
:em20 我也用的wuyongwei的 495版本的
可以diff啊,也是XP SP3系统,没有你说的错误现象:




你安装路径也是C:\Program Files\Vim 吗?我把安装路径改成不包含空格的就可以了,难道这个问题没办法在其他电脑里面重现吗?不会就我自己的机器出现这样的问题吧 :em19


页首
 用户资料  
 
6 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-29 19:32 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
xwsnet 写道:
niejieqiang 写道:
:em20 我也用的wuyongwei的 495版本的
可以diff啊,也是XP SP3系统,没有你说的错误现象:




你安装路径也是C:\Program Files\Vim 吗?我把安装路径改成不包含空格的就可以了,难道这个问题没办法在其他电脑里面重现吗?不会就我自己的机器出现这样的问题吧 :em19

你试试完全删除 vim 后重装?


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
7 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-29 23:09 

注册: 2007-09-23 12:52
帖子: 23
送出感谢: 3
接收感谢: 0 次
lilydjwg 写道:
xwsnet 写道:
niejieqiang 写道:
:em20 我也用的wuyongwei的 495版本的
可以diff啊,也是XP SP3系统,没有你说的错误现象:




你安装路径也是C:\Program Files\Vim 吗?我把安装路径改成不包含空格的就可以了,难道这个问题没办法在其他电脑里面重现吗?不会就我自己的机器出现这样的问题吧 :em19

你试试完全删除 vim 后重装?



我经过很多次的重装,得到的结果 :

1. 如果安装在C:\Program Files\Vim , diff with vim的时候报错,报错信息和之前一样;
2. 如果安装在D:\Program Files\Vim , diff with vim的时候不报错了,但是diff不出正确的结果,打开的时候就是两边窗口都是折叠成一行;
3. 如果安装在C:\Vim ,一切正常;
4. 如果安装在D:\x\y\z\vim ,其中x/y/z代表任意的目录名称,也是一切正常;

另外我在办公室的电脑上面也是XP SP3,gvim安装在C:\Program Files\Vim也出现这样的问题;

问题没解决前只能安装在目录文件名不包含空格的路径下面了;

:em25


页首
 用户资料  
 
8 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-29 23:27 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
xwsnet 写道:
我经过很多次的重装,得到的结果 :

1. 如果安装在C:\Program Files\Vim , diff with vim的时候报错,报错信息和之前一样;
2. 如果安装在D:\Program Files\Vim , diff with vim的时候不报错了,但是diff不出正确的结果,打开的时候就是两边窗口都是折叠成一行;
3. 如果安装在C:\Vim ,一切正常;
4. 如果安装在D:\x\y\z\vim ,其中x/y/z代表任意的目录名称,也是一切正常;

另外我在办公室的电脑上面也是XP SP3,gvim安装在C:\Program Files\Vim也出现这样的问题;

问题没解决前只能安装在目录文件名不包含空格的路径下面了;

:em25


神奇……

你试过我打包的 gvim 没?
只是这一个系统会出现这个问题吗?
你的命令行解释器是 cmd.exe 吗?


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
9 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-30 11:43 

注册: 2007-09-23 12:52
帖子: 23
送出感谢: 3
接收感谢: 0 次
lilydjwg 写道:
xwsnet 写道:
我经过很多次的重装,得到的结果 :

1. 如果安装在C:\Program Files\Vim , diff with vim的时候报错,报错信息和之前一样;
2. 如果安装在D:\Program Files\Vim , diff with vim的时候不报错了,但是diff不出正确的结果,打开的时候就是两边窗口都是折叠成一行;
3. 如果安装在C:\Vim ,一切正常;
4. 如果安装在D:\x\y\z\vim ,其中x/y/z代表任意的目录名称,也是一切正常;

另外我在办公室的电脑上面也是XP SP3,gvim安装在C:\Program Files\Vim也出现这样的问题;

问题没解决前只能安装在目录文件名不包含空格的路径下面了;

:em25


神奇……

你试过我打包的 gvim 没?
只是这一个系统会出现这个问题吗?
你的命令行解释器是 cmd.exe 吗?


链接打开了我下不了,不知道为什么,命令解释器是windows默认的cmd.exe;

我之前的实验也说明问题可能出现在patch 443以及以后的patch中,因为我自己编译 patch 1-442,放在相同环境下是没有任何问题的,patch 1-443后就出现报错,我发现patch 443后的几个补丁都是修复类似的地方
代码:
5445  7.3.442  (after 7.3.438) still read modelines for ":doautocmd"
  8329  7.3.443  MS-Windows: 'shcf' and 'sxq' defaults are not very good
  3159  7.3.444  ":all!" and ":sall!" give error E477
  6224  7.3.445  (after 7.3.443) can't properly escape commands for cmd.exe
  5338  7.3.446  (after 7.3.445) external command with special char doesnt work
 10262  7.3.447  (after 7.3.446) External commands with "start" do not work
  5192  7.3.448  (after 7.3.447) Win32: Still a problem with "!start /b"
 15177  7.3.449  crash when a BufWinLeave autocmd closes the only other window
  2359  7.3.450  (after 7.3.448) Win32: Still a problem with "!start /b"

所以我还是怀疑是bug,并且在这几次的修改中都没有修复好;


页首
 用户资料  
 
10 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-30 13:18 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
xwsnet 写道:
链接打开了我下不了,不知道为什么,命令解释器是windows默认的cmd.exe;

Wuala 的服务不错,又不在国内,所以嘛,被认证了。我传了个 115: http://115.com/file/c2ureh7l
xwsnet 写道:
我之前的实验也说明问题可能出现在patch 443以及以后的patch中,因为我自己编译 patch 1-442,放在相同环境下是没有任何问题的,patch 1-443后就出现报错,我发现patch 443后的几个补丁都是修复类似的地方
代码:
5445  7.3.442  (after 7.3.438) still read modelines for ":doautocmd"
  8329  7.3.443  MS-Windows: 'shcf' and 'sxq' defaults are not very good
  3159  7.3.444  ":all!" and ":sall!" give error E477
  6224  7.3.445  (after 7.3.443) can't properly escape commands for cmd.exe
  5338  7.3.446  (after 7.3.445) external command with special char doesnt work
 10262  7.3.447  (after 7.3.446) External commands with "start" do not work
  5192  7.3.448  (after 7.3.447) Win32: Still a problem with "!start /b"
 15177  7.3.449  crash when a BufWinLeave autocmd closes the only other window
  2359  7.3.450  (after 7.3.448) Win32: Still a problem with "!start /b"

所以我还是怀疑是bug,并且在这几次的修改中都没有修复好;

那你到 vim_dev 里问问试试。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
11 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-30 16:07 

注册: 2007-09-23 12:52
帖子: 23
送出感谢: 3
接收感谢: 0 次
感谢lilydjwg兄,下了您的gvim73.479.exe版本经过反复多次安装卸载测试,以下为我本机的测试结果:

1.使用以下路径安装vim,diff with vim的时候均不会报错,但得到的结果均为错误的:

a.将vim安装在C:\Program Files\vim
b.将vim安装在D:\Program Files\vim
c.将vim安装在C:\dskaj djskajd\Vim
以上安装路径都包含空格;

错误截图:
附件:
a.png
a.png [ 17.74 KiB | 被浏览 2263 次 ]



2.使用以下安装路径则一切正常

a.将vim安装在D:\dkjdksa\Vim
b.将vim安装在C:\Vim
c.将vim安装在D:\a\b\c\d\e\Vim
以上安装路径不包含空格;

正确截图:
附件:
b.png
b.png [ 18.78 KiB | 被浏览 2263 次 ]




vim版本截图:
附件:
c.png
c.png [ 28.43 KiB | 被浏览 2263 次 ]



页首
 用户资料  
 
12 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-30 21:48 

注册: 2010-09-23 13:47
帖子: 36
送出感谢: 0 次
接收感谢: 4
试试先
代码:
:set diffexpr=

再 diff 。
如果没问题,把 _vimrc 里的相关内容注释掉。
因为我也和 LZ 有同样的问题(我是自己编译的 7.3.502),这么做之后问题就消失了,Vim 放哪个目录都行了。 :em01



_________________
评价: 3.7% xwsnet
 
页首
 用户资料  
 
13 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-04-30 22:34 

注册: 2007-09-23 12:52
帖子: 23
送出感谢: 3
接收感谢: 0 次
wz520 写道:
试试先
代码:
:set diffexpr=

再 diff 。
如果没问题,把 _vimrc 里的相关内容注释掉。
因为我也和 LZ 有同样的问题(我是自己编译的 7.3.502),这么做之后问题就消失了,Vim 放哪个目录都行了。 :em01



:em11 太棒了,:set diffexpr= 放到_vimrc里面就可以解决问题了,这个问题折腾我好久了;

:h diffexpr 看了一下

代码:
查 找 不 同                  *diff-diffexpr*

 'diffexpr' 选项可以用来设定非标准的 "diff" 程序,用来比较文件间的异同。

当 'diffexpr' 为空的时候,Vim 使用以下命令在 file1 和 file2 中查找不同之处: >

   diff file1 file2 > outfile

其中的 ">" 应当用 'shellredir' 的值替换。

"diff" 的输出必须是普通的 "ed" 风格的 diff。_不要_ 使用上下文 (context) 风格的
diff。下面就是一个 Vim 所期望格式的范例: >

   1a2
   > bbb
   4d4
   < 111
   7c7
   < GGG
   ---
   > ggg

"1a2" 项添加了 "bbb" 行。
"4d4" 项删除了 "111" 行。
'7c7" 项用 "ggg" 行替代了 "GGG" 行。

当 'diffexpr' 不为空时,Vim 执行它以得到一个满足上述格式的 diff 文件。在执行过
程中,以下的变量会被设置为须用到的文件名:

   v:fname_in      原始文件
   v:fname_new      同一文件的新版
   v:fname_out      产生的 diff 文件

另外,'diffexpr' 应负责实现 'diffopt' 选项中的 "icase" 和 "iwhite" 。
而且,'diffexpr' 不能更改 'lines' 和 'columns' 的值。

示例 (大致相当于 'diffexpr' 为空时的行为): >

   set diffexpr=MyDiff()
   function MyDiff()
      let opt = ""
      if &diffopt =~ "icase"
        let opt = opt . "-i "
      endif
      if &diffopt =~ "iwhite"
        let opt = opt . "-b "
      endif
      silent execute "!diff -a --binary " . opt . v:fname_in . " " . v:fname_new .
      \  " > " . v:fname_out
   endfunction
<

其中,"-a" 参数被用来强制将文件作为文本来比较,二进制的比较没有什么意义。
"--binary" 参数使得文件以二进制模式读入,这样在 DOS 上 CTRL-Z 就不会结束文本。


                  *E810* *E97*
Vim 将测试 diff 的输出看上去是否完全正确。如果不正确,你将得到一个错误信息。可
能是因为:
-  "diff" 程序无法执行。
-  "diff" 程序无法产生普通 "ed" 风格的 diff 文件 (参考上面)。
-  'shell' 和相关选项没有正确设置。试试类似 ":!sort" 过滤运行是否正确。
-  你设置的 'diffexpr' 可能不正确。
如果问题出在哪里不是很清楚,可以设置 'verbose' 选项为一或更高的值,以获得更多
的信息。


根据help里面的说明,是不是说安装目录中包含空格时候,diff就是非标准的diff程序呢?

不过问题已经解决,在这里谢谢lilydjwg和wz520 :em01


页首
 用户资料  
 
14 楼 
 文章标题 : Re: diff with vim 的bug
帖子发表于 : 2012-05-01 14:20 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
xwsnet 写道:
根据help里面的说明,是不是说安装目录中包含空格时候,diff就是非标准的diff程序呢?

不过问题已经解决,在这里谢谢lilydjwg和wz520 :em01


那似乎是 diffexpr 默认设置(在某个配置文件里)没有同时更新的问题。vim 应该调用它自己附带的 diff.exe 的。你可以去 vim_dev 反映一下。

要谢就点下帖子右边的小金手啦。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc



_________________
评价: 3.7% xwsnet
 
页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 14 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:Yahoo [Bot] 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译