วิธีกำจัดคำเตือนเมื่อเปิดไฟล์ที่มีไฟล์. swp


44

ฉันจะกำจัดคำเตือนที่น่ารำคาญได้อย่างไรเมื่อฉันเปิดไฟล์ที่มีไฟล์. swp หรือฉันจะไม่สร้างไฟล์. swp ได้อย่างไร? คำเตือนตัวอย่าง:

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:

คำตอบ:


42

ข้อความนี้ค่อนข้างสำคัญหากคุณสนใจที่จะไม่สูญเสียข้อความที่คุณไม่ได้บันทึก ไม่ควรถือว่าน่ารำคาญและไม่ควรทำให้คุณลบไฟล์ swap หรือกำหนดค่าvimให้รันโดยไม่ต้องรีบ

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

ทั้งสองสถานการณ์ที่นำเสนอในข้อความ ( E325: ATTENTION Found a swap file) เป็นจริงค่อนข้างทั่วไป: (1)อย่างใดอย่างหนึ่งอีกvimโปรแกรมแก้ไขไฟล์เดียวกันที่คุณกำลังพยายามที่จะแก้ไข (มันจริงอาจจะเป็นคนอื่น - ในกรณีที่มันจริงๆจะไม่ทำให้รู้สึก เพื่อลบไฟล์ swap อย่างสุ่มสี่สุ่มห้า - หรืออาจเป็นคุณในหน้าต่างเทอร์มินัลหรือแท็บอื่น) หรือ(2)vimเซสชันก่อนหน้าล้มเหลว (ส่วนใหญ่เกิดขึ้นเมื่อคุณแก้ไขจากระยะไกลและเซสชันเครือข่ายขาด - ในกรณีที่เซสชัน vim ไม่ได้ออกตามปกติและ.swpไฟล์ยังคงอยู่เบื้องหลังตัวอย่างอื่นของสถานการณ์จำลองที่สองนี้คือคุณได้ปิดหน้าต่างเทอร์มินัลหรือแท็บที่บังเอิญvimเซสชันหรือแบ็คกราวน์อยู่โดยไม่ตั้งใจ)

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

ป้อนคำอธิบายรูปภาพที่นี่

หากฉันรู้ว่าฉันกำลังแก้ไขในที่อื่นและสามารถกลับไปที่เดิมได้ฉันก็กดqปุ่มไปที่(Q)uitเซสชันเพิ่มเติมนี้และกลับไปแก้ไขผ่านvimเซสชันเดิม

บางครั้งถ้าฉันไม่แน่ใจทั้งหมดฉัน(Q)uitแล้วเรียกใช้jobsเพื่อตรวจสอบว่าฉันกำลังทำงานvimในสถานีเดียวกันแน่นอน; หากไม่มีอะไรเกิดขึ้นฉันps -ef | grep vimจะตรวจสอบว่าฉันทำงานอยู่vimที่อื่นหรือไม่ (เช่นในหน้าต่างเทอร์มินัลหรือแท็บอื่น) ประเด็นคือฉันพยายามที่จะทำการแก้ไขต่อผ่านvimเซสชันเดิมเสมอ


ถ้าผมมั่นใจว่าผมไม่สามารถกลับไปแก้ไขเซสชั่นเดิมและฉันกำลังนำเสนอยังคงอยู่กับตัวเลือกต่อไปแล้วผมก็กดไปr(R)ecover

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

กดrคุณจะเห็นข้อความดังนี้:

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

ในทางกลับกันถ้าฉันไม่ต้องเผชิญหน้ากับตัวเลือกเหล่านั้นอีกต่อไปเพราะฉันอยู่ที่พรอมต์เชลล์แล้วฉันก็รันvimด้วย-rตัวเลือกดังต่อไปนี้:

vim -r notes

ข้อความผลลัพธ์จะคล้ายกัน:

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

ทั้งสองวิธีกดENTERเพื่อดำเนินการต่อและคุณจะเห็นไฟล์ของคุณ

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

คำพูดที่พบบ่อยที่สุดคือ "??? LINES MISSING" ซึ่งหมายความว่า Vim ไม่สามารถอ่านข้อความจากไฟล์ต้นฉบับ สิ่งนี้อาจเกิดขึ้นได้หากระบบขัดข้องและบางส่วนของไฟล์ต้นฉบับไม่ได้รับการบันทึก

ที่กล่าวว่าฉันไม่เคยเห็น???เครื่องหมายเหล่านั้นดังนั้นนี่จะเป็นเหตุการณ์ที่เกิดขึ้นได้ยาก


ต่อไปให้บันทึก (เช่นเขียน) เนื้อหาไปยังไฟล์อื่น (โดยปกติฉันจะต่อท้าย "2" ต่อท้ายชื่อไฟล์ต้นฉบับ):

:w notes2

ถัดไปบังคับปิดvimเซสชันนี้:

:q!

ถัดไปเปรียบเทียบสองไฟล์:

diff notes notes2

