ใช้การเลิกทำถาวรของ Vim หรือไม่


96

คุณลักษณะใหม่อย่างหนึ่งใน Vim 7.3 คือ 'เลิกทำถาวร' ซึ่งช่วยให้สามารถบันทึก undotree ลงในไฟล์ได้เมื่อออกจากบัฟเฟอร์

ขออภัยฉันไม่สามารถเปิดใช้งานได้อย่างถูกต้องหรือต้องใช้ผิด นี่คือสิ่งที่ฉันได้ลองทำแล้ว:

ฉันเพิ่มสิ่งต่อไปนี้ใน ~ / .vimrc

set undofile                " Save undos after file closes
set undodir=$HOME/.vim/undo " where to save undo histories
set undolevels=1000         " How many undos
set undoreload=10000        " number of lines to save for undo

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

หมายเหตุ:

  1. ฉันใช้ Win 7 โดยใช้ Vim 7.3 จากโครงการ Vim without cream การเลิกทำแบบต่อเนื่องถูกอบใน

  2. $ HOME / .vim / undo มีอยู่ในระบบไฟล์ของฉัน


38
เพียงเพื่อตอกย้ำข้อ 2) เป็นสิ่งสำคัญมาก กลุ่มจะไม่สร้างไดเรกทอรีให้คุณและการเลิกทำอย่างต่อเนื่องจะไม่ทำงานจนกว่าคุณจะmkdir ~/.vim/undo
puk

2
+1. ขออภัยบน Linux มันใช้งานได้ ... ขอบคุณที่บอกฉันเกี่ยวกับเรื่องนี้!
Ciro Santilli 郝海东冠状病六四事件法轮功

สำหรับผู้เข้าชมในอนาคตใด ๆ กับคำถามนี้: Do ไม่ใส่คำพูดรอบค่าของ undodir! ฉันติดปัญหานี้มาระยะหนึ่งแล้ว - ใช้เงินบาทแบบสัมบูรณ์โดยไม่มีเครื่องหมายอัญประกาศล้อมรอบ
naiveai

คำตอบ:


51

ใส่สิ่งนี้ในของคุณ.vimrcเพื่อสร้างundodirถ้าไม่มีอยู่และเปิดใช้งานการเลิกทำแบบถาวร ทดสอบทั้งบน Windows และ Linux

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

5
สิ่งนี้อาจเหมาะสำหรับการสร้างไดเร็กทอรี::silent call system('mkdir -p ' . &undodir)
Kyle Strand

1
ผมใช้&เพราะผมมากกว่าการใช้งานมัน (ในความคิดของฉันความแตกต่างระหว่างและเป็นหนึ่งใน "คุณสมบัติ" ที่น่ากลัวมากมายของ Vimscript แต่เป็น YMMV)setundodirletletset
Kyle Strand

1
ขอบคุณ Kyle เป็นความคิดที่ดีที่จะสร้าง.vimถ้าไม่มีอยู่จริง ขออภัย-pไม่มีแฟล็กบน Windows ดังนั้นฉันจึงแก้ไขคำตอบที่จะโทรmkdirสองครั้งเพื่อให้แน่ใจว่าเข้ากันได้กับ Windows
Matthias Braun

2
อา. เหตุผลหลักของฉันในการใช้-pแฟล็กคือเพื่อหลีกเลี่ยงข้อผิดพลาดเมื่อมีไดเร็กทอรีอยู่ ฉันมีคำสั่งอยู่ในif has('win32')บล็อกดังนั้นฉันจึงใช้mkdirโดยไม่ต้องใช้-pWindows
Kyle Strand

4
ทำไมไม่ใช้mkdir()? แล้วนี้จะกลายเป็น: ซึ่งพฤติกรรมเช่นcall mkdir(myUndoDir, 'p') mkdir -p
nelstrom

8

ฉันลองสิ่งนี้ใน _gvimrc ของฉัน:

" Persistent undo
try 
    set undodir=C:\vim\undodir
    set undofile
catch
endtry

มันเริ่มทำงานตามที่โฆษณาเมื่อฉันลบวงเล็บลองจับดังนั้น:

" Persistent undo
set undodir=C:\vim\undodir
set undofile

ฉันต้องสร้างไดเร็กทอรี


if has('persistent_undo')
Arelav

silent !mkdir ~/.config/nvim/backups > /dev/null 2>&1
Arelav

set undodir=~/.config/nvim/backups
Arelav

1
endif"การเพิ่มข้อความแสดงความคิดเห็นเพื่อเพิ่มความยาวของข้อความ
Arelav

3

ฉันคิดว่า $ HOME ไม่ทำงานตามที่โฆษณาไว้

ในระบบของฉัน:echo $HOMEแสดง H: \ แต่: e $HOME/บอกว่า: ~/ชื่อไฟล์ไม่ถูกต้อง

คุณสามารถลองใช้เส้นทางที่แน่นอนเพื่อดูว่ารักษาได้หรือไม่


ฉันทำได้ |: echo $ HOME | และ |: e $ HOME / | ไม่มีปัญหา แต่ฉันพยายามเปลี่ยนแปลงสิ่งต่างๆ ดูเหมือนว่าจะได้ผลในบางครั้งไม่ใช่กับคนอื่น โดยเฉพาะอย่างยิ่งจะไม่บันทึกข้อมูลสำรองเมื่อฉันแก้ไขไฟล์ ~ / .vimrc ของฉัน
duckworthd

ใน windows 7 ฉันใช้$TEMP. เมื่อฉันมองว่ามันแสดงให้เห็นว่าset undodir? ~/AppData/Local/Tempการเลิกทำไฟล์ยังคงอยู่และโหลดตัวเองอย่างถูกต้อง อาจ$TEMPจะน่าเชื่อถือกว่านี้?
slawek

1

ตอนนี้ใช้งานได้ตามที่คาดไว้: file.txtเปิดในบัฟเฟอร์ Vim 7.4 บน Windows 7 :setlocal undofileจากนั้นบันทึกการเปลี่ยนแปลงลงในบัฟเฟอร์และ undofile .file.txt.un~จะถูกสร้างขึ้นพร้อมกันเนื่องจาก:set undodir?รายงานว่า "undodir =." โดยค่าเริ่มต้นคือไม่จำเป็นต้องระบุสิ่งนี้ด้วยตนเอง คุณยังสามารถ:set undofileใน modeline


0

หากคุณกำลังมองหา% TEMP%. (ชื่อไฟล์) .un ~ คุณจะไม่พบมัน

ชื่อไฟล์จะเป็นบรรทัด C %% Users %% (ชื่อผู้ใช้)% _ vimrc

ฉันมีความคิดว่าทำไมไม่มี

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