Làm thế nào để thay đổi độ chi tiết hoàn tác trong Vim?


11

Tại một số điểm, Vim của tôi sẽ hoàn tác toàn bộ từ khi tôi nhấn u.

[i]typing some words[C-c][u]

Sẽ dẫn đến

typing some

Tuy nhiên, độ chi tiết hoàn tác dường như đã thay đổi thành xóa từng chữ cái một.

[i]typing some words[C-c][u]

Kết quả trong

typing some word

Tôi nhớ đã đọc một cái gì đó về việc tùy chỉnh độ hoàn tác chi tiết trong Vim thực tế, nhưng tôi không thể nhớ cách kiểm soát nó. Bất kỳ trợ giúp đánh giá cao!


2
Có lẽ có một cái gì đó trong vimrc của bạn làm điều này. Tôi không thể sao chép nó và không thể tìm thấy bất cứ điều gì trong các :helptệp về nó ... Xem: Làm cách nào để gỡ lỗi tệp vimrc của tôi? ... Ngoài ra, sử dụng <C-c>để thoát chế độ chèn có thể có tác dụng phụ ( xem phần này ) và có thể là một phần của vấn đề ... Tôi sẽ đề nghị sử dụng Eschoặc <C-[>( xem phần này )
Martin Tournoij

Câu trả lời:


11

Tự phá vỡ chuỗi hoàn tác

Bạn có thể tự ngắt chuỗi hoàn tác trong chế độ Chèn với <C-G>u. Từ sự giúp đỡ :

CTRL-G u        break undo sequence, start new change

Thí dụ

iHello<C-G>u world!<Esc>u

Điều này sẽ để lại cho bạn với các văn bản

Hello

Phân tích các lệnh

i                           " Enter Insert mode
 Hello                      " Type 'Hello'
      <C-G>u                " Break the undo sequence
             world!         " Type ' world!'
                   <Esc>    " Return to Normal mode
                        u   " Undo

Giải pháp tự động

Kiểm soát hoàn tác cấp độ hạt mịn hơn

Đây là một đoạn nhỏ của VimScript sử dụng <C-G>uđể tạo các ngắt hoàn tác khi bạn bắt đầu xóa văn bản và cả khi bạn bắt đầu nhập lại văn bản sau khi xóa.

function! s:start_delete(key)
    let l:result = a:key
    if !s:deleting
        let l:result = "\<C-G>u".l:result
    endif
    let s:deleting = 1
    return l:result
endfunction

function! s:check_undo_break(char)
    if s:deleting
        let s:deleting = 0
        call feedkeys("\<BS>\<C-G>u".a:char, 'n')
    endif
endfunction

augroup smartundo
    autocmd!
    autocmd InsertEnter * let s:deleting = 0
    autocmd InsertCharPre * call s:check_undo_break(v:char)
augroup END

inoremap <expr> <BS> <SID>start_delete("\<BS>")
inoremap <expr> <C-W> <SID>start_delete("\<C-W>")
inoremap <expr> <C-U> <SID>start_delete("\<C-U>")

Ghi chú

Điều này sẽ làm việc cho <BS>, <C-W>(xóa một từ) và <C-U>(xóa đến đầu dòng). Nếu có nhiều cách để xóa trong chế độ Chèn, chúng có thể được hỗ trợ bằng cách thêm các inoremapcuộc gọi bổ sung vào cuối.


4
Vấn đề duy nhất là, bạn không thấy trước rằng bạn sẽ hoàn tác sau này (nếu không bạn sẽ không làm điều đó ngay từ đầu). Vì vậy, bạn thường kết thúc với một tình huống mà bạn muốn bạn đã sử dụng <C-G>u, đã quá muộn.
Shahbaz

4
Đúng. Trên thực tế một cái gì đó tôi đã bỏ lỡ chính mình là đây. Đôi khi tôi làm điều này itheo sau bởi câu dài theo sau là backspace để loại bỏ một phần của những gì tôi đã viết (tất cả trong chế độ chèn). Sau đó, tôi nhận ra rằng tôi không nên viết ngược và những gì tôi đã viết là tốt. Tôi hoàn tác, nhưng sau đó toàn bộ văn bản được chèn sẽ được hoàn tác. Vì vậy, hoặc tôi không có câu nào dài, hoặc phần không được đặt ngược. Không thể lấy lại phần bị lùi. Có cách nào để bảo vim phá vỡ chuỗi hoàn tác khi quay lại không? (Bây giờ tôi nói nó, maping backspace là một tùy chọn tất nhiên).
Shahbaz

2
Đối với khách truy cập trong tương lai, tôi cũng đã thêm inoremap <CR> <C-G>u<CR>để mỗi lần hoàn tác được chứa trong một dòng duy nhất (không hoàn tác toàn bộ đoạn mà bạn đang gõ không ngừng).
Shahbaz

1
@Shahbaz, hoàn toàn :)
tommcdo

1
@Shahbaz "Tôi có được phép sao chép không?" Xem liên kết ở cuối trang: "đóng góp của người dùng được cấp phép theo cc by-sa 3.0 với yêu cầu ghi công"
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.