Làm cách nào để thoát khỏi các cảnh báo khi mở tệp có tệp .swp?


46

Làm cách nào tôi có thể thoát khỏi các cảnh báo gây phiền nhiễu khi tôi mở tệp có tệp .swp? Hoặc, làm thế nào để tôi không tạo các tệp .swp? Ví dụ cảnh báo:

E325: ATTENTION
Found a swap file by the name ".notes.swp"
          owned by: james   dated: Fri Dec  3 17:38:07 2010
         file name: ~james/school/se/project-dir/rottencucumber/doc/notes
          modified: no
         user name: james   host name: james-laptop
        process ID: 2251 (still running)
While opening file "notes"
             dated: Fri Dec  3 18:46:10 2010
      NEWER than swap file!

(1) Another program may be editing the same file.
    If this is the case, be careful not to end up with two
    different instances of the same file when making changes.
    Quit, or continue with caution.

(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r notes"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".notes.swp"
    to avoid this message.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

Câu trả lời:


44

Thông báo này thực sự khá quan trọng nếu bạn quan tâm đến việc không bị mất văn bản mà bạn có khả năng chưa lưu. không nên được coi là gây phiền nhiễu và không nên khiến bạn vội vàng xóa tệp hoán đổi hoặc cấu hình vimđể chạy mà không có nó.

Bất kỳ tệp nào bạn chỉnh sửa vimsẽ có tệp hoán đổi tương ứng trong khi bạn chỉnh sửa , vimsử dụng để theo dõi các thay đổi. Khi bạn thoát chỉnh sửa một tệp, vimsẽ tự động loại bỏ tệp hoán đổi tương ứng. Do đó, sự tồn tại của một tệp hoán đổi và nỗ lực của bạn để ghi đè lên tệp gốc, nên là nguyên nhân để xem xét và hành động thích hợp.

Hai tình huống được trình bày trong thông báo ( E325: ATTENTION Found a swap file) thực sự khá phổ biến: (1) hoặc một vimchương trình khác đang chỉnh sửa cùng một tệp mà bạn đang cố chỉnh sửa (thực sự có thể là một người khác - trong trường hợp đó thực sự không có ý nghĩa chỉ cần xóa một cách mù quáng tệp hoán đổi - hoặc có thể là bạn trong một cửa sổ hoặc tab thiết bị đầu cuối khác) hoặc (2) một vimphiên trước đó bị hỏng (thường xảy ra khi bạn chỉnh sửa từ xa và phiên mạng bị cắt đứt - trong đó trong trường hợp phiên vim không được thoát bình thường và .swptệp vẫn ở phía sau, một ví dụ khác về kịch bản thứ hai này là bạn đã vô tình đóng cửa sổ đầu cuối hoặc tab có phiên hoạt động hoặc nền vim).

Khi tôi gặp thông báo này, trước tiên tôi nghĩ về việc liệu tôi có đang chỉnh sửa tệp này trong một cửa sổ hoặc tab khác không, vì tôi thường hoạt động với một số cửa sổ đầu cuối với mỗi tab:

nhập mô tả hình ảnh ở đây

Nếu tôi nhận ra rằng tôi đang chỉnh sửa ở một nơi khác và có thể quay lại nó , thì tôi sẽ nhấn qphím cho (Q)uitphiên bổ sung này và quay lại chỉnh sửa thông qua vimphiên ban đầu .

Đôi khi nếu tôi không hoàn toàn chắc chắn, tôi (Q)uitvà sau đó chạy jobsđể xác minh xem tôi có đang chạy vimtrong cùng một thiết bị đầu cuối hay không; nếu không có gì xuất hiện, tôi chạy ps -ef | grep vimđể kiểm tra xem tôi có đang chạy vimở nơi khác không (tức là trong một cửa sổ hoặc tab thiết bị đầu cuối khác). Vấn đề là, tôi luôn cố gắng tiếp tục chỉnh sửa thông qua vimphiên ban đầu .


Nếu tôi chắc chắn rằng tôi không thể quay lại phiên chỉnh sửa ban đầu và tôi vẫn được trình bày với các tùy chọn sau, thì tôi nhấn rvào (R)ecover.

Swap file ".notes.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

Nhấn r, bạn sẽ thấy một thông báo như thế này:

Swap file ".notes.swp" already exists!
"notes" 18L, 46C
Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

Mặt khác, nếu tôi không còn phải đối mặt với các tùy chọn đó nữa, vì tôi đang ở dấu nhắc shell, thì tôi chạy vimvới -rtùy chọn, như sau:

vim -r notes

Thông báo kết quả sẽ tương tự:

Using swap file ".notes.swp"
Original file "/private/tmp/notes"
Recovery completed. Buffer contents equals file contents.
You may want to delete the .swp file now.

Press ENTER or type command to continue

Dù bằng cách nào, nhấn ENTERđể tiếp tục, và bạn sẽ thấy tập tin của bạn.

Lưu ý: Nếu Vim nghi ngờ về những gì nó tìm thấy, nó sẽ đưa ra thông báo lỗi và chèn dòng bằng "???" trong văn bản. Nếu bạn thấy thông báo lỗi trong khi khôi phục, hãy tìm kiếm trong tệp cho "???" để xem những gì là sai. Bạn có thể muốn cắt và dán để có được văn bản bạn cần.

Nhận xét phổ biến nhất là "??? DÒNG NHIỆM VỤ". Điều này có nghĩa là Vim không thể đọc văn bản từ tệp gốc. Điều này có thể xảy ra nếu hệ thống bị sập và các phần của tệp gốc không được lưu.

Điều đó nói rằng, tôi chưa bao giờ nhìn thấy những ???dấu hiệu đó, vì vậy đây phải là một sự xuất hiện thực sự hiếm .


Tiếp theo, lưu (tức là ghi) nội dung vào một tệp khác (thông thường tôi chỉ thêm "2" vào cuối tên tệp gốc):

:w notes2

Tiếp theo, buộc bỏ vimphiên này :

:q!

Tiếp theo, so sánh hai tệp:

diff notes notes2

Nếu difftrả về không có gì , điều đó có nghĩa là không có sự khác biệt và an toàn để xóa cả tệp hoán đổi và tệp thứ hai:

rm .notes.swp notes2

Tại thời điểm này, hãy mở tệp gốc và tiến hành như thể chưa bao giờ có vấn đề:

vim notes

Nếu difftrả về một cái gì đó , điều đó có nghĩa là tệp gốc (thông qua tệp hoán đổi) đã có những thay đổi, nhờ phục hồi, đã được lưu vào tệp thứ hai.

Vì những thay đổi đó được ghi lại trong tệp thứ hai, bạn an toàn để xóa tệp hoán đổi và ghi đè lên tệp gốc bằng tệp thứ hai:

rm .notes.swp
remove .notes.swp? y

mv notes2 notes
overwrite notes? (y/n [n]) y

Tại thời điểm này, hãy mở tệp gốc và tiến hành như thể chưa bao giờ có vấn đề:

vim notes

Điều này có vẻ như rất nhiều công việc, nhưng một khi bạn đã quen với quy trình làm việc, nó sẽ mất tối đa 20 giây.


2
Không thể tin rằng đây không phải là câu trả lời được chấp nhận. Thật hoàn hảo. +1
David

tốt hơn nhiều so với câu trả lời được chấp nhận. Chúc chúng tôi có cách giải quyết chuyện này!
Michael Durrant

1
Không phải lúc nào thông điệp cũng hữu ích. Nếu tôi đang chỉnh sửa một tệp, tôi quan tâm nếu tệp đó đã thay đổi kể từ khi tôi bắt đầu chỉnh sửa , tại thời điểm tôi thử lưu nó , không phải là tôi cũng đang chỉnh sửa nó trong một cửa sổ vim khác. Tôi hoàn toàn ổn khi mở một tệp trong hai thiết bị đầu cuối, miễn là lưu vào tệp không xen kẽ. Vim chỉ thực sự cần cằn nhằn tôi khi tôi cố gắng tiết kiệm chứ không phải khi tôi mở nó.
Ken Simon

Thật không may, điều này không trả lời câu hỏi, nó chỉ nói rằng tôi không nên bỏ qua màn hình cằn nhằn. Kịch bản của tôi là tôi đã mở tệp trong vim (để chỉnh sửa, có thể), muốn xem các phần khác nhau của tệp cùng một lúc và không muốn chia bộ đệm vì clang_complete tiếp tục thay đổi kích thước bộ đệm . Trong trường hợp này, tôi thực sự muốn biết làm thế nào để mở một tệp chỉ đọc trong Vim và bỏ qua tệp hoán đổi.
Lelanthran

@Lelanthranvim -n file_name
user664833

19

Thông báo đã dán cho thấy bạn vẫn mở tệp "ghi chú" trong một phiên Vim khác. Nó chắc chắn không phải là một ý tưởng tốt để chỉnh sửa một tập tin đang được chỉnh sửa ở nơi khác.

Nếu thông báo đó sai, bạn cần xác định cách phiên Vim của bạn thoát không đúng cách và tránh điều đó trong tương lai.

Đối với việc khôi phục, đó có thể là một vấn đề trong trường hợp này vì "ghi chú" mới hơn tệp Vim .swp được liên kết với nó, nhưng bạn vẫn có thể thử. Chỉ cần đảm bảo bạn sao chép tệp "ghi chú" của bạn vào vị trí sao lưu trước.

Nó sẽ là một ý tưởng tốt để đọc qua " :help recover.txt".

Bài học ở đây là bạn không cần phải xem tin nhắn này và bạn có nghĩa là một cái gì đó đã đi sai ở đâu đó. Đó (có lẽ) không phải lỗi của Vim.

Nếu tại thời điểm này, bạn vẫn hoàn toàn quyết tâm không để Vim tạo các tệp .swp để bạn có thể khôi phục sau sự cố và các vấn đề liên quan khác, bạn có thể đặt " set noswapfile" vào ~/.vimrc.


1
HÃY CẨN THẬN! Tôi gần như mất tất cả công việc lộn xộn với VIM. Sao chép mã của bạn trước khi bạn thử bất cứ điều gì.
Squirrl

Tôi thực sự khuyên độc giả nên xem lại câu trả lời của user664833 ( Thông điệp này thực sự khá quan trọng ... ) vì tôi nghĩ rằng nó cung cấp thông tin tốt hơn và lời khuyên rằng câu trả lời này imho
Michael Durrant

11

Bạn có thể sử dụng -n để mở vim mà không cần sử dụng hoán đổi :

Để làm điều này mọi lúc, chỉ cần đặt

alias vim='vim -n' 

trong tệp .bashrc hoặc .bash_aliases của bạn

nếu bạn cần chạy vim mà không có tùy chọn -n, chỉ cần chạy

\vim

3
Tôi không khuyên bạn luôn luôn chạy mà không có hoán đổi, nhưng "-n" thực sự là thứ tôi cần. Tôi sử dụng một tập tin trao đổi, bình thường. Tuy nhiên, khi sử dụng Vim làm công cụ tìm khác biệt, tôi muốn có thể xem các tệp khác nhau mà tôi đang chỉnh sửa mà không có các khác biệt đưa cho tôi thông báo này hoặc can thiệp vào tệp hoán đổi của tôi.
Đặc vụ

1
Tôi thích câu trả lời này - nó ngắn gọn, chính xác và nó trả lời câu hỏi thực tế!
Lelanthran


1

Làm cách nào tôi có thể thoát khỏi các cảnh báo gây phiền nhiễu khi tôi mở tệp có tệp .swp?

Sử dụng tùy chọn tin nhắn ngắn trong ~/.vimrc:

set shortmess=A

Đó cũng là mặc định khi chạy chế độ POSIX.

Tuy nhiên, đừng làm điều này : nó giống như tháo túi khí xe hơi của bạn để tăng hiệu quả nhiên liệu. Về lâu dài, bạn sẽ dành nhiều thời gian để phục hồi hơn bạn từng trả lời câu hỏi.


1
Giả sử hệ thống một người dùng, cấu hình không tệ lắm. Tôi muốn mở nhiều tab thiết bị đầu cuối và đôi khi tôi muốn chỉnh sửa một tệp mà tôi đã chôn trong một số tab khác. Nếu tôi muốn thực hiện một vài chỉnh sửa nhanh thì tốt. Nếu tôi thấy mình trở lại trong cửa sổ vim khác, vẻ đẹp là nó sẽ cảnh báo cho tôi sau đó rằng các tập tin đã thay đổi trước khi tôi tiết kiệm nó, và tôi có thể làm một cách nhanh chóng :eđể xem những gì đang xảy ra (kể cả một cách nhanh chóng uđể undo lại những gì Tôi đã có trong bộ đệm.) Tôi thích điều đó tốt hơn nhiều so với việc bị cằn nhằn về việc đã mở một tập tin.
Ken Simon

1

Điều này xảy ra với tôi khi thiết bị đầu cuối của tôi bất ngờ đóng kết nối của tôi với vi mở.

Rất may tôi không có thay đổi bị mất.

Để xóa cảnh báo đó và loại bỏ trao đổi:

  1. Tìm id quá trình đang xem xét process ID: 2251 (still running), trong trường hợp này là 2251
  2. Xác minh bạn có đúng idps 2251
  3. Giết quá trình sử dụngkill 2251

Và đó là nó.

Hãy nhớ các tệp hoán đổi ở đó để bảo vệ bạn và bạn không nên vô hiệu hóa chúng hoàn toàn.


Nhưng nếu không có vi(m)quá trình thì sao?
Scott

-2

Tôi đã giải quyết vấn đề này bằng ba bước đơn giản:

1 :) Chạy "ls -la" nơi tệp tồn tại để bạn có thể xem tệp .swp cho cùng.

2 :) Bây giờ "rm -i * .swp" tức là xóa tệp ".swp" khỏi thư mục.

3 :) Bây giờ xác nhận wether tệp ".swp" đã bị xóa.

4 :) Bây giờ hãy tận hưởng từ những cảnh báo.


3
Tại sao trên thế giới bạn sẽ đề nghị rm -rfxóa một tập tin? Tôi đã thay thế -rfbằng một thứ hợp lý hơn-i
Nifle 4/215
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.