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

问题描述 投票:0回答:1

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

vim和gvim工作正常没有问题。

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

  • 我安装了diffutils“GNU diff of diff”并在2个文件上检查它并且工作正常。
  • 我没有磁盘已满。
  • 我运行vim -d或vimdiff而不使用我的.vimrc,它是一样的。所以它不是来自我的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相同的情况。

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

J.P


更多信息:

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

谢谢您的帮助。

vim cygwin
1个回答
0
投票

在版本11.1中,我在MobaXTerm中遇到了同样的问题很长一段时间。我终于找到的原因(和解决方案)是双重的:

  1. E810是关于Vim无法写入和读取临时文件。如果你运行逃犯,你会得到E484大致相同。
  2. E97是关于Vim调用的diff可执行文件的错误输出。

Resolving E810 and E484

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

Resolving 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选项也不是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.