Tidak dapat menjalankan Vimdiff (7.4) di Windows 7

29

Saya baru-baru ini menginstal versi 7.4 gVim pada mesin Windows 7. Mencoba membedakan dua file dari menu konteks-sensitif pada Windows Explorer, saya terus mendapatkan pesan kesalahan:

E810: Tidak dapat membaca atau menulis file temp
E97: Tidak dapat membuat diff

Dua file yang dipilih dibuka dalam tampilan gVim dua-pane, dan editor tampaknya dalam mode diff, tetapi perbedaan yang sebenarnya tidak disorot.

The %TEMP%dan %TMP%variabel lingkungan akan diisi dengan nama direktori yang valid.

Saya mendapatkan respons yang sama ketika membuka file dalam sesi gVim biasa dan mengetikkan :diffthiscommand prompt.

Ini digunakan untuk bekerja dengan baik dengan Vim 7.3, tetapi sepertinya ada sesuatu yang berubah di v7.4.

Bagaimana saya bisa membedakan kedua file?

ya
sumber

Jawaban:

45

Masalah ini dapat disebabkan oleh file _vimrc default yang dibuat oleh penginstal pada Windows. Jika Anda masih menggunakan file default itu, atau jika Anda menyalinnya di beberapa titik, maka periksa fungsi yang Anda tetapkan untuk diffexpropsi. Salah satu tambalan antara Vim 7.3 dan 7.4 memperkenalkan aturan kutip default baru untuk shell cmd.exe di Windows. Patch ini memecahkan pemecahan masalah dalam fungsi MyDiff () yang dirancang untuk memperbaiki masalah yang sama diselesaikan oleh patch.

Fungsi MyDiff () diperbaiki oleh versi 7.4.103 dengan memperbaiki penginstal. Ini adalah fungsi MyDiff () yang akan dibuat oleh pemasang terbaru untuk Anda jika Anda hanya ingin menyalinnya ke _vimrc Anda:

 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

Anda dapat melihat versi lengkap Anda di Vim menggunakan :versionatau :introperintah, atau splash screen pada saat startup.

Sayangnya, jika Anda menginginkan penginstal resmi, Anda harus menunggu hingga 8,0, atau menginstal bangunan malam . Namun demikian, Anda dapat menginstal Vim dari tempat lain atau membangun Vim Anda sendiri .


Digandakan pada Stack Overflow (tidak biasa, sesuai topik di kedua situs), jika jawaban ini diperbarui maka harus yang lain.

Ben
sumber
1
Menemukan beberapa solusi di internet, tetapi ini adalah satu-satunya yang bekerja untuk saya!
ysap
BTW - bagaimana Anda bisa tahu # dari sub-versi (mis. 7.4.103)?
ysap
Tiga cara: startup pada buffer kosong menunjukkan informasi versi termasuk level patch, :introperintah menunjukkan teks yang sama, dan :versionperintah memberikan informasi pada baris "patch yang disertakan". :versionjuga memberikan daftar yang sangat rinci tentang fitur yang disertakan atau dikecualikan juga.
Ben
1
Selain itu, Bram biasanya tidak merilis installer resmi apa pun setelah versi minor awal, misalnya 7.4.0. Tetapi ada banyak tempat untuk mendapatkan penginstal untuk Vim yang lebih baru jika Anda tidak ingin mengkompilasi, yang paling sering dikutip mungkin ada di sini: sourceforge.net/projects/cream/files/Vim
Ben
1
@Ben Saya sudah memperbaiki masalah ini, itu adalah sesuatu yang menyebabkan ini, dan saya salah mengerti ini MyDiff()menjadi sesuatu untuk digunakan ketika menggunakan vim di windows, tapi itu untuk sesuatu untuk menggunakan vim melalui cmd, saya menggunakan vim melalui git bash. Terima kasih.
Kapten Man