Cách dễ nhất để xóa các tệp hoán đổi Vim mà tôi đã phục hồi là gì?


84

Đôi khi Vim gặp sự cố và để lại cho tôi một hoán đổi. Thật tuyệt vời. Sau đó, tôi mở tập tin tôi đang chỉnh sửa và Vim hỏi tôi có muốn khôi phục không. Tôi làm, cảm ơn. Khi xong việc, Vim nói với tôi,

You may want to delete the .swp file now.

Tại sao, vâng, tôi làm. Làm thế nào để làm điều đó? Tôi hình dung nó sẽ bắt đầu sử dụng tệp hoán đổi cũ như một bộ trao đổi một lần nữa và dọn sạch nó khi tôi thoát, nhưng điều đó không đúng. Nó tạo một cái mới, dọn sạch cái đó và khi tôi mở lại tập tin, nó sẽ nhắc tôi khôi phục lại từ cái đầu tiên.

Chắc chắn tôi đang thiếu một cái gì đó.


Xem tại đây vi.stackexchange.com/questions/13518/ ' (cũng, màn hình GNU) ở chế độ nền ở đâu đó, xem tại đây vi.stackexchange.com/questions/13518/ mẹo
zenaan

Câu trả lời:


81

Một cách đơn giản hơn một chút:

Từ trình giả lập thiết bị đầu cuối:

vim filename

Sau đó chọn khôi phục và nếu bạn muốn xóa trao đổi bạn viết (lưu) và sau đó thực hiện việc này từ trong vim:

:e          // no argument needed. It assumes the current buffer.

... Và chọn xóa lần này.

Tôi mới phát hiện ra điều này và tôi nghĩ tôi sẽ làm điều đó từ bây giờ. Sau đó, tôi sẽ không vô tình ghi đè lên một tệp đang hoạt động, nếu quá trình khôi phục bị hỏng (mặc dù tôi chưa bao giờ thử điều đó trước đây).

Ngoài ra còn có các mẹo có liên quan về câu hỏi này trên Stack Overflow (nơi tôi tìm thấy mẹo này).


16
Tôi không có deletetùy chọn, chỉ có: [O] pen (E) dit (R) ecover (Q) uit (A) bort, tôi nên làm gì?
Arne

4
@Arne: Từ kinh nghiệm của tôi thường có nghĩa là tệp hiện đang được mở trong một phiên bản khác của vim?
miyalys

1
Tùy chọn elete [D] chỉ xuất hiện sau khi tôi cập nhật lên Vim 7.4
jmlarson

@Arne Tôi có vấn đề tương tự. Nhưng sau một thời gian, khoảng một giờ, tôi đã khởi động lại vim và tùy chọn đã có sẵn. PC đã không được khởi động lại trong thời gian đó. vim có thể nghĩ rằng một quá trình vim khác đang chạy. Đó là lý do tại sao nó không hiển thị tùy chọn.
ka3ak

6
Đối với những người nói rằng họ không thấy một (D)eletetùy chọn, hãy xem :help swap-exists; Trích dẫn On Unix this choice is only offered when the process that created the swap file does not appear to be running.Có lẽ bạn có một quá trình vim khác đang chạy khiến cho tùy chọn này bị ẩn. Nó cũng có thể giải thích tại sao bạn có một swptập tin ở nơi đầu tiên!
Lqueryvg

39

Để dọn sạch TẤT CẢ các tập tin hoán đổi vim trong một thư mục:

Nếu bạn chắc chắn rằng bạn không cần bất kỳ tệp hoán đổi vim nào trong cây thư mục và muốn loại bỏ chúng, bạn có thể sử dụng lệnh sau trong thư mục trong khi vim không chạy (ngay cả trong một cửa sổ khác hoặc thậm chí đăng nhập khác phiên):

find . -type f -name "*.sw[klmnop]" -delete

Một số nguồn cảm hứng và suy nghĩ đến từ việc xóa các tệp .swp rác tại Google Groups. Điều này sẽ xóa tất cả các file có đuôi với .swk, .swl, .swm, .swn, .swo, hoặc .swp trong cây thư mục hiện hành.

