Cây hoàn tác của VIM được sử dụng như thế nào?


132

Câu trả lời này nói:

Hệ thống hoàn tác / làm lại của Vim là vô địch. Nhập một cái gì đó, hoàn tác, nhập một cái gì đó khác và bạn vẫn có thể lấy lại thứ đầu tiên bạn đã nhập vì Vim sử dụng một cây hoàn tác thay vì một ngăn xếp. Trong hầu hết các chương trình khác, lịch sử của điều đầu tiên bạn gõ bị mất trong tình huống này.

Đây là lần đầu tiên tôi nghe về điều này. Làm thế nào tôi có thể quay lại dọc theo cây?


1
Người dùng ghen tị Emacs có thể muốn biết về chế độ hoàn tác cây .
Aaron Miller

Câu trả lời:


142

Xem thêm :h undo-redo, trong đó liệt kê tất cả các lệnh và cách sử dụng của chúng.

Có hai cách để vượt qua cây hoàn tác. Một là đi "ngược thời gian". g+g-sẽ đi qua tất cả các nút trong cây theo thứ tự thời gian hoặc ngược thời gian (có thể hơi khó hiểu, bởi vì nó có thể nhảy tùy ý giữa các nhánh hoàn tác, nhưng nếu bạn đi g-đủ lâu, bạn sẽ luôn đi đến nơi bạn cần đến cuối cùng). :earlier:latercó một mô tả thời gian như 7mhoặc 1h; một lần nữa điều này có thể nhảy bạn tùy ý giữa các nhánh hoàn tác.

Một cách khác là để chuyển đến các nút cụ thể trong cây sử dụng :undo nở đâu nlà một số của một hành động. (Tất cả các hành động, tức là bổ sung văn bản, xóa, thay thế, được đánh số liên tục khi bạn thực hiện chúng.) Bạn có thể tra cứu số lượng hành động trên lá của cây hoàn tác thông qua :undolist. Điều này sẽ cho phép bạn nhảy giữa các chi nhánh dễ dàng. Sau đó, bạn có thể sử dụng uCtrl-Rđể di chuyển lên và xuống chi nhánh đó.

Có một số ví dụ tốt trong trợ giúp Vim. Cách tốt nhất để tìm ra cách thức hoạt động của nó là chơi với nó một chút.


43
Bạn có thể hợp nhất các chi nhánh? (Tôi đang đùa)
he_the_great

40
Loại Tra cứu: h undojoin
Pod

23
Vim tuyệt vời đến nỗi nó thậm chí còn thực hiện những cách chúng ta nói đùa về việc nó tuyệt vời như thế nào!
andyortlieb

4
Tôi không biết làm thế nào để sử dụng cây hoàn tác này, nhưng tôi biết nó sẽ cứu mạng tôi một ngày nào đó. Vâng, ngày đã đến. Cảm ơn!!
ndvo

1
@Pod Có vẻ như undojoinkhông có gì để làm với các chi nhánh; thực tế, phần trợ giúp tiếp theo bắt đầu bằng cách nói "Ở trên chúng tôi chỉ thảo luận về một dòng hoàn tác / làm lại. Nhưng nó cũng có thể tách ra." Có cách nào để sử dụng undojoinvới các nhánh mà tôi không nhìn thấy không?
Kyle Strand

70

Tôi đến bữa tiệc muộn một chút, nhưng tôi đoán rằng tôi đã đề cập rằng tôi đã viết một plugin trực quan hóa cây cho Vim: http://bitbucket.org/sjl/gundo.vim/

Cá nhân tôi thấy rằng vẽ biểu đồ cây như thế này là cách duy nhất tôi có thể hiểu được về nó.


Một kho lưu trữ git cập nhật hơn tồn tại tại github.com/sjl/gundo.vim . Với vim-plug, plugin có thể được cài đặt Plug 'sjl/gundo.vim'và sau đó nnoremap <F5> :GundoToggle<CR>(thay thế <F5>bằng bất kỳ chuỗi khóa nào bạn muốn liên kết)
ewen-lbh


16

