【问题标题】:vimdiff is not working under cywin with mobaxterm (E97 cannot create diffs)vimdiff 在 cywin 下无法使用 mobaxterm(E97 无法创建差异)
【发布时间】:2017-09-16 12:55:49
【问题描述】:

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

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

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

  • 我安装了 diffutils "GNU collection 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 的情况相同。

这很烦人,我仍然有这个问题。 我希望有人解决了这个问题。

日本


更多信息:

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 然后我可以使用 :w /tmp/test.txt

将文件保存到 /tmp

我通过在我的 .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

感谢您的帮助。

【问题讨论】:

  • vimdiff 在 mintty 和 windows 控制台下工作正常。
  • :diffthis 命令运行良好吗?如果没有,请检查您的 vim 是否可以访问外部 diff 命令,并且您的临时目录是否可读写。
  • 你的 diff 输出看起来像一个统一的格式,但 vim 期望一个正常的。请查看“帮助差异”。
  • 我看来 diff 需要 -e 以 ed 格式输出。我还没有找到如何告诉 vim 使用该选项。我在这里找到了一个diffexpr 函数github.com/neovim/neovim/issues/1466,但目前我还没有成功使它工作......仍在调查中。
  • 普通格式是diff的默认值,不需要任何选项(--normal 以防万一)。您的差异可能与标准不同,对吗?即使您使用 diffexpr,正常格式也应该在 v:fname_out 文件中作为输出。

标签: vim cygwin


【解决方案1】:

我在 MobaXTerm 中一直面临同样的问题,直到版本 11.1。我最终找到的原因(和解决方案)是双重的:

  1. E810 是关于 Vim 无法写入和读取临时文件的问题。如果你逃亡,你得到的E484 差不多。

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

解决E810E484

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

解决E97

这就是diffexpr 提供帮助的地方。但它本身可能还不够。在我的情况下,我也必须安装 diffutils 包,因为 /bin/diff 指向 busybox,它支持统一差异格式,而 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 选项也不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多