หากdiffไม่มีการคืนค่านั่นหมายความว่าไม่มีความแตกต่างและปลอดภัยที่จะลบทั้งไฟล์ swap และไฟล์ที่สอง:

rm .notes.swp notes2

ถึงตอนนี้เปิดไฟล์ต้นฉบับและดำเนินการต่อราวกับว่าไม่เคยมีปัญหา:

vim notes

หากdiffส่งคืนบางสิ่งนั่นหมายถึงไฟล์ต้นฉบับ (ผ่านไฟล์สลับ) มีการเปลี่ยนแปลงที่บันทึกไว้ในการกู้คืนด้วยไฟล์ที่สอง

เนื่องจากการเปลี่ยนแปลงเหล่านั้นถูกบันทึกในไฟล์ที่สองคุณจึงปลอดภัยในการลบไฟล์ swap และเขียนทับไฟล์ต้นฉบับด้วยไฟล์ที่สอง:

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

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

ถึงตอนนี้เปิดไฟล์ต้นฉบับและดำเนินการต่อราวกับว่าไม่เคยมีปัญหา:

vim notes

ดูเหมือนว่าจะใช้งานได้มากมาย แต่เมื่อคุณคุ้นเคยกับขั้นตอนการทำงานจะใช้เวลาสูงสุด 20 วินาที


2
ไม่อยากเชื่อเลยว่านี่ไม่ใช่คำตอบที่ยอมรับ มันสมบูรณ์แบบ. +1
David

ดีกว่าคำตอบที่ได้รับการยอมรับ หวังว่าเราจะมีวิธีแก้ปัญหานี้!
Michael Durrant

1
ไม่ใช่กรณีที่ข้อความมีประโยชน์เสมอไป ถ้าฉันแก้ไขไฟล์ฉันสนใจว่าไฟล์นั้นมีการเปลี่ยนแปลงหรือไม่ตั้งแต่ฉันเริ่มแก้ไขในขณะนี้ฉันลองบันทึกไม่ว่าฉันจะแก้ไขในหน้าต่าง vim อื่นหรือไม่ เป็นเรื่องที่ดีมากที่ฉันจะเปิดไฟล์ในสองเทอร์มินัลตราบใดที่การบันทึกไฟล์ไม่แทรก เสียงเรียกเข้าจะต้องจู้จี้ฉันจริงๆเมื่อฉันพยายามบันทึกไม่ใช่เมื่อเปิด
Ken Simon

น่าเสียดายที่นี่ไม่ได้ตอบคำถามมันบอกเพียงว่าฉันไม่ควรละเลยหน้าจอจู้จี้ สถานการณ์ของฉันคือฉันได้เปิดไฟล์ใน vim (สำหรับการแก้ไขหรืออาจ) ต้องการดูส่วนต่าง ๆ ของไฟล์ในเวลาเดียวกันและไม่ต้องการบัฟเฟอร์แยกเนื่องจาก clang_complete ยังคงปรับขนาดบัฟเฟอร์ . ในกรณีนี้ฉันต้องการทราบวิธีการเปิดไฟล์แบบอ่านอย่างเดียวใน Vim และให้ละเว้นไฟล์ swap
Lelanthran

@Lelanthranvim -n file_name
664833

19

ข้อความที่วางแนะนำว่าคุณยังคงมีไฟล์ "บันทึกย่อ" ที่เปิดในเซสชัน Vim อื่น ไม่ใช่ความคิดที่ดีที่จะแก้ไขไฟล์ที่ถูกแก้ไขที่อื่น

หากข้อความนั้นไม่ถูกต้องคุณต้องพิจารณาว่าเซสชัน Vim ของคุณออกมาไม่ถูกต้องและหลีกเลี่ยงสิ่งนั้นในอนาคต

สำหรับการกู้คืนอาจเป็นปัญหาในอินสแตนซ์นี้เนื่องจาก "notes" ใหม่กว่าไฟล์ Vim .swp ที่เกี่ยวข้อง แต่คุณยังสามารถลองใช้ได้ เพียงให้แน่ใจว่าคุณคัดลอกไฟล์ "บันทึกย่อ" ของคุณไปยังตำแหน่งสำรองก่อน

เป็นความคิดที่ดีที่จะอ่าน " :help recover.txt"

บทเรียนที่นี่คือคุณไม่ควรที่จะเห็นข้อความนี้และคุณหมายถึงบางสิ่งผิดไปจากที่ไหนสักแห่ง มันอาจจะไม่ใช่ความผิดของ Vim

หากจุดนี้คุณจะยังคงมุ่งมั่นอย่างยิ่งที่จะไม่ให้เป็นกลุ่มสร้างไฟล์ .swp เพื่อให้คุณสามารถกู้คืนจากการเกิดความผิดพลาดและปัญหาอื่น ๆ ที่เกี่ยวข้องกับคุณอาจใส่ " set noswapfile" ~/.vimrcใน


1
ระวัง! ฉันเกือบจะสูญเสียงานที่ทำไปทั้งหมดด้วย VIM คัดลอกรหัสของคุณก่อนที่คุณจะลองทำอะไร
Squirrl

