วิธีการตรวจสอบว่าไฟล์ swp มีการเปลี่ยนแปลงที่ไม่ได้บันทึกหรือไม่


11

เมื่อแก้ไขซอร์สโค้ดโดยใช้ gvim (v.7.4.488) ฉันต้องการคอมมิทการเปลี่ยนแปลง vcs (ฉันใช้ git 2.1.4 จากบรรทัดคำสั่งใน Ubuntu linux)

git --status

แสดงไฟล์ที่ฉันเปลี่ยน อย่างไรก็ตามมันยังแสดง vim .*.swpของบัฟเฟอร์ที่มองเห็นได้ในปัจจุบัน (ทั้งคู่ถ้าไฟล์มีการเปลี่ยนแปลงที่ไม่ได้บันทึกและเมื่อไฟล์ที่แก้ไขเหมือนกันกับ.*.swp-file) แน่นอน, git สามารถละเว้นไฟล์เหล่านี้หรือเป็นกลุ่มสามารถเก็บไฟล์ swap ในตำแหน่งอื่น (ดูvim.wikiaหรือคำถามนี้ที่ stackoverflow ) แต่ฉันชอบ - .*.swpไฟล์ที่ปรากฏขึ้นgit --statusเมื่อพวกเขามีการเปลี่ยนแปลงที่ไม่ได้บันทึกเพราะมันเป็นสัญญาณให้ฉันเห็นว่าฉันกำลังยืนยันไฟล์ในสถานะที่แตกต่างจากสิ่งที่ฉันคิดว่าพวกเขามี

ฉันจะหลีกเลี่ยงผลบวกปลอมของ.*.swp-files ที่ปรากฏขึ้นgit --statusเมื่อไฟล์ที่บันทึกไว้เหมือนกับ -file ได้อย่างไรใน.*.swpขณะที่สามารถเห็นไฟล์ที่จะคอมมิทนั้นจะอยู่ในสถานะที่แตกต่างจากที่ฉันแก้ไขด้วย vim

  • เป็นไปได้หรือไม่ที่มี.*.swp-files เท่านั้นเมื่อไฟล์บนดิสก์และไฟล์ใน vim แตกต่างกัน?
  • มีวิธีอื่นในการตรวจจับไฟล์ที่ไม่ได้บันทึกหรือไม่?

การรวมความคิดเห็นของ@elyashivและ@VanLaserเป็นวิธีที่ง่ายกว่าการตรวจจับว่าไฟล์สลับแปลว่าไฟล์ที่ไม่ได้บันทึกหรือไม่:

  1. อย่าปล่อยให้คอมไพล์ละเว้นไฟล์. *. sw [po];
  2. เมื่อกระทำถ้าgit --statusพบว่าไฟล์ใด ๆ.*.sw[po]ทำ a :waใน vi; และ,
  3. เพิ่มและกระทำ

1
คุณสามารถใช้:waเพื่อให้แน่ใจว่าไม่มีไฟล์ที่ไม่ได้บันทึก
elyashiv

2
จริงๆมันมาก "saner" เพื่อให้แน่ใจว่าไฟล์ทั้งหมดของคุณจะถูกบันทึกไว้ก่อนที่คุณgit commit...
VanLaser

คำตอบ:


8

vim -rที่บรรทัดรับคำสั่งจะแสดงรายการไฟล์สวอปทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีชั่วคราวและระบุว่ามีการเปลี่ยนแปลงที่ไม่ได้บันทึกหรือไม่ modified: no/YESมองหาบรรทัดที่เขียนว่า

vim -rผมไม่ทราบวิธีที่จะบอกเป็นกลุ่มที่จะดูในไดเรกทอรีที่แตกต่างกันดังนั้นคุณจะต้องเปลี่ยนไดเรกทอรีที่มีไฟล์แลกเปลี่ยนและการทำงานในแต่ละ คุณสามารถสร้างสคริปต์ที่แยกวิเคราะห์เอาต์พุตgit statusหรือใช้find -name '.*.sw[po]'แล้วรันvim -rในแต่ละไดเรกทอรีเพื่อแสดงไฟล์ swap ทั้งหมดพร้อมการเปลี่ยนแปลงที่ไม่ได้บันทึก

(ฉันใช้.*.sw[po]แทน.*.swpเพราะบางครั้ง.swoไฟล์ถูกสร้างเพิ่มเติมจาก.swpไฟล์เมื่อคุณแก้ไขไฟล์ที่มีไฟล์ swap อยู่แล้ว.swnไฟล์สามารถสร้างได้เช่นกันหากคุณแก้ไขไฟล์ด้วยไฟล์ swap สองไฟล์ที่มีอยู่ แต่ฉันไม่คิดว่า ฉันเคยเห็นหนึ่งในป่าถ้าคุณหวาดระแวงจริง ๆ คุณสามารถใช้.*.sw[a-p]หรือเพียงแค่.*.sw?)

ดูตัวเลือกเพิ่มเติม:help -r(เล็กน้อย) -rหรือ:help recover.txtสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการกู้คืนและสลับชื่อไฟล์


1
ไฟล์ swap ของ Vim นั้นเป็นไฟล์ที่ซ่อนอยู่ (นำหน้า.ในชื่อไฟล์) ดังนั้นรูปแบบที่ถูกต้องจะเป็น.*.sw[a-p](แม้ว่าในกรณีทางพยาธิวิทยาคุณสามารถไปถึงได้.foo.saa) สิ่งนี้ควรกีดกันไฟล์ Flash ที่จับคู่ด้วยเนื่องจากฉันสงสัยว่าไฟล์เหล่านั้นมักจะเป็นไฟล์ที่ซ่อนอยู่
jamessan

@jamessan ชั้นนำ.เป็นสิ่งจำเป็นใน glob เปลือก แต่ทำงานเป็นอาร์กิวเมนต์ไปยัง*.swp findแต่ผู้นำก็.ทำให้สิ่งต่าง ๆ ง่ายขึ้น ขอบคุณ!
Lithis

8
  • เป็นไปได้หรือไม่ที่มี.*.swp-files เท่านั้นเมื่อไฟล์บนดิสก์และไฟล์ใน vim แตกต่างกัน?

ใช่. ตัวอย่างด้านล่าง (ดัดแปลงมาจากvimrc ของ tpope ) จะปิดใช้งานไฟล์ swap สำหรับบัฟเฟอร์เมื่อไม่ได้แก้ไขดังนั้นไฟล์ swap จะมีเฉพาะไฟล์ที่แก้ไขเท่านั้น

autocmd CursorHold,BufWritePost,BufReadPost,BufLeave *
  \ if isdirectory(expand("<amatch>:h")) | let &swapfile = &modified | endif

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

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