Đây có thể không phải là những gì bạn muốn, vì một số lý do:

  • Như đã nêu, nó tìm kiếm cây thư mục hiện tại  ; tức là thư mục hiện tại và tất cả các thư mục con, đệ quy. Điều đó vượt xa những gì câu hỏi yêu cầu, và có thể được coi là quá mức cần thiết.
  • Như đã trình bày, nó sẽ xóa tất cả các file có đuôi với .swk, .swl, .swm, .swn, .swo, hay .swp, và không chỉ .swpGary Johnson nói ,

    Ngoài ra, không phải tất cả các tệp hoán đổi đều kết thúc bằng .swp. Nếu Vim cần tạo tệp hoán đổi và một tệp kết thúc bằng .swp đã tồn tại, Vim sẽ sử dụng phần mở rộng .swo cho tệp mới và .swn sau đó. Tôi nghĩ rằng nó chỉ tiếp tục ngược thông qua bảng chữ cái. Vì vậy, sử dụng một cái gì đó như

      \*.sw[nop] 
    

    hoặc thậm chí

      \*.sw? 
    

    sẽ kỹ lưỡng hơn.

    Tác giả ban đầu của bài viết này nói,

    'klmnop' có thể là quá mức cần thiết, nhưng điều đó thường đảm bảo tôi có được tất cả chúng.

  • Mặt khác, nó có thể không đủ.  đồng rúp gợi ý

    find . -type f \( -name ".*.s[a-v][a-z]" -o -name ".*.sw[a-p]" \) -delete
    

    phù hợp với tất cả các phần mở rộng ba chữ cái (chữ thường) khác nhau từ .saađến .swp. Ông nói thêm, hãy cẩn thận, mặc dù đây là một giải pháp hoàn thiện hơn, nhưng nó sẽ lấy ra bất kỳ tệp hình ảnh .svg và .swf adobe flash. Bạn có thể muốn thay đổi regex nếu bạn làm việc với các tập tin.”Nó cũng phù hợp .sav, .snd(dữ liệu âm thanh), .sql, .src, .srt(SubRip định dạng video phụ đề), và nhiều phần mở rộng phổ biến khác.

  • Nó có thể là quá mức cần thiết. Như đã trình bày, nó sẽ xóa tất cả các file có đuôi với .swk, .swl, .swm, .swn, .swo, hoặc .swp. Nhưng, rõ ràng, các tập tin hoán đổi vim thường là các tập tin dot dot. Nếu bạn chỉnh sửa hello.cpp, tập tin trao đổi có thể là .hello.cpp.swp. Như được hiển thị (nhưng không được giải thích) trong câu trả lời của Rouble , sẽ an toàn hơn khi chỉ xóa các tệp có tên bắt đầu bằng dấu chấm; ví dụ: với

    find . -type f -name ".*.sw[klmnop]" -delete
    

14

Nhập ls -adanh sách TẤT CẢ các tệp trong thư mục

loại rm .whatever.your.swplà và nhấnenter

Nó đơn giản mà.

Bất kỳ tệp nào hiển thị .phía trước là một tệp ẩn và thường không được nhìn thấy.

Hãy nhớ rằng những thay đổi là ngay lập tức và vĩnh viễn vì vậy hãy cẩn thận.


4
Điều đó không đơn giản, mặc dù. Tôi phải rời khỏi Vim, điều hướng thư mục trao đổi, nhớ tên của tệp và có thể quyết định xem nó có file.swphay không file.swo. Sau đó tôi phải trở lại nơi tôi đang ở. Đánh :elà một giải pháp đơn giản hơn nhiều.
Peeja

1
ls: cannot access +A: No such file or directory
Jonathan

đây là những gì tôi cần
user5510975

7

Btw. Một số plugin tự động làm điều đó cho bạn: autoswap.vim

từ mô tả:

  1. Tập tin đã được mở trong một phiên Vim khác trong một số cửa sổ khác chưa?
  2. Nếu vậy, hãy trao đổi với cửa sổ nơi chúng tôi đang chỉnh sửa tệp đó.
  3. Mặt khác, nếu hoán đổi cũ hơn tệp chính nó, hãy loại bỏ nó.
  4. Mặt khác, mở tệp chỉ đọc để chúng tôi có thể xem và có thể lưu tệp.

6
Ai đó có thể cho tôi biết tại sao vim không thể có hành vi hợp lý theo mặc định mà không có plugin không?
Pavel imerda

