วิธีที่ง่ายที่สุดในการลบ Vim swapfiles ที่ฉันกู้คืนมาแล้วคืออะไร?


84

บางครั้งเสียงเรียกเข้าล้มเหลวและทำให้ฉันเป็น swapfile ที่น่ากลัว. จากนั้นฉันเปิดไฟล์ที่ฉันแก้ไขและ Vim ถามฉันว่าฉันต้องการกู้คืนหรือไม่ ฉันทำขอบคุณ เมื่อเสร็จสิ้นเป็นกลุ่มบอกฉัน

You may want to delete the .swp file now.

ทำไมใช่ฉันทำ ฉันจะทำอย่างไร ฉันคิดว่ามันจะเริ่มใช้ swapfile เก่าเป็น swapfile อีกครั้งและทำความสะอาดเมื่อฉันออก แต่ก็ไม่เป็นความจริง มันสร้างขึ้นใหม่ทำความสะอาดไฟล์นั้นและเมื่อฉันเปิดไฟล์อีกครั้งมันจะแจ้งให้ฉันอีกครั้งเพื่อกู้คืนจากไฟล์แรก

แน่นอนว่าฉันขาดอะไรไป


ดูที่นี่vi.stackexchange.com/questions/13518/… "ตัวเลือก" ลบมัน "จะไม่ปรากฏขึ้นหากกระบวนการ Vim ยังคงทำงานอยู่" และบันทึกช่วงความคิดเห็นเกี่ยวกับ TMUX เช่นคุณต้องแน่ใจว่าคุณไม่มี Vim ที่ยังทำงานอยู่ (ยัง GNU หน้าจอ) ในพื้นหลังบางดูที่นี่vi.stackexchange.com/questions/13518/...
zenaan

คำตอบ:


81

วิธีที่ง่ายกว่าเล็กน้อย:

จากเทอร์มินัลอีมูเลเตอร์:

vim filename

จากนั้นเลือกกู้คืนและถ้าคุณต้องการลบการแลกเปลี่ยนที่คุณเขียน (บันทึก) แล้วทำสิ่งนี้จากภายในกลุ่ม:

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

... และเลือกลบในเวลานี้

ฉันเพิ่งพบสิ่งนี้และฉันคิดว่าฉันจะทำอย่างนั้น จากนั้นฉันจะไม่เขียนทับไฟล์ทำงานโดยไม่ตั้งใจถ้าการกู้คืนกลายเป็นความเสียหาย (แม้ว่าฉันไม่เคยลองมาก่อน)

นอกจากนี้ยังมีเคล็ดลับที่เกี่ยวข้องกับคำถามนี้ใน Stack Overflow (ที่ฉันพบเคล็ดลับนี้)


16
ฉันไม่มีdeleteทางเลือกมีเพียง: [O] ปากกา (E) dit (R) ecover (Q) uit (A) bort ฉันควรทำอย่างไร
Arne

4
@Arne: จากประสบการณ์ของฉันที่มักจะหมายถึงไฟล์ที่เปิดอยู่ในอินสแตนซ์อื่นของกลุ่ม?
miyalys

1
ตัวเลือก elete [D] ปรากฏขึ้นหลังจากที่ฉันอัปเดตเป็นกลุ่ม 7.4
jmlarson

@ Arne ฉันมีปัญหาเดียวกัน แต่หลังจากเวลาผ่านไปประมาณชั่วโมงหรือมากกว่านั้นฉันก็เริ่ม vim และตัวเลือกก็ใช้ได้ พีซีไม่รีสตาร์ทในเวลานั้น กลุ่มอาจคิดว่ากระบวนการกลุ่มอื่นกำลังทำงานอยู่ นั่นเป็นเหตุผลที่มันไม่แสดงตัวเลือก
ka3ak

