2013-08-01 1 views
6

Прямо сейчас я играю с автозаполнениями в vim, и я установил supertab для обработки моих завершений. Хотя он работает очень плавно и (я думаю) точно так, как он разработан, я хотел бы знать, как что-то изменить.Как эффективно отменить автозаполнение в vim

Во-первых, я бегу 7.3.429 на Ubuntu 12.04LTS с

set completeopt=menuone,preview,longest 

так, что у меня есть Баш типа автодополнение с supertab, и по умолчанию в комплекте.

Давайте предположим, что у меня есть следующие в моем файле:

aaabbbcccddd 
aaabbccddeef 
aaabbcddeeff 

Если я печатаю aa и нажмите Tab, затем ВИМ понял, что aaabb является наибольшей общей строкой среди матчей, поэтому он вставляет aaabb и отображает меню, содержащее три параметра. Если мне действительно нужен один из этих вариантов, то все хорошо. Но, может быть, я действительно хотел aaaaazzzzz, но не понял, что еще не набрал его.

Есть ли хороший способ сказать vim: «О, извините, я не собирался делать это в конце концов! Пожалуйста, притворись, что я этого не сделал».

Прямо сейчас, варианты, очевидные для меня являются:

  1. Hit Tab или Shift, + Tab достаточное количество раз, чтобы вернуться к своей исходной. Но если есть много похожих слов, особенно до разных длин, это раздражает.
  2. Хит backspace однако много раз необходимо, или какой-либо другой наивный удаление. Но это, безусловно, лишние ключевые штрихи.
  3. Убейте Esc + u, чтобы отменить, но это отменяет все мое слово (или больше, если я набираю текст быстро). Это совершенно неприемлемо. А потом мне нужно снова войти в режим вставки и повторить. Валовой.
  4. Хит Ctrl + U для отмены, не выходя из режима вставки. Но это также имеет тенденцию слишком сильно удалять.
  5. Хит Ctrl + W, чтобы удалить последнее слово. Пока я получаю это, не выходя из режима вставки, мне все равно придется перепечатывать. Это лучшее, что я нашел до сих пор.

Если у меня не было longest включена, то я мог бы использовать Ctrl +E, который выходит из меню без вставки ничего другого. Но с тех пор, как он длится, он останавливает автозаполнение, но оставляет самое длинное общее совпадение.

Конечно, должен быть лучший способ сделать это.

ответ

2

Есть 2 местных способа сделать это в vim. Если вы правильно знаете, что элемент не находится в меню завершения, вы можете использовать <c-y>. <c-y> принимает текущее совпадение, которое, если вы не переместили ни одно завершение, отправит вас обратно только на введенный вами текст. (Второй способ) Однако, если вы перешли через меню завершения, вы можете двигаться, пока не вернетесь к исходному тексту.

Однако я полагаю, что нелегко просто принять самое длинное совпадение и отредактировать слово. Вы также можете использовать <c-g>u, чтобы разбить блок отмены, выполнив его в вашем <tab> сопоставлении. Хотя это может сломать историю больше, чем вы хотите.

+0

спасибо. Я не пробовал . Но, признаюсь, я смущен. Читая документацию, я не интерпретирую текущее соответствие как исходный, самый длинный текст вообще. Особенно, когда , по-видимому, указывает, что это должно быть то, что отменяет завершение. Я читаю документацию очень неправильно? – mixedmath

+0

Я понимаю, почему вы путаетесь о '', однако вам нужно прочитать чуть дальше: завершите завершение, вернитесь к тому, что было там, прежде чем выбирать соответствие (что было типизировано или самая длинная общая строка). –

2

Это сложно, но у меня была та же проблема и что-то реализовано. Недостатком является то, что мне пришлось перегружать любой (встроенный и настраиваемый) триггер завершения, чтобы сначала вызвать пользовательскую функцию, которая устанавливает знак в начало завершения.Затем я отобразим <Esc> в режиме вставки (со всплывающим меню), чтобы удалить текст до этой отметки.

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> 
... 

 Смежные вопросы

  • Нет связанных вопросов^_^