Không thể chạy Vimdiff (7.4) trên Windows 7


29

Gần đây tôi đã cài đặt phiên bản 7.4 của gVim trên máy Windows 7. Cố gắng tìm khác biệt hai tệp từ menu nhạy ngữ cảnh trên Windows Explorer, tôi liên tục nhận được thông báo lỗi:

E810: Không thể đọc hoặc ghi tệp tạm thời
E97: Không thể tạo khác biệt

Hai tệp đã chọn được mở trong chế độ xem gVim hai ngăn và trình chỉnh sửa dường như ở chế độ khác, nhưng sự khác biệt thực tế không được làm nổi bật.

Các biến %TEMP%%TMP%môi trường được điền với một tên thư mục hợp lệ.

Tôi nhận được phản hồi tương tự khi mở các tệp trong phiên gVim thông thường và gõ :diffthisvào dấu nhắc lệnh.

Điều này được sử dụng để hoạt động đúng với Vim 7.3, nhưng có vẻ như đã có gì đó được thay đổi trong v7.4.

Làm thế nào tôi có thể khác hai tập tin?

Câu trả lời:


45

Sự cố này có thể do tệp _vimrc mặc định được tạo bởi trình cài đặt trên Windows. Nếu bạn vẫn đang sử dụng tệp mặc định đó hoặc nếu bạn đã sao chép tệp tại một số điểm, thì hãy kiểm tra chức năng bạn đã gán chodiffexpr tùy chọn. Một trong những bản vá giữa Vim 7.3 và 7.4 đã giới thiệu các quy tắc trích dẫn mặc định mới cho trình bao cmd.exe trên Windows. Bản vá này đã phá vỡ cách giải quyết trong hàm MyDiff () được thiết kế để khắc phục vấn đề tương tự được giải quyết bằng bản vá.

Hàm MyDiff () đã được sửa bởi phiên bản 7.4.103 bằng cách sửa trình cài đặt. Đây là hàm MyDiff () mà trình cài đặt mới nhất sẽ tạo cho bạn nếu bạn chỉ muốn sao chép nó vào _vimrc:

 function MyDiff()
   let opt = '-a --binary '
   if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
   if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
   let arg1 = v:fname_in
   if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
   let arg2 = v:fname_new
   if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
   let arg3 = v:fname_out
   if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
   if $VIMRUNTIME =~ ' '
     if &sh =~ '\<cmd'
       if empty(&shellxquote)
         let l:shxq_sav = ''
         set shellxquote&
       endif
       let cmd = '"' . $VIMRUNTIME . '\diff"'
     else
       let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
     endif
   else
     let cmd = $VIMRUNTIME . '\diff'
   endif
   silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
   if exists('l:shxq_sav')
     let &shellxquote=l:shxq_sav
   endif
 endfunction

Bạn có thể xem phiên bản đầy đủ của bạn trong Vim sử dụng :versionhoặc :introlệnh, hoặc vào màn hình splash lúc khởi động.

Thật không may nếu bạn muốn có một trình cài đặt chính thức, bạn sẽ cần đợi đến 8.0 hoặc cài đặt bản dựng hàng đêm . Tuy nhiên, bạn có thể cài đặt Vim từ những nơi khác hoặc xây dựng Vim của riêng bạn .


Sao chép trên Stack Overflow (bất thường, theo chủ đề trên cả hai trang web), nếu câu trả lời này được cập nhật thì câu trả lời khác cũng vậy.


1
Tìm thấy một vài giải pháp trên mạng, nhưng đây là giải pháp duy nhất phù hợp với tôi!
ysap

BTW - làm thế nào bạn có thể nói # của phiên bản phụ (ví dụ: 7.4.103)?
ysap

Ba cách: khởi động trên bộ đệm trống hiển thị thông tin phiên bản bao gồm cấp độ bản vá, :introlệnh hiển thị cùng một văn bản và :versionlệnh cung cấp thông tin trên dòng "bao gồm các bản vá". :versioncũng cung cấp một danh sách rất chi tiết về các tính năng được bao gồm hoặc loại trừ là tốt.
Ben

1
Ngoài ra, Bram thường không phát hành bất kỳ trình cài đặt chính thức nào sau phiên bản nhỏ ban đầu, ví dụ 7.4.0. Nhưng có rất nhiều nơi để có trình cài đặt cho một Vim gần đây hơn nếu bạn không muốn biên dịch, thường được trích dẫn nhất có lẽ ở đây: sourceforge.net/projects/cream/files/Vim
Ben

1
@Ben Tôi đã khắc phục sự cố, đó là một thứ khác gây ra sự cố này và tôi đã hiểu nhầm đây MyDiff()là thứ gì đó để sử dụng khi sử dụng vim trên windows, nhưng đó là thứ để sử dụng vim qua cmd, tôi đang sử dụng vim qua git bash. Cảm ơn bạn.
Thuyền trưởng Man
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.