Tôi không có máy Windows, nhưng tôi có thể tái tạo và tách biệt sự cố này trên hệ thống Mac OS X 10.6.
Tôi sử dụng thư mục tạm thời Vim cụ thể trong thư mục chính của tôi (một lần nữa, không có Windows ở đây) và thêm hai dấu gạch chéo (~/tmp/.vim-swaps//
). Kiểu cài đặt này tập trung các tệp hoán đổi nhưng cung cấp cho chúng các tên duy nhất dựa trên các thư mục của các tệp đang được chỉnh sửa. Xem “Ưu điểm” và “Nhược điểm” trong :help :swapname
cũng như “nếu thư mục kết thúc bằng hai đường phân tách” bit trong :help 'directory'
.
Sử dụng ^=
để thêm vào trước thư mục của bạn (để nó luôn được sử dụng, nếu nó tồn tại):
set directory^=C:\\some\\existing\\directory//
Hoặc, sử dụng +=
để thêm thư mục của bạn (để nó chỉ được sử dụng nếu nó tồn tại và không áp dụng directory
mục khác tồn tại):
set directory+=C:\\some\\existing\\directory//
Charles’ answer gợi ý rằng $TMP
(một tham chiếu đến một biến môi trường) có thể là một giá trị tốt cho Windows:
set directory+=$TMP//
Nguyên nhân sâu xa có liên quan đến các giá trị mặc định của directory
tùy chọn kết hợp với tên đường dẫn của tập tin index :Gdiff
‘s‘giả’.
Bộ đệm cho phía chỉ mục của chế độ xem :Gdiff
sử dụng một tên đường dẫn đặc biệt trông giống như fugitive:///path/to/repository/.git//0/path/to/file/under/repository
(fugitive capture đọc và ghi vào bộ đệm được đặt tên và chuyển hướng chúng đến chỉ mục bằng cách gọi lệnh Git "plumbing").
Mục nhập đầu tiên trong directory
thường là .
. Điều này có nghĩa là Vim sẽ cố gắng đặt swapfile trong cùng thư mục với tệp đã chỉnh sửa (tức là foo/bar.txt
sẽ cố sử dụng foo/.bar.swp
). Nếu không thể tạo swapfile ưu tiên này, thì các mục tiếp theo từ directory
sẽ được thử.
Với .
là directory
đầu tiên, hình thức hoán đổi ưa thích cho fugitive:///path/to/repository/.git//0/path/to/file/under/repository
sẽ là fugitive:///path/to/repository/.git//0/path/to/file/under/.repository.swp
. Các thành phần hàng đầu của tên đường dẫn này (fugitive:
, path
, to
, v.v.) có thể không tồn tại, vì vậy Vim sẽ đi tới mục nhập tiếp theo từ directory
. Nếu không có mục nhập nào khác trong số directory
có thể sử dụng để tạo tệp hoán đổi (ví dụ: chúng không tồn tại), thì bạn sẽ gặp lỗi E302.
Tôi đã có thể tái tạo sự cố của bạn trên hệ thống UNIX-y bằng cách sử dụng set directory=.,~/no-such-dir,/var/no-such-dir,/no-such-dir
(ví dụ: sử dụng giá trị mặc định của Unix và thay đổi các lần xuất hiện tmp
thành no-such-dir
). Không có thư mục “no-such-dir” nào tồn tại. Tôi gặp lỗi tương tự khi sử dụng :Gdiff
.
:help :set^=
chỉ nói “add”, nhưng mã cho thấy set listopt^=…
prepends tương tự như cách set listopt+=…
gắn thêm (như sau này được ghi chép lại để làm). Cả hai sẽ tự động chèn dấu phẩy khi cần thiết (mặc dù có thể có lỗi trong khu vực này).
Tôi đang gặp sự cố tương tự * _exact_ * - vui lòng cho chúng tôi biết nếu/cách bạn giải quyết vấn đề này! – Charles