เป็นไปได้ไหมที่จะทำให้ Vim บันทึกไฟล์อัตโนมัติ?


32

โปรแกรมประมวลผลคำและโปรแกรมแก้ไขข้อความอัตโนมัติบันทึกไฟล์ที่เราแก้ไขเป็นระยะ ๆ ซึ่งสะดวกมากสำหรับการเอาตัวรอดจากการล่มที่น่ารังเกียจ ฯลฯ

มีวิธีทำให้ Vim บันทึกไฟล์ของเราโดยอัตโนมัติหรือไม่?

คำตอบ:


30

ไม่มีตัวเลือกในตัวแม้ว่า:help 'autosave'(ใน todo.txt) หมายถึงคำอธิบายว่าตัวเลือกดังกล่าวสามารถทำได้อย่างไร

วิธีหนึ่งที่เป็นไปได้ที่จะใช้สิ่งนี้คือการใช้CursorHoldเหตุการณ์การเติมข้อความอัตโนมัติ เหตุการณ์นี้จะเกิดขึ้นเมื่อผู้ใช้ไม่ได้กดปุ่มเป็น'updatetime'มิลลิวินาที

autocmd CursorHold * update

:updateคำสั่งเพียงช่วยประหยัดบัฟเฟอร์ถ้ามันมีการแก้ไข หากคุณต้องการให้สิ่งนี้เกิดขึ้นในขณะที่โหมดแทรกทำงานอยู่CursorHoldIสามารถเพิ่มลงในรายการเหตุการณ์ได้

autocmd CursorHold,CursorHoldI * update

อีกทางเลือกหนึ่งคือ'autowrite'ตัวเลือกซึ่งจะบันทึกบัฟเฟอร์ก่อนดำเนินการคำสั่งภายนอก (มีประโยชน์สำหรับการบันทึกก่อนเรียกใช้:make) หรือเปลี่ยนไปใช้บัฟเฟอร์อื่น


คุณจะสังเกตเห็นว่ามันทำงานอย่างไร
nilon

@nilon ควรพิมพ์ไปที่แถบสถานะที่บันทึกเช่นเดียวกับที่คุณกด: ด้วยตัวคุณเอง
MaudPieTheRocktorate

12

Vim มีคุณสมบัติการบันทึกอัตโนมัติ แต่จะบันทึกลงในไฟล์ "กู้คืน"

เมื่อคุณแก้ไขเอกสารเช่นกลุ่มจะสร้างไฟล์MyFile.txt revovery .MyFile.txt.swpหากระบบของคุณเกิดข้อผิดพลาดหรือเซสชันของคุณกำลังจะตายคุณสามารถเชื่อมต่อใหม่และกู้คืนจากจุดที่คุณค้างไว้โดยพิมพ์:

vim -r MyFile.txt

การดำเนินการนี้จะเปิดไฟล์เพื่อแก้ไขและกู้คืนการเปลี่ยนแปลงล่าสุดที่คุณทำไว้

:wจากนั้นคุณสามารถบันทึกการกู้คืนรุ่นด้วยวิธีปกติ

น่าเสียดายที่เมื่อคุณออกจากกลุ่มแล้วมันจะออก.MyFile.txt.swpไปรอบ ๆ และคุณต้องลบมันด้วยตนเอง:

rm .MyFile.txt.swp

ดูที่หน้า Man "Recovery" ด้วยเช่นกันบทที่ 11


1
เมื่อคุณออกจาก Vim อย่างถูกต้อง (เช่นมี:wqหรือ:q!หรือZZหรืออื่น ๆ ) ไฟล์ swap ควรถูกลบโดยอัตโนมัติ
Doorknob

4
@Doorknob ไม่ได้เมื่อคุณออกหลังจากการกู้คืน ... ;-)
rolfl

8

ฉันสร้างปลั๊กอินการบันทึกอัตโนมัติซึ่งใช้คุณลักษณะ Vim 8 ของตัวจับเวลาเพื่อบันทึกบัฟเฟอร์ของคุณเป็นระยะ


ว้าวปลั๊กอินที่ 8 ออกมาแล้ว ดูดีมากคริสเตียน!
thameera

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

ไม่ปัจจุบันไม่รองรับไฟล์ใหม่ / ไม่ได้บันทึก หากคุณต้องการสิ่งนี้ให้ทำต่อไปและสร้างปัญหาที่ไม่เหมาะสม
Christian Brabandt

2

ฉันทำให้ Vim บันทึกทุกอย่างทุกครั้งที่โฟกัสหายไป

autocmd FocusLost <your-patterns-here> silent! wall

รูปแบบของฉันค่อนข้างยาวและฉันใช้มันใน autocmds หลายอัน แต่เพื่อความสมบูรณ์นี่คือสิ่งที่ดูเหมือน:

if exists(':keeppatterns')
    let s:keeppatterns = 'keeppatterns '
else
    let s:keeppatterns = ''
endif

augroup AutoSaveGroup
    " :help file-pattern has some info,
    " but some of it is is buried in the PATTERNS section of usr_40.txt
    let s:autoPattern = "*.{c,h,[ch]pp,[acjt]s,inl,cg,cgfx,fx,py,bat,cmd,jam,vim,yml,yaml,vsprops,erb,rb,html,htm},SCons*,*vimrc"

    autocmd!
    execute "autocmd FocusLost"     s:autoPattern   "silent! wall"
    execute "autocmd BufWritePre"   s:autoPattern   s:keeppatterns . 'call FixFormatting(expand("<afile>"))'

    execute "autocmd FileChangedRO" s:autoPattern "silent !p4 edit %:p"
    execute "autocmd FileChangedRO" s:autoPattern "write!"

    autocmd FocusLost   *.txt   silent! wall
augroup END

1

ดังที่คนอื่น ๆ ระบุไว้ vim มีไฟล์ swap (.swp) ที่จะถูกสร้างขึ้นโดยที่ไฟล์ดั้งเดิมของคุณเคยเป็น แต่ในไฟล์. vimrc ของคุณคุณสามารถตั้งค่าไดเรกทอรี. swp ได้

คุณจะต้องสร้างไดเรกทอรีด้วยmkdirแล้วตั้งค่า. vimrc ของคุณให้เป็นตำแหน่งนั้น

set backup " make backup files
set backupdir=~/.vim-tmp,~/.tmp,~/tmp,/var/tmp,/tmp

1

เป็นกลุ่ม-พื้นที่ทำงานปลั๊กอินมีการปรับแต่งอย่างเป็นธรรมอัตโนมัติบันทึกคุณลักษณะที่อาจจะเหมาะกับความต้องการของคุณ ตามค่าเริ่มต้นจะช่วยให้บันทึกอัตโนมัติเมื่ออยู่ในเซสชันพื้นที่ทำงาน (คุณสมบัติหลัก) แต่คุณสามารถตั้งค่าให้บันทึกอัตโนมัติทุกครั้งหากนั่นคือทั้งหมดที่คุณกำลังมองหา ( let g:workspace_autosave_always = 1)


1

พยายามบันทึกบัฟเฟอร์ทุกครั้งที่มีการเปลี่ยนแปลงข้อความ:

autocmd TextChanged,TextChangedI <buffer> silent write

มันใช้งานได้สำหรับฉัน

แหล่ง

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