Làm thế nào tôi có thể hoàn tác một cách an toàn những thay đổi mà tôi có thể hoặc không thể thực hiện?


12

Tôi thường xuyên mắc lỗi đánh máy với cửa sổ sai tập trung (và đã làm như vậy một vài lần với trình xác thực USB). Trong các chương trình có nhiều phím nóng được kích hoạt (Gmail, VLC, Vim), điều này thường có hậu quả không lường trước là thực hiện các sửa đổi không mong muốn.

Đôi khi tôi có thể theo dõi các bước của mình và nhớ những gì tôi đã nhập để sửa chữa bất kỳ thay đổi nào hoặc hoàn nguyên bất kỳ cài đặt nào tôi đã điều chỉnh nếu tôi tự bắt sớm. Không may, đó không phải lúc nào cũng đúng.

Trong Vim, tôi có thể có một cái gì đó vô hại và rõ ràng như thay đổi một dòng văn bản dễ dàng hoàn tác. Hoặc, tôi có thể đã vô tình sửa đổi một cái gì đó không dễ dàng xác định. Nếu tôi vô tình nhập một chuỗi các lệnh không mong muốn trong Vim, làm cách nào tôi có thể kiểm tra và hoàn tác bất kỳ chỉnh sửa hoặc thay đổi nào đối với cài đặt?


1
Bạn đang tìm kiếm một hành động "hoàn nguyên"? :e!sẽ làm điều đó
Jasper

1
Tôi nghĩ :e!sẽ rất tệ nếu bạn không lưu từ trạng thái chính xác cuối cùng và ucó thể không đủ nếu bạn nhập một loạt các công cụ. ( date monthVí dụ: nếu bạn đã nhập , thì bạn đã xóa thẻ, đặt dấu và thực hiện tìm kiếm, điều này khá khó hiểu để hoàn tác qua u.)
wchargein

1
@WChargin Không nói về việc ulà một phần của chuỗi, thực hiện một số thao tác hoàn tác ở giữa.
yo '

Câu trả lời:


14

Gọi

:undolist

để xem khi bạn thực hiện các thay đổi cuối cùng. Nếu nó nói rằng có một vài thay đổi được thực hiện, ví dụ: "3 giây trước" và bạn biết rằng bạn chỉ cố ý thay đổi nó, giả sử, một phút trước, sau đó thực thi

:earlier 10s

để trở lại trạng thái mong muốn. Mặt khác, nếu không có thay đổi gần đây, bạn không phải làm gì cả.


Tham khảo thêm : :help undo-tree .


4

Để viết lại câu hỏi, bạn đang tìm cách để xem hoặc nhận thông báo về những thay đổi bạn đã thực hiện đối với tệp, sau đó sử dụng tính năng hoàn tác. Có thể có cách khác hoặc thậm chí các plugin hỗ trợ này. Nhưng tôi sẽ giải thích những gì tôi đã sử dụng cho cùng một mục đích.

Bạn kết hợp tính năng vim hiện có để thực hiện điều này. Ví dụ: bạn có thể định nghĩa một hàm như:

" Function: View changes after the last save
function! s:DiffSinceSave()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
  exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffSinceSave()

Sau đó, bạn có thể gọi nó sau và thậm chí ánh xạ một phím tắt.

" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>

Điều này sẽ mở một cửa sổ phân chia dựa trên chế độ xem khác nhau sẽ hiển thị cho bạn các thay đổi được thực hiện kể từ lần lưu cuối cùng. Sau khi bạn đã xác định các thay đổi đã thực hiện, sau đó bạn có thể thoát khỏi chế độ xem đó và sử dụng các tính năng vim khác như hoàn tác và hoàn tác cây, v.v. hoặc thậm chí các plugin để trở lại trạng thái trước đó.

Tôi nhận ra rằng điều này không lý tưởng bởi vì bạn phải có một quy trình làm việc nhất định để điều này có ích. Nhưng điều này hoạt động khá tốt. Và về mặt tích cực, chúng tôi sẽ không thay đổi cách vim hoạt động hoặc dựa vào bất cứ thứ gì bên ngoài.

Tôi hy vọng bạn thấy nó hữu dụng. Tôi đã điều chỉnh giải pháp này một thời gian trước từ các đoạn được tìm thấy trên Internet bao gồm cả vim Wikia. Vì vậy, đó là nơi mà bất kỳ tín dụng là do.


3

Dường như với tôi câu trả lời đơn giản cho vấn đề này là nhấn ucho đến khi bạn hoàn tác một thay đổi bạn muốn giữ, sau đó nhấn Ctrl-R.


0

Giống như @superjer, tôi tiếp tục nhấn ucho đến khi [+]điểm đánh dấu màu đỏ trong dòng trạng thái của tôi biến mất.

set statusline=%f\ %#Error#%m%##

Có thể có một phím để hoàn tác tự động trở về trạng thái chưa sửa đổi cuối cùng. Nhưng :e!cũng là một giải pháp tốt đẹp; những ngày này Vim thậm chí sẽ giữ những thay đổi "bị loại bỏ" của bạn trong lịch sử hoàn tác.
joeytwiddle

5
Lệnh đó là :earlier 1f. Có 1fnghĩa là "1 trạng thái đã lưu trước đó", vì vậy nó sẽ quay trở lại lần trước bạn đã lưu tệp. Nếu bộ đệm được sửa đổi, thì điều đó hoàn tác tất cả các sửa đổi. Nếu bộ đệm không được sửa đổi (nghĩa là nó hiện đang ở trạng thái đã lưu), thì nó sẽ chuyển sang lần trước bạn đã lưu tệp.
jamessan
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.