Làm thế nào tôi có thể loại bỏ lịch sử hoàn tác của tôi trong vim?


23

Hoàn tác là tốt đẹp để có trong Vim. Nhưng đôi khi, tại một điểm tốt đã biết, tôi muốn xóa lịch sử hoàn tác của mình - để có thể sử dụng uđể hoàn tác các thay đổi riêng lẻ, nhưng chỉ quay lại một điểm nhất định. (Ví dụ, điều này có thể là khi tôi cam kết lần cuối.)

Một cách để thực hiện điều này là đóng và mở lại tệp - lịch sử hoàn tác bắt đầu sạch sẽ tại thời điểm đó. Nhưng đó là một rắc rối.

Trong quá khứ, tôi đã hoàn thành điều này với :edit!. Nhưng trong Vim 7.3, điều đó không loại bỏ lịch sử hoàn tác.

Có cách nào khác để làm điều này, ngoài việc đóng tệp?


Vì vậy, bạn thực sự chỉ muốn khôi phục trạng thái của tập tin như trên cam kết cuối cùng của bạn? về cơ bản bạn chỉ muốn ánh xạ lại phím 'u' cho một cái gì đó như git checkout -f filehay hg rollback file?
akira

@akira - không, tôi muốn có thể sử dụng uđể hoàn tác các thay đổi riêng lẻ, nhưng không vượt quá điểm mà tôi đã cam kết lần cuối. Chính xác như thể, mỗi lần tôi cam kết, tôi đóng tệp và mở lại. Đó là những gì đã :edit!từng làm - nó giống như đóng tệp và mở lại nó. Điều này KHÔNG PHẢI được gắn với một điểm cam kết, đó chỉ là thời điểm tôi thường xuyên muốn nó nhất.
Nathan Long

ah, điều đó làm cho vấn đề rõ ràng hơn nhiều. bạn nên thay đổi câu hỏi của bạn một chút.
akira

Câu trả lời:


11
:set undoreload=0 | edit

nên làm những gì bạn đang yêu cầu.


1
Hà! Chỉ cần tắt tính năng đó, eh? :) Không chắc chắn tại sao tôi mất quá nhiều thời gian để nhận thấy điều này.
Nathan Long

7

Cái cũ: chỉnh sửa! hành vi trong một lớp lót:

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

Điều đó không làm việc. Bạn có phiền giải thích nó không?
Nathan Long

Nối giá trị của cài đặt không hiển thị ở cuối chuỗi lệnh (để có thể khôi phục) và thực thi chúng. Để biết thêm xem tài liệu: :h :exe, :h :bar, :h :set-args, :h 'ul':h :edit!.
Aldrik

6

Chức năng của Benoit không hoạt động với tôi, nhưng tôi đã tìm thấy một cái gì đó tương tự trong hướng dẫn vim, ở đây:

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

Tôi đã đưa nó vào một hàm, thêm vào vimrc của tôi và nó dường như hoạt động tốt trên 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()

Điều này có thể được sử dụng với :ClearUndo.


1
Hoạt động bình thường với plugin Gundo và hoàn tác tải lại tập tin, điều này thực sự tiện dụng đối với tôi. Tuy nhiên, tôi đã thay đổi hai điều: thay vì lệnh chỉnh sửa thông thường (có vẻ như để lại một số lịch sử chỉnh sửa trên 7.4), tôi chỉ cần sử dụng một chỉnh sửa! (và luôn luôn viết trước khi xóa lịch sử hoàn tác). Có vẻ như một số danh sách nội bộ không được cập nhật chính xác, vì vậy nếu bạn muốn sử dụng điều này với plugin Gundo, hãy thực hiện một chỉnh sửa bổ sung! ở cuối các chức năng sẽ ngăn nó khỏi lỗi sau này.
PlasmaHH

@PlasmaHH Bạn có thể vui lòng đăng chức năng xóa lịch sử hoàn tác không, vì tôi không hiểu bạn đã thay đổi điều gì ... (bạn có thể đăng nó dưới dạng câu trả lời cho những người sử dụng gundu). Cảm ơn
Ben

5

Có lẽ:

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

( 'ul'là bí danh cho 'undolevels').


Những công việc này! Bây giờ tôi đang cố gắng thực hiện một lệnh duy nhất để làm điều đó - tốt nhất là :edit!. Khi bắt đầu, tôi đã tạo một hàm có tên ClearUndos () với các lệnh bạn đã liệt kê, nhưng gọi nó dường như không làm gì cả, trong khi thực hiện các lệnh riêng lẻ thì ...
Nathan Long

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit

điều đó có nghĩa là nội dung của hàm? Nó không làm việc cho tôi, nhưng có lẽ tôi đã hiểu lầm. Ngoài ra - có thể di chuyển điều này đến câu trả lời của riêng mình?
Nathan Long

Có lẽ bạn không thể đặt nguyên |trong một nội dung lệnh. Sau đó tạo một hàm thực hiện những gì tôi đã nói trong câu trả lời của mình và đặt lệnh thành call thefunction().
Benoit

3

"Xóa lịch sử hoàn tác (: w để xóa tệp hoàn tác nếu được trình bày)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Khi bạn đặt 'hủy bỏ' thành -1, thông tin hoàn tác sẽ không bị xóa ngay lập tức, điều này xảy ra ở lần thay đổi tiếp theo, tức là m-1không thực sự thay đổi văn bản của bạn.
  • Khi 'undofile'bật, :wđể xóa tệp hoàn tác hoặc chuỗi như thế nào UndoClear|w.

1

Trong một kịch bản:

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()

Sau đó sử dụng :Resetđể gọi nó.


Dòng định nghĩa hàm của bạn cần () ở cuối.
Nathan Long

Điều này thật kỳ quặc - việc chạy các lệnh riêng lẻ hoạt động tốt và lặp lại các giá trị trong toàn hàm cho thấy chúng được đặt và không được đặt một cách thích hợp. Nhưng việc chạy chức năng không thiết lập lại lịch sử hoàn tác của tôi - sau đó, tôi vẫn có thể hoàn tác nhiều lần. Có lẽ set ul=lệnh chỉ ảnh hưởng đến một biến cục bộ cho đến khi tập lệnh thoát ra và vì chúng ta thay đổi nó trở lại trước khi tập lệnh thoát ra, nó không bao giờ ảnh hưởng đến môi trường? Bạn đã kiểm tra chức năng này và nó có hoạt động không - có nghĩa là, có gì lạ trong thiết lập của tôi không?
Nathan Long
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.