ฉันขอแนะนำให้ผู้อ่านตรวจสอบคำตอบโดยผู้ใช้ 664833 ( ข้อความนี้มีความสำคัญจริง ๆ ... ) เนื่องจากฉันคิดว่ามันให้ข้อมูลที่ดีขึ้นมากและให้คำแนะนำว่าคำตอบนี้ imho
Michael Durrant

11

คุณสามารถใช้ -n เพื่อเปิด vim โดยไม่ต้องใช้ swapfile :

ในการทำเช่นนี้ตลอดเวลาเพียงแค่ใส่

alias vim='vim -n' 

ในไฟล์. bashrc หรือ. bash_aliases ของคุณ

หากคุณจำเป็นต้องเรียกใช้ vim โดยไม่มีตัวเลือก -n เพียงแค่เรียกใช้

\vim

3
ฉันจะไม่แนะนำให้ทำงานตลอดเวลาโดยไม่มี swapfile แต่ "-n" นั้นเป็นสิ่งที่ฉันต้องการจริงๆ ฉันใช้ไฟล์ swap ตามปกติ อย่างไรก็ตามเมื่อใช้ Vim เป็นเครื่องมือ diff ฉันต้องการที่จะดู diffs ของไฟล์ที่ฉันแก้ไขโดยไม่ต่างกันจะทำให้ฉันมีข้อความนี้หรือรบกวนไฟล์ swap ของฉัน
Agentlien

1
ฉันชอบคำตอบนี้ - มันสั้นมันแม่นยำและตอบคำถามจริง!
Lelanthran


1

ฉันจะกำจัดคำเตือนที่น่ารำคาญได้อย่างไรเมื่อฉันเปิดไฟล์ที่มีไฟล์. swp

ใช้ตัวเลือกข้อความสั้น ๆใน~/.vimrc:

set shortmess=A

ซึ่งยังเป็นค่าเริ่มต้นเมื่อใช้โหมด POSIX

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


1
สมมติว่ามีระบบผู้ใช้คนเดียวมันไม่ได้เป็นเรื่องที่น่ากลัวของการกำหนดค่า ฉันชอบเปิดแท็บเทอร์มินัลจำนวนมากและบางครั้งฉันต้องการแก้ไขไฟล์ที่ฝังไว้ในแท็บอื่นแล้ว ถ้าฉันต้องการทำการแก้ไขอย่างรวดเร็วไม่กี่อย่างนั้นก็ดี ถ้าฉันพบว่าตัวเองกลับมาอยู่ในหน้าต่างที่เป็นกลุ่มอื่น ๆ , ความงามก็คือว่ามันจะเตือนฉันแล้วว่าไฟล์ที่มีการเปลี่ยนแปลงก่อนที่ผมจะบันทึกมันและฉันสามารถทำได้อย่างรวดเร็ว:eเพื่อดูสิ่งที่เกิดขึ้น (รวมอย่างรวดเร็วuเพื่อยกเลิกกลับไปที่สิ่ง ฉันมีในบัฟเฟอร์.) ฉันชอบที่ดีกว่าถูกดุเกี่ยวกับการเปิดไฟล์แล้ว
เคนไซมอน

1

สิ่งนี้เกิดขึ้นกับฉันเมื่อเทอร์มินัลปิดการเชื่อมต่อของฉันกับ vi เปิดโดยไม่คาดคิด

โชคดีที่ฉันไม่มีการเปลี่ยนแปลงที่หายไป

หากต้องการลบคำเตือนนั้นและยกเลิกการแลกเปลี่ยน:

  1. ค้นหา id กระบวนการที่กำลังดูprocess ID: 2251 (still running)ในกรณีนี้คือ 2251
  2. ยืนยันว่าคุณมีรหัสที่ถูกต้องps 2251
  3. ฆ่ากระบวนการโดยใช้kill 2251

และนั่นคือมัน

โปรดจำไว้ว่ามีการสลับไฟล์เพื่อปกป้องคุณและคุณไม่ควรปิดการใช้งานอย่างสมบูรณ์


แต่ถ้าไม่มีvi(m)กระบวนการล่ะ
Scott

-2

ฉันได้แก้ไขปัญหานี้ในสามขั้นตอนง่าย ๆ :

1 :) เรียกใช้ "ls -la" โดยที่ไฟล์นั้นมีอยู่เพื่อให้คุณสามารถดูไฟล์. swp ได้เหมือนกัน

2 :) ตอนนี้ "rm -i * .swp" เช่นลบไฟล์ ".swp" ออกจากไดเรกทอรี

3 :) ตอนนี้ยืนยันว่าไฟล์ ".swp" ถูกลบแล้ว

4 :) ขอให้สนุกกับคำเตือนเหล่านั้น


3
เหตุใดคุณจึงแนะนำให้rm -rfลบไฟล์ ฉันแทนที่-rfด้วยความสมเหตุสมผลมากขึ้น-i
Nifle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.