ฉันจะยกเลิกประวัติเลิกทำของฉันเป็นกลุ่มได้อย่างไร


23

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

วิธีหนึ่งในการทำสิ่งนี้ให้สำเร็จคือการปิดและเปิดไฟล์อีกครั้ง - ประวัติการเลิกทำจะเริ่มต้นใหม่ที่จุดนั้น แต่นั่นเป็นเรื่องยุ่งยาก

:edit!ในอดีตที่ผ่านมาผมประสบความสำเร็จนี้ด้วย แต่ใน Vim 7.3 นั้นไม่ได้ละทิ้งประวัติศาสตร์การเลิกทำ

มีวิธีการอื่นนอกเหนือจากการปิดไฟล์หรือไม่


ดังนั้นคุณเพียงแค่ต้องการเรียกคืนสถานะของไฟล์เหมือนที่คุณทำครั้งล่าสุด? คุณต้องการหลักเพียง remap ปุ่ม 'U' เพื่อสิ่งที่ต้องการgit checkout -f fileหรือhg rollback file?
akira

@akira - ไม่ฉันต้องการใช้uเพื่อเลิกทำการเปลี่ยนแปลงแต่ละรายการ แต่ไม่ผ่านจุดที่ฉันทำไป เหมือนกับทุกครั้งที่ฉันยืนยันฉันปิดไฟล์และเปิดใหม่อีกครั้ง สิ่งที่:edit!ใช้ทำ - มันเหมือนกับการปิดไฟล์และเปิดใหม่อีกครั้ง นี่ไม่ได้ผูกติดอยู่กับจุดยอมรับนั่นเป็นเวลาที่ฉันต้องการมันบ่อยที่สุด
นาธานลอง

อานั่นทำให้ปัญหาชัดเจนขึ้น คุณควรเปลี่ยนคำถามของคุณเล็กน้อย
akira

คำตอบ:


11
:set undoreload=0 | edit

ควรทำสิ่งที่คุณขอ


1
ฮา! เพียงปิดคุณสมบัตินี้ใช่มั้ย :) ไม่แน่ใจว่าทำไมมันใช้เวลานานมากในการสังเกตสิ่งนี้
นาธานลอง

7

เก่า: แก้ไข! พฤติกรรมในหนึ่งซับ:

:exe "set ul=-1 | e! | set ul=" . &ul

มันทำงานได้ดี คุณจะอธิบายให้ฟังหน่อยได้ไหม?
Nathan Long

เชื่อมต่อค่าของการตั้งค่า undolevels ที่ส่วนท้ายของสตริงคำสั่ง (เพื่อให้สามารถเรียกคืนได้) และดำเนินการคำสั่งเหล่านั้น สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสาร: :h :exe, :h :bar, :h :set-args, และ:h 'ul' :h :edit!
Aldrik

6

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

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

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

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

:ClearUndoนี้สามารถใช้กับ


1
ทำงานได้ตามปกติกับปลั๊กอิน Gundo และการเลิกโหลดไฟล์ซ้ำสิ่งนี้มีประโยชน์มากสำหรับฉัน อย่างไรก็ตามฉันเปลี่ยนสองสิ่ง: แทนคำสั่งแก้ไขปกติ (ซึ่งออกจากประวัติการแก้ไขบางอย่างที่ดูเหมือนว่า 7.4) ฉันแค่ใช้การแก้ไข! (และเขียนทุกครั้งก่อนที่จะลบประวัติเลิกทำ) ดูเหมือนว่าบางรายการภายในจะไม่ได้รับการอัปเดตอย่างเหมาะสมดังนั้นหากคุณต้องการใช้กับปลั๊กอิน Gundo ให้ทำการแก้ไขเพิ่มเติม! ที่ส่วนท้ายฟังก์ชั่นจะป้องกันไม่ให้เกิดข้อผิดพลาดในภายหลัง
PlasmaHH

@PlasmaHH คุณช่วยกรุณาโพสต์ฟังก์ชั่นสำหรับการล้างประวัติเลิกเพราะฉันไม่เข้าใจสิ่งที่คุณเปลี่ยน ... (คุณอาจจะโพสต์มันเป็นคำตอบสำหรับพวกเราที่ใช้ Gundu) ขอบคุณ
เบ็น

5

อาจ:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

( 'ul'เป็นนามแฝงสำหรับ'undolevels')


มันใช้งานได้! ตอนนี้ผมกำลังพยายามที่จะทำให้คำสั่งเดียวทำว่า - :edit!โดยเฉพาะอย่างยิ่ง เป็นการเริ่มต้นฉันได้สร้างฟังก์ชั่นที่ชื่อว่า ClearUndos () พร้อมกับคำสั่งที่คุณระบุไว้ แต่การโทรมันดูเหมือนจะไม่ทำอะไรเลยในขณะที่การทำคำสั่งต่าง ๆ นั้น ...
Nathan Long

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
เบอนัวต์

นั่นหมายความว่าเป็นเนื้อหาของฟังก์ชั่นหรือไม่ มันไม่ทำงานสำหรับฉัน แต่ฉันอาจเข้าใจผิด นอกจากนี้ - อาจย้ายสิ่งนี้เป็นคำตอบของมันเอง?
นาธานลอง

บางทีคุณไม่สามารถใส่|คำสั่งraw ลงในเนื้อหาคำสั่งได้ call thefunction()แล้วสร้างฟังก์ชั่นที่ไม่สิ่งที่ผมบอกในคำตอบของฉันและการตั้งค่าคำสั่งเพื่อ
เบอนัวต์

3

"ล้างประวัติการเลิกทำ (: w เพื่อล้างไฟล์เลิกทำหากมี)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • เมื่อคุณตั้งค่า 'undolevels' เป็น -1 ข้อมูลการเลิกทำจะไม่ถูกล้างออกทันทีสิ่งนี้จะเกิดขึ้นในการเปลี่ยนแปลงครั้งต่อไปคือm-1ซึ่งไม่ได้เปลี่ยนข้อความของคุณ
  • เมื่อ'undofile'อยู่บนเพื่อล้างไฟล์ยกเลิกหรือห่วงโซ่เช่น:wUndoClear|w

1

ในสคริปต์:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

จากนั้นใช้:Resetโทรออก


บรรทัดคำจำกัดความของฟังก์ชันของคุณต้องการ () ที่ท้าย
นาธานลอง

นี่เป็นคำสั่งที่แปลก - การรันคำสั่งเหล่านั้นทำงานได้ดีและการสะท้อนค่าตลอดทั้งฟังก์ชั่นแสดงให้เห็นว่าพวกมันถูกตั้งค่าและยกเลิกการตั้งค่าอย่างเหมาะสม แต่การเรียกใช้ฟังก์ชั่นไม่ได้รีเซ็ตประวัติเลิกทำของฉัน - หลังจากนั้นฉันยังสามารถยกเลิกได้หลายครั้ง บางทีset ul=คำสั่งอาจส่งผลกระทบต่อตัวแปรโลคอลจนกว่าสคริปต์จะออกและเนื่องจากเราเปลี่ยนกลับไปก่อนที่สคริปต์จะออกจึงไม่ส่งผลกระทบต่อสิ่งแวดล้อม คุณทดสอบฟังก์ชั่นนี้และใช้งานได้ - ความหมายมีอะไรแปลกไหมเกี่ยวกับการตั้งค่าของฉัน
นาธานลอง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.