Nếu bạn đang sử dụng vim, bạn có thể điều hướng qua cây hoàn tác bằng cách sử dụng:

  • u: (hoàn tác) di chuyển trở lại trong cây hoàn tác
  • Ctrl+R: (làm lại) di chuyển về phía trước trong cây hoàn tác

Các cách khác để đưa tài liệu trở lại hoặc chuyển tiếp kịp thời:

  • :earlier 15m: quay ngược thời gian 15 phút
  • :later 15m: di chuyển về phía trước trong thời gian 15 phút

2
Câu trả lời này chỉ giải thích làm thế nào để di chuyển tiến và lùi trên một nhánh. Không làm thế nào để di chuyển giữa các chi nhánh.
Jonathan Hartley

Điều này sẽ di chuyển trên tất cả các chi nhánh sắp xếp tất cả các điểm theo thứ tự thời gian. Xem câu trả lời của @BrianCarper.
Holloway

@JonathanHartley, nếu bạn đang sử dụng earlierlaternó không di chuyển qua các chi nhánh. Tôi hy vọng rằng hầu hết mọi người không thực sự quan tâm hoặc nhớ các nhánh khác nhau mà họ tạo ra. Nhưng chỉ muốn quay ngược thời gian. Nếu bạn muốn tạo các nhánh và đặt tên cho chúng có lẽ githoặc một hệ thống kiểm soát phiên bản là một lựa chọn tốt hơn.
alpha_989

@ alpha_989 Nhận xét của bạn về kiểm soát phiên bản không có ý nghĩa. Kiểm soát phiên bản dành cho trạng thái của các tệp có tên trên đĩa. Chúng ta đang nói về cây hoàn tác của Vim, đó chỉ là cấu trúc dữ liệu trong bộ nhớ. Cả hai đều sử dụng từ 'nhánh', nhưng nó không có nghĩa giống nhau.
Jonathan Hartley

Nhờ mọi người chỉ ra sớm hơn / muộn hơn DO di chuyển qua các chi nhánh!
Jonathan Hartley

9

Tôi biết câu hỏi này đã được trả lời, nhưng tôi nghĩ tôi sẽ thêm một ví dụ.

Tạo một tệp mới và gõ:

this is a line

undolsẽ hiển thị cây hoàn tác. Tại thời điểm này, bạn chưa hoàn tác bất cứ điều gì

:undol

number changes  when               saved
     1       1  14:50:36

Bây giờ nhấn ESC và sửa đổi dòng thành:

this is a old line

chuyển sang chế độ bình thường và nhấn u (hoàn tác), thao tác này sẽ xóa "cũ". Nếu bạn kiểm tra undol, tại thời điểm này bạn vẫn chỉ có một chi nhánh.

Bây giờ sửa đổi dòng để nó nói:

this is a new line

Bây giờ :undolcho thấy:

number changes  when               saved
     2       2  87 seconds ago
     3       2  3 seconds ago

Bạn có thể chuyển sang nhánh đầu tiên bằng cách gõ

:u 2

điều này sẽ đưa bạn đến cuối nhánh được liên kết với số 2. Bạn có thể di chuyển dọc theo nhánh này với g+g-. Tại thời điểm g+này sẽ không làm gì cả (bạn đang ở trên chiếc lá). Nếu bạn nhấn vào g-old old "sẽ bị xóa (bạn đang duyệt qua cây hoàn tác đầu tiên). Đó là nếu bạn gỡ bỏ old old cũ g-và nhấn g+lại, thì old old" sẽ được làm lại.

Nếu bạn gõ

:u 3

Bạn sẽ nhảy đến chiếc lá của nhánh hoàn tác thứ hai và nó sẽ đọc:

this is a new line


3

Bên cạnh việc sử dụng gundo.vim tôi muốn đề cập đến g+g-


3

Gói unotree được viết bằng vimscript thuần túy nên không yêu cầu.

Và thêm phần này vào vimrc của bạn trước khi quá muộn:

  set nobackup
  set noswapfile
  set nowritebackup
  set undolevels=10000         " use many levels of undo
  set history=10000    " After nocompatible

  if has('persistent_undo')
    set undodir=$HOME/.vim/undo
    set undofile 
  endif 

nhập mô tả hình ảnh ở đây

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.