6
สำหรับผู้ที่กล่าวว่าพวกเขาไม่เห็น(D)eleteตัวเลือกให้ดู:help swap-exists; quote On Unix this choice is only offered when the process that created the swap file does not appear to be running.Ie บางทีคุณอาจมีขั้นตอนการเรียกใช้อีกอันซึ่งทำให้ตัวเลือกนี้ถูกซ่อนอยู่ มันอาจอธิบายได้ว่าทำไมคุณถึงมีswpไฟล์ในตอนแรก!
Lqueryvg

39

วิธีล้างไฟล์ vim ทั้งหมดในไดเรกทอรี:

หากคุณแน่ใจว่าคุณไม่ต้องการไฟล์ vim swap ในแผนผังไดเร็กทอรีและต้องการกำจัดไฟล์เหล่านั้นคุณสามารถใช้คำสั่งต่อไปนี้ในไดเร็กทอรีในขณะที่ vim ไม่ทำงาน (ไม่ใช่แม้แต่ในหน้าต่างอื่นหรือแม้แต่ล็อกอินอื่น เซสชั่น):

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

แรงบันดาลใจและความคิดบางอย่างมาจากการลบไฟล์ขยะ. swp ที่ Google Groups นี้จะลบไฟล์ทั้งหมดที่มีชื่อลงท้ายด้วย.swk, .swl, .swm, .swn, .swoหรือ.swp ในต้นไม้ไดเรกทอรีปัจจุบัน

นี่อาจไม่ใช่สิ่งที่คุณต้องการด้วยเหตุผลหลายประการ:

  • ตามที่ระบุไว้จะค้นหาไดเรกทอรีปัจจุบันต้นไม้  ; เช่นไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมดซ้ำ นั่นเป็นสิ่งที่เกินกว่าที่คำถามจะถามและอาจได้รับการพิจารณาว่ามีราคาแพงเกินไป
  • ตามที่ระบุไว้ก็จะลบไฟล์ทั้งหมดที่มีชื่อลงท้ายด้วย.swk, .swl, .swm, .swn, .swoหรือและไม่เพียง  .swp แกรี่จอห์นสันกล่าวว่า ,.swp

    นอกจากนี้ไฟล์สลับบางไฟล์ไม่ได้ลงท้ายด้วย. swp หาก Vim ต้องการสร้างไฟล์ swap และมีไฟล์ลงท้ายด้วย. swp อยู่แล้ว Vim จะใช้นามสกุล. swo สำหรับไฟล์ใหม่และ. swn หลังจากนั้น ฉันคิดว่ามันแค่ย้อนกลับต่อไปตามตัวอักษร ดังนั้นการใช้สิ่งที่ชอบ

      \*.sw[nop] 
    

    หรือแม้กระทั่ง

      \*.sw? 
    

    จะละเอียดยิ่งขึ้น

    ผู้เขียนต้นฉบับของโพสต์นี้กล่าวว่า

    'klmnop' อาจ overkill แต่นั่นมักจะทำให้แน่ใจว่าฉันได้รับทั้งหมด

  • ในทางกลับกันมันอาจจะต่ำกว่าความเป็นจริง  รูเบิล แนะนำ

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

    ซึ่งตรงส่วนขยาย (กรณีที่ต่ำกว่า) สามตัวอักษรตั้งแต่การ.saa .swpเขากล่าวเสริมว่า“ ระวังด้วยแม้ว่านี่จะเป็นวิธีการแก้ปัญหาที่สมบูรณ์ยิ่งขึ้น แต่ก็จะลบไฟล์รูปภาพ. svg และไฟล์. swf adobe flash ออก คุณอาจต้องการที่จะปรับเปลี่ยน regex ถ้าคุณทำงานกับไฟล์เหล่านั้น.” นอกจากนี้ยังตรง.sav, .snd(ข้อมูลเสียง) .sql, .src, .srt(SubRip รูปแบบวิดีโอคำบรรยาย) และอีกหลายส่วนขยายทั่วไปอื่น ๆ

  • มันอาจจะเกินกำลัง ตามที่ระบุไว้ก็จะลบไฟล์ทั้งหมดที่มีชื่อลงท้ายด้วย.swk, .swl, .swm, .swn, หรือ.swo .swpแต่ที่เห็นได้ชัดคือไฟล์ swap vim มักจะเป็นไฟล์“ dot” ถ้าคุณแก้ไขไฟล์แลกเปลี่ยนอาจจะมีhello.cpp .hello.cpp.swpตามที่แสดง (แต่ไม่ได้อธิบาย) ในคำตอบของ roubleเป็นการดีกว่าที่จะลบเฉพาะไฟล์ที่ชื่อขึ้นต้นด้วยจุด เช่นกับ

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