6

Không, AFAIK bạn không thiếu gì. Vimtiếp tục giữ tệp hoán đổi như một bản sao lưu cho đến khi bạn xóa nó một cách rõ ràng.

Đơn giản chỉ cần lưu và thoát và mở lại cùng một tệp. Bạn sẽ được nhắc (một lần nữa) với

[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort, (D)elete it

Bây giờ chỉ cần nhấn d:)


11
Có thật không? Ý tôi là, tôi biết điều đó. Nhưng đó là ngu ngốc. Nó chắc chắn không "đơn giản".
Peeja

1
Nhân tiện, sự khác biệt giữa bỏ thuốc và bỏ thai là gì?
trusktr

5
không có tùy chọn Xóa trong trường hợp của tôi. tôi nên làm gì? (Tôi đã lưu, thoát và mở lại)
Paschalis

Trước tiên, bạn không cần thoát vim, chỉ cần gõ: e <return> sau khi bạn đã chọn "chỉnh sửa" hoặc "khôi phục" trên tệp và bạn sẽ có tùy chọn xóa nó
00prometheus 17/07/17

2

Vim, giống như hầu hết các lệnh Unix, đơn giản và rõ ràng, thay vì giả định và ẩn.

Bạn phục hồi với (r). Nếu bạn không thích phục hồi hoặc khôi phục bị hỏng, bạn có thể loại bỏ nó. Nếu bạn thích nó, bạn có thể lưu tệp. Tệp khôi phục không bị xóa cho bạn vì điều này không rõ ràng và sẽ không chính xác cho 100% tình huống.

Vì vậy, bạn (r) ecover, (w) rite và (q) uit, sau đó chỉnh sửa lại và chọn (d) elete hoặc "rm .myfile.js.swp" và chỉnh sửa lại. Điều này là nhanh chóng để làm và luôn luôn, theo quan điểm của Vim, hành vi đúng 100%.


Được rồi, có cách nào để vim đưa tôi đường dẫn đến tệp hoán đổi không? Tôi rất vui khi chạy lệnh thứ hai để xóa tệp hoán đổi (thực tế, tôi thích nhân chứng đó), nhưng tôi muốn có lệnh xóa tệp hoán đổi bất cứ nơi nào có. Ví dụ, tôi đã có một thư mục hoán đổi riêng. Nếu hai tệp đang mở có cùng tên cơ sở, tôi không thể quyết định theo chương trình là tệp hoán đổi chính xác cho bộ đệm hiện tại.
Peeja

1
Đúng, nhưng cung cấp tùy chọn "Khôi phục và xóa" đơn giản sẽ tốt. Nó cũng có thể dễ dàng thực hiện tom. Tôi sẽ làm điều đó một ngày nào đó khi tôi đi học xong nếu nó chưa được thực hiện.
trusktr

1
Hầu hết các lệnh unix là đơn giản, rõ ràng và có hành vi mặc định hợp lý. Phục hồi Vim không đơn giản, UX cũng tệ như trong LibreOffice, hành vi hoàn toàn sai và kết quả là, trong nhiều trường hợp, là mất dữ liệu.
Pavel imerda

1

Những tệp này cũng gây khó chịu cho tôi, nhưng tôi đặt tùy chọn trong .vimrc - set noswapfile để ngăn vim tạo nó và thay vào đó, giữ các tệp trong bộ nhớ.


Theo OP, hoán đổi là hữu ích, vì vậy tắt chúng có thể không phải là lựa chọn tốt nhất.
Kusalananda

Đừng tắt các tập tin trao đổi. Nếu máy của bạn gặp sự cố, bạn sẽ mất việc.
Lqueryvg

Tất nhiên tùy chọn này tiềm ẩn rủi ro và như tôi biết các tệp hoán đổi này được tạo ra khi xuất hiện vi * editiors khi sự cố xảy ra rất thường xuyên. Bây giờ tôi có thể nói vim hoạt động ổn định và chúng tồn tại như một thứ di sản, imho.
Dmitrii

1

Dưới đây là một biểu thức chính thức đầy đủ hơn để xóa tất cả các tệp hoán đổi vim dựa trên tệp gitignore của Github cho Vim

