vimdiff没有使用mobaxterm在cywin下运行(E97无法创建差异)

时间:2017-09-16 12:55:49

标签: vim cygwin

在我的电脑上我正在使用mobaxterm并在其cygwin环境中安装了vim。

vim和gvim没有问题。

只有vimdiff没有工作,因为我收到错误:“E97:无法创建差异”

  • 我安装了diffutils“GNU diff of diff”并在2上检查了它 文件,它工作正常。
  • 我没有磁盘已满。
  • 我在不使用我的.vimrc的情况下运行vim -d或vimdiff,它是一样的。 所以它不是来自我的vim配置。
  • 我使用的是最新版本的mobaxterm(10.4)和vim v8但问题 与以前的版本(mobaxterm v9和vim v7.X)相同。
  • 我用-V选项运行vimdiff,然后得到:

    调用shell执行:“diff -a / tmp / vkjIw1o / 0 / tmp / vkjIw1o / 1> / tmp / vkjIw1o / 2”                                 / tmp / vkjIw1o / 0 / tmp / vkjIw1o / 1>的/ tmp / vkjIw1o / 2"

    E97:无法创建差异

我可以看到/ tmp / vkjIw1o已创建,内部没有文件。

这与旧帖子https://superuser.com/questions/455210/vimdiff-in-cygwin-is-not-working-properly相同。

我还有这个问题很烦人。 我希望有人解决了这个问题。

JP

更多信息:

1)我修改了一个文件(vimrc2)。从vim运行此命令可以正常工作::!diff~ / .vimrc~ / vimrc2

@@ -51,7 +51,7 @@
 "
 set showmode
 set ruler
-set cursorline
+"set cursorline
 set number             

2)对于临时目录,echo tempname()给出了/ tmp / vmtID5W / 1 然后我可以使用以下命令将文件保存到/ tmp:w /tmp/test.txt

我通过在.virmc文件中添加此代码解决了这个问题:

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 "!/bin/diff.exe -a --binary " . opt . v:fname_in . " " . v:fname_new . " > " . v:fname_out
endfunction

我从https://github.com/neovim/neovim/issues/1466接受了这个想法 请注意,我必须写/bin/diff.exe

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

很长时间以来,我一直在MobaXTerm中遇到相同的问题,直到版本11.1。我最终发现的原因(和解决方案)有两个方面:

  1. E810是关于Vim无法写入和读取临时文件。如果您逃犯,您将获得E484大致相同的信息。

  2. E97与Vim调用的diff可执行文件的输出错误有关。

解析E810E484

在我的情况下,这是因为我在寻找解决方案时遇到了错误的set shellxquote=\"。该设置负责Vim如何引用文件名。删除它导致取消设置,从而解决了写入和读取临时文件的错误。

解析E97

这是diffexpr的帮助所在。但这本身可能还不够。在我的情况下,我也必须安装diffutils软件包,因为/bin/diff指向busybox,该软件包仅支持 统一的diff格式,而Vim需要ed-样式(即普通)差异格式。

现在我的diff可执行文件是:

lrwxrwxrwx     16 Jan 29 13:26 /bin/diff -> /bin/busybox.exe*
-rwxr-xr-x 201.5K Dec  6  2016 /bin/diff.exe*
-rwxr-xr-x  56.0K Dec  6  2016 /bin/diff3.exe*

输出的差异是:

$ /bin/diff one two
--- one
+++ two
@@ -1,3 +1,3 @@
 no change
-file one
+file two
 no change

$ /bin/diff.exe one two
2c2
< file one
---
> file two

所有需要做的就是指向diffexpr函数中的适当位置:

silent execute "!/bin/diff.exe  " . opt . v:fname_in . " " . v:fname_new . " > " . v:fname_out

甚至不需要-a --binary选项。