14

พิมพ์ls -aรายการไฟล์ทั้งหมดในไดเรกทอรี

ประเภทrm .whatever.your.swpคือและกดenter

มันง่ายที่

ไฟล์ใด ๆ ที่แสดงด้วย.ด้านหน้าคือไฟล์ที่ซ่อนอยู่และไม่สามารถมองเห็นได้ตามปกติ

โปรดจำไว้ว่าการเปลี่ยนแปลงนั้นเกิดขึ้นทันทีและถาวรดังนั้นโปรดระมัดระวัง


4
แม้ว่ามันจะไม่ง่ายนัก ผมต้องออกจากกลุ่มไปไดเรกทอรีแลกเปลี่ยนจำชื่อของไฟล์และอาจตัดสินใจไม่ว่าจะเป็นหรือfile.swp file.swoจากนั้นฉันต้องกลับไปยังที่ที่ฉันอยู่ การกดปุ่ม:eเป็นวิธีที่ง่ายกว่ามาก
Peeja

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

นี่คือสิ่งที่ฉันต้องการ
user5510975

7

Btw ปลั๊กอินบางตัวทำเช่นนั้นโดยอัตโนมัติสำหรับคุณ: autoswap.vim

จากคำอธิบาย:

  1. ไฟล์เปิดอยู่ในเซสชัน Vim อื่นในหน้าต่างอื่นบ้างหรือไม่?
  2. ถ้าเป็นเช่นนั้นให้สลับไปที่หน้าต่างที่เรากำลังแก้ไขไฟล์นั้น
  3. มิฉะนั้นถ้า swapfile นั้นเก่ากว่าไฟล์นั้นให้กำจัดทิ้งไป
  4. มิฉะนั้นเปิดไฟล์แบบอ่านอย่างเดียวเพื่อให้เราสามารถดูได้และอาจบันทึกไว้

6
ใครสามารถบอกฉันได้ว่าทำไมเสียงเรียกเข้าไม่สามารถมีพฤติกรรมที่เหมาะสมตามค่าเริ่มต้นโดยไม่มีปลั๊กอินได้
Pavel Šimerda

6

ไม่ AFAIK คุณไม่พลาดอะไรเลย Vimยังคงเก็บ swapfile ไว้เป็นข้อมูลสำรองจนกว่าคุณจะลบออกอย่างชัดเจน

เพียงบันทึกและปิดและเปิดไฟล์เดียวกันอีกครั้ง คุณจะได้รับแจ้ง (อีกครั้ง) ด้วย

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

ตอนนี้แค่กดd:)


11
จริงๆ? ฉันหมายความว่าฉันรู้ แต่นั่นโง่ แน่นอนว่ามันไม่ "ง่าย"
Peeja

1
โดยวิธีการที่แตกต่างระหว่างเลิกและยกเลิกคืออะไร?
trusktr

5
ไม่มีตัวเลือกลบในกรณีของฉัน ฉันควรทำอย่างไร? (ฉันบันทึกออกจากและเปิดใหม่อีกครั้ง)
Paschalis

คุณไม่จำเป็นต้องออกจากกลุ่มก่อนพิมพ์เพียง: e <return> เมื่อคุณเลือก "แก้ไขต่อไป" หรือ "กู้คืน" ในไฟล์และคุณจะได้รับตัวเลือกให้ลบ
00prometheus

2

Vim เช่นเดียวกับคำสั่ง Unix ส่วนใหญ่นั้นเรียบง่ายและชัดเจนมากกว่าที่จะสมมติและโดยปริยาย