$ find ./ -type f \( -name "\.*\.s[a-v][a-z]" -o -name "\.*\.sw[a-p]" \) -delete

Mặc dù vậy, hãy cẩn thận, trong khi đây là một giải pháp hoàn chỉnh hơn, nó sẽ loại bỏ mọi tệp hình ảnh .svg và các tệp flash adobe .swf. Bạn có thể muốn sửa đổi regex nếu bạn làm việc với các tệp đó.


1

Đây là một đoạn để thêm vào .vimrc. Nó xóa tất cả các tệp hoán đổi được liên kết với bộ đệm tệp hiện tại và đặt lại phần mở rộng trao đổi.

function! DeleteFileSwaps()
    write
    let l:output = ''
    redir => l:output 
    silent exec ':sw' 
    redir END 
    let l:current_swap_file = substitute(l:output, '\n', '', '')
    let l:base = substitute(l:current_swap_file, '\v\.\w+$', '', '')
    let l:swap_files = split(glob(l:base.'\.s*'))
    " delete all except the current swap file
    for l:swap_file in l:swap_files
        if !empty(glob(l:swap_file)) && l:swap_file != l:current_swap_file 
            call delete(l:swap_file)
            echo "swap file removed: ".l:swap_file
        endif
    endfor
    " Reset swap file extension to `.swp`.
    set swf! | set swf!
    echo "Reset swap file extension for file: ".expand('%')
endfunction
command! DeleteFileSwaps :call DeleteFileSwaps()

Một khi gặp phải tình huống khó khăn, người ta có thể thực thi :DeleteFileSwaps Điều này thật tuyệt nếu kết hợp với :windohoặc :tabdocác lệnh.

:tabdo DeleteFileSwaps 

Chi tiết khác : Một tệp có thể có nhiều hơn 1 tệp hoán đổi. Lý do bởi vì tệp hoán đổi, với phần mở rộng .swp, vẫn tồn tại và vimsẽ tiếp tục tạo tệp mới vì nó. Để tìm hiểu nếu .swptồn tại:

  • Với tệp đích được mở trong vim, hãy thực thi :swđể lấy tệp hoán đổi hiện tại.
  • Kiểm tra thư mục chứa tập tin hoán đổi hiện tại.
  • Sau đó kiểm tra xem thư mục có chứa tệp hoán đổi với tên của tệp đang mở hay không và có phần mở rộng là .swp.

Đoạn mã trên tuân theo quy trình tương tự, nhưng xóa tất cả các tệp hoán đổi.

Hi vọng điêu nay co ich.


0

Từ hướng dẫn :h swap:

Bạn có thể thấy tên của tệp hoán đổi hiện tại đang được sử dụng với lệnh: :sw[apname]


Cảnh báo ... có thể đó không phải là tên của tệp bạn cần xóa. Cho đến khi bạn xóa .swptệp, :swlệnh có thể sẽ cung cấp cho bạn tên của .swotệp - đó không phải là thứ bạn muốn xóa.
Lqueryvg

0

nếu bạn được hỏi thì nhấn Dđể xóa tập tin hoán đổi của tập tin hiện tại.

nếu bạn không thì bạn phải làm bằng tay.

một cách khác để làm điều này là:

để định vị / tìm kiếm tập tin:

find | grep ".searchRefineVertTabs.jsp.swp"

và sau đó xóa tệp này:

rm ./.searchRefineVertTabs.jsp.swp

1
Tôi được hỏi, nhưng lựa chọn của tôi là để phục hồi . Câu hỏi là làm thế nào để xóa nó ngay sau khi tôi phục hồi, vì nó không còn cần thiết nữa. Có vẻ như một thất bại của vim không làm điều đó cho tôi. Nhưng câu trả lời được chấp nhận là quy trình làm việc sạch nhất mà tôi tìm thấy cho đến nay.
Peeja

-1

Bạn có thể dùng,

rm -f .<filename>.<ext>.swp

Thí dụ:

rm -f .rc.local.swp

Điều này về mặt kỹ thuật hoạt động, nhưng không dễ dàng gì với câu trả lời được chấp nhận hiện tại.
Peeja 18/03/2015

Plus <ext>là dự phòng ở đây vì tên tệp ít nhất là trên Linux bao gồm 0 hoặc nhiều phần mở rộng.
Pavel imerda
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.