2013-08-01 35 views
6

Hiện tại tôi đang phát với tự động hoàn thành trong vim và tôi đã giải quyết trên supertab để xử lý các lần hoàn thành của mình. Trong khi nó chạy rất trơn tru và (tôi nghĩ) chính xác như nó được thiết kế, tôi muốn biết làm thế nào để thay đổi một cái gì đó.Cách hoàn tác hiệu quả tự động hoàn thành trong vim

Thứ nhất, tôi đang chạy 7.3.429 trên Ubuntu 12.04LTS với

set completeopt=menuone,preview,longest 

vì vậy mà tôi có bash-type autocompletion với supertab, và mặc định đầy đủ.

Giả sử tôi có những điều sau đây trong tập tin của tôi:

aaabbbcccddd 
aaabbccddeef 
aaabbcddeeff 

Nếu tôi gõ aa và nhấn Tab, sau đó vim nhận ra rằng aaabb là chuỗi chung dài nhất trong các trận đấu, vì vậy nó chèn aaabb và hiển thị menu chứa ba tùy chọn. Nếu tôi thực sự muốn một trong những lựa chọn đó thì tất cả đều tốt. Nhưng có lẽ tôi thực sự muốn aaaaazzzzz, nhưng không nhận ra tôi chưa nhập nó.

Có cách nào tốt để nói vim, "Ồ, tôi xin lỗi! Tôi không có nghĩa là để hoàn thành sau khi tất cả! Xin vui lòng giả vờ tôi đã không."

Ngay bây giờ, các tùy chọn rõ ràng với tôi là:

  1. Hit Tab hay phím Shift +Tab đủ thời gian để trở lại ban đầu của tôi. Nhưng nếu có nhiều từ tương tự, đặc biệt là với độ dài khác nhau, điều này thật khó chịu.
  2. Nhấn phím xóa lùi nhiều lần, hoặc một số lần xóa ngây thơ khác. Nhưng đây chắc chắn là những nét chính không cần thiết.
  3. Lượt Esc + u để hoàn tác, nhưng điều này hoàn tác toàn bộ từ của tôi (hoặc nhiều hơn nếu tôi nhập nhanh). Điều này hoàn toàn không thể chấp nhận được. Và sau đó, tôi cần phải nhập lại chế độ chèn và gõ lại. Tổng.
  4. Lượt Ctrl + U để hoàn tác mà không thoát chế độ chèn. Nhưng điều này cũng có xu hướng loại bỏ quá nhiều.
  5. Lượt Ctrl + W để xóa từ cuối cùng. Trong khi tôi nhận được để làm điều này mà không thoát khỏi chế độ chèn, tôi vẫn phải gõ lại. Đây là điều tốt nhất tôi đã tìm thấy cho đến nay.

Nếu tôi không có longest kích hoạt, sau đó tôi có thể sử dụng tổ hợp phím Ctrl + E, mà bỏ menu mà không chèn bất cứ điều gì khác. Nhưng kể từ khi dài nhất là ngày, nó dừng tự động hoàn thành nhưng rời khỏi trận đấu phổ biến dài nhất được nhập vào.

Chắc chắn phải có cách tốt hơn để thực hiện việc này.

Trả lời

2

Có 2 cách bản địa để thực hiện việc này trong thời gian thực. Nếu bạn biết đúng mục không có trong menu hoàn thành, bạn có thể sử dụng <c-y>. <c-y> chấp nhận kết quả khớp hiện tại nếu bạn không di chuyển mặc dù bất kỳ lần hoàn thành nào sẽ chỉ gửi lại cho bạn văn bản bạn đã chèn. (Cách thứ hai) Tuy nhiên nếu bạn đã di chuyển qua trình đơn hoàn thành, bạn có thể di chuyển cho đến khi bạn quay lại văn bản gốc.

Tuy nhiên, tôi cho rằng không quá khó để đơn giản chấp nhận đối sánh dài nhất và chỉnh sửa từ đó. Bạn cũng có thể sử dụng <c-g>u để chia nhỏ khối hoàn tác bằng cách làm việc với bản đồ <tab> của mình. Mặc dù điều đó có thể phá vỡ lịch sử lên nhiều hơn bạn muốn.

+0

Cảm ơn bạn. Tôi đã không thử . Nhưng tôi thừa nhận, tôi bối rối. Đọc tài liệu, tôi không giải thích 'kết quả hiện tại' là văn bản được chèn trước, ban đầu dài nhất. Đặc biệt là khi dường như cho biết rằng nó phải là một trong đó hoàn tác việc hoàn thành. Tôi có đọc tài liệu rất sai không? – mixedmath

+0

Tôi hiểu tại sao bạn đang bối rối về '' tuy nhiên bạn cần đọc thêm một chút: Kết thúc kết thúc, quay lại những gì đã có trước khi chọn một kết quả phù hợp (chuỗi đã gõ hoặc chuỗi dài nhất). –

2

Điều này là khó khăn, nhưng tôi đã có cùng một vấn đề và đã thực hiện một cái gì đó. Nhược điểm là tôi đã phải quá tải bất kỳ kích hoạt hoàn thành (được xây dựng trong và tùy chỉnh) để lần đầu tiên gọi một chức năng tùy chỉnh mà thiết lập một nhãn hiệu để bắt đầu hoàn thành.Sau đó, tôi lập bản đồ <Esc> ở chế độ chèn (với trình đơn bật lên có thể nhìn thấy) để xóa văn bản lên đến dấu đó.

function! s:SetUndo() 
    call setpos("'\"", getpos('.')) 
    return '' 
endfunction 
inoremap <expr> <SID>(CompleteStart) <SID>SetUndo() 
function! s:UndoLongest() 
     " After a completion, the line must be the same and the column must be 
     " larger than before. 
     if line("'\"") == line('.') && col("'\"") < col('.') 
      return "\<C-\>\<C-o>dg`\"" 
     endif 
    endif 
    return '' 
endfunction 
imap <expr> <Esc>  pumvisible() ? <SID>UndoLongest() : '<Esc>' 

inoremap <script> <C-x><C-n> <SID>(CompleteStart)<C-x><C-n> 
inoremap <script> <C-x><C-p> <SID>(CompleteStart)<C-x><C-p> 
... 
Các vấn đề liên quan