คุณกู้คืนด้วย (r) คุณไม่ชอบการกู้คืนหรือการกู้คืนเกิดความเสียหายคุณสามารถยกเลิกได้ หากคุณชอบคุณสามารถบันทึกไฟล์ได้ ไฟล์กู้คืนจะไม่ถูกลบสำหรับคุณเนื่องจากไม่ชัดเจนและจะไม่ถูกต้องสำหรับ 100% ของสถานการณ์

ดังนั้นคุณ (r) ecover, (w) พิธีกรรมและ (q) uit จากนั้นแก้ไขอีกครั้งและเลือก (d) elete หรือ "rm .myfile.js.swp" และแก้ไขอีกครั้ง นี่เป็นสิ่งที่ต้องทำอย่างรวดเร็วและอยู่เสมอจากมุมมองของ Vim พฤติกรรมที่ถูกต้อง 100%


ตกลงแล้วมีวิธีรับเป็นกลุ่มเพื่อให้ฉันเส้นทางไปยังไฟล์ swap หรือไม่ ฉันยินดีที่จะเรียกใช้คำสั่งที่สองเพื่อลบ swapfile (อันที่จริงฉันชอบ explicitness ของที่) แต่ฉันต้องการคำสั่งให้ลบ swapfile ไม่ว่าจะอยู่ที่ไหน ตัวอย่างเช่นฉันมีไดเรกทอรี swapfile แยกต่างหาก หากไฟล์เปิดสองไฟล์มีชื่อไฟล์เหมือนกันฉันไม่สามารถตัดสินใจได้โดยทางโปรแกรมว่า swapfile ที่ถูกต้องสำหรับบัฟเฟอร์ปัจจุบันคืออะไร
Peeja

1
จริง แต่ให้ตัวเลือก "กู้คืนและลบ" อย่างง่ายจะดี นอกจากนี้ยังอาจใช้งานง่ายทอม ฉันจะทำวันหนึ่งเมื่อฉันไปโรงเรียนถ้ายังไม่ได้ทำ
trusktr

1
คำสั่ง unix ส่วนใหญ่นั้นเรียบง่ายชัดเจนและมีพฤติกรรมเริ่มต้นที่เหมาะสม การกู้คืนเสียงเรียกเข้านั้นไม่ง่าย UX นั้นแย่ใน LibreOffice พฤติกรรมนั้นผิดปกติและผลลัพธ์ในหลาย ๆ กรณีคือการสูญเสียข้อมูล
Pavel Šimerda

1

ไฟล์เหล่านี้ก็น่ารำคาญสำหรับฉันเช่นกัน แต่ฉันตั้งค่าตัวเลือกใน. vimrc - set noswapfile เพื่อป้องกันไม่ให้ vim สร้างมันและเก็บไฟล์ไว้ในหน่วยความจำแทน


ตาม OP แล้ว swapfiles นั้นมีประโยชน์ดังนั้นการปิดมันอาจไม่ใช่ตัวเลือกที่ดีที่สุด
Kusalananda

อย่าปิดไฟล์ swap หากเครื่องของคุณขัดข้องคุณจะสูญเสียงานของคุณ
Lqueryvg

แน่นอนว่าตัวเลือกนี้แสดงถึงความเสี่ยงและอย่างที่ฉันรู้ว่าไฟล์สวอปเหล่านี้เกิดขึ้นเมื่อมีการแก้ไข vi * เมื่อเกิดข้อผิดพลาดบ่อยครั้งมาก ตอนนี้ฉันสามารถพูดได้ว่าเสียงเรียกเข้าทำงานได้อย่างเสถียรและพวกมันก็มีอยู่เหมือนมรดก
Dmitrii

1

นี่คือ regex ที่สมบูรณ์มากขึ้นในการล้างไฟล์ vim swap ทั้งหมดตามไฟล์ gitignore ของ Github สำหรับVim

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

ระวังแม้ว่าในขณะนี้จะเป็นวิธีการแก้ปัญหาที่สมบูรณ์ยิ่งขึ้น แต่ก็จะลบไฟล์รูปภาพ. svg และไฟล์. swf adobe flash ออก คุณอาจต้องการแก้ไข regex หากคุณทำงานกับไฟล์เหล่านั้น


1

.vimrcนี่คือตัวอย่างที่จะเพิ่มใน จะลบไฟล์ swap ทั้งหมดที่เกี่ยวข้องกับบัฟเฟอร์ไฟล์ปัจจุบันและรีเซ็ตส่วนขยาย swap

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()

เมื่อพบกับสถานการณ์หนึ่งสามารถดำเนินการ:DeleteFileSwaps นี้เป็นที่ดีถ้ารวมกับ:windoหรือ:tabdoคำสั่ง

:tabdo DeleteFileSwaps 

รายละเอียดเพิ่มเติม : ไฟล์สามารถมีไฟล์สลับได้มากกว่า 1 ไฟล์ เหตุผลเนื่องจากไฟล์ swap ที่มีนามสกุล.swpยังคงมีอยู่และvimจะสร้างไฟล์ใหม่เพราะมัน หากต้องการทราบว่า.swpมีอยู่จริง:

  • เมื่อไฟล์เป้าหมายเปิดเป็นกลุ่มให้เรียกใช้:swเพื่อรับไฟล์สลับปัจจุบัน
  • ตรวจสอบไดเรกทอรีที่มีไฟล์ swap ปัจจุบันอยู่
  • จากนั้นตรวจสอบว่าไดเรกทอรีมีไฟล์สลับที่มีชื่อไฟล์เปิดอยู่และมีนามสกุล.swpอยู่หรือไม่

ตัวอย่างด้านบนเป็นไปตามกระบวนการเดียวกัน แต่ลบไฟล์ swap ทั้งหมด

หวังว่านี่จะช่วยได้


0

จากคู่มือ:h swap:

คุณสามารถเห็นชื่อของไฟล์แลกเปลี่ยนปัจจุบันที่ใช้กับคำสั่ง: :sw[apname]


คำเตือน ... นั่นอาจไม่ใช่ชื่อของไฟล์ที่คุณต้องลบ จนกว่าคุณจะลบ.swpไฟล์:swคำสั่งอาจจะให้ชื่อ.swoไฟล์แก่คุณ- ซึ่งไม่ใช่สิ่งที่คุณต้องการลบ
Lqueryvg

0

หากระบบขอให้คุณกดDเพื่อลบไฟล์สลับปัจจุบันของไฟล์

หากคุณไม่ได้คุณต้องทำด้วยตนเอง

อีกทางเลือกหนึ่งในการทำเช่นนี้คือ:

เพื่อค้นหา / ค้นหาไฟล์:

find | grep ".searchRefineVertTabs.jsp.swp"

แล้วลบไฟล์นี้:

rm ./.searchRefineVertTabs.jsp.swp

1
ผมกำลังถาม แต่ทางเลือกของฉันคือการกู้คืน คำถามคือวิธีลบหลังจากกู้คืนมาแล้วเนื่องจากไม่จำเป็นอีกต่อไป ดูเหมือนความล้มเหลวของกลุ่มที่ไม่ทำสำหรับฉัน แต่คำตอบที่ได้รับการยอมรับคือขั้นตอนการทำงานที่สะอาดที่สุดที่ฉันเคยพบ
Peeja

-1

คุณสามารถใช้ได้,

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

ตัวอย่าง:

rm -f .rc.local.swp

เทคนิคนี้ใช้งานได้ แต่ไม่มีที่ไหนใกล้ได้ง่ายเหมือนคำตอบที่ยอมรับในปัจจุบัน
Peeja

<ext>เครื่องหมายบวกซ้ำซ้อนที่นี่เนื่องจากชื่อไฟล์อย่างน้อยบน Linux จะมีนามสกุลเป็นศูนย์หรือมากกว่า
Pavel Šimerda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.