2013-08-01 2 views
6

지금은 vim에서 자동 완성 기능을 사용하고 있으며 완료를 처리하기 위해 supertab에 정착했습니다. 디자인이 매우 원활하게 진행되는 동안 (나는 생각합니다), 뭔가 바꿀 방법을 알고 싶습니다.vim에서 자동 완성을 효율적으로 실행 취소하는 방법

첫째, 나는 그래서 인 Supertab와 bash는 형 자동 완성을 가지고

set completeopt=menuone,preview,longest 

와 우분투 12.04LTS에 7.3.429을 실행하고 완전한 기본거야.

의 내가 내 파일에 다음 있다고 가정하자 : 나는 aa를 입력하고 에 충돌하는 경우

aaabbbcccddd 
aaabbccddeef 
aaabbcddeeff 

, 다음 정력이 aaabb을 삽입하고, 그래서 aaabb가 경기 중 가장 긴 일반적인 문자열이라고 실현 세 가지 옵션을 포함하는 메뉴를 표시합니다. 만약 내가 정말로 그 옵션들 중 하나를 원한다면, 모두 좋다. 하지만 어쩌면 난 aaaaazzzzz을 원했지만 아직 입력하지 않았다는 것을 몰랐습니다.

정력을 말하는 좋은 방법이 있습니까? "오, 미안 해요. 결국 결말을 내고 싶지 않았어! 내가하지 않은 척 해줘."

는 지금, 나에게 알 수있는 옵션은 다음과 같다

  1. 또는 시프트 충분한 시간을 다시 내 초기에 얻을 + 탭을 누르십시오. 그러나 비슷한 길이의 단어가 여러 개있는 경우, 특히 길이가 다른 경우이 경우 성가시다.
  2. 그러나 여러 번 필요한 백 스페이스 또는 다른 순진한 삭제를 누릅니다. 그러나 이것들은 분명히 불필요한 키 스트로크이다.
  3. 실행 취소를 얻으려면 Esc + u을 누르십시오. 그러나 이것은 내 전체 단어를 삭제합니다. 이것은 전적으로 받아 들일 수없는 것이다. 그리고 나서, 삽입 모드를 다시 입력하고 다시 입력해야합니다. 심한.
  4. 는 삽입 모드를 떠나지 않고 취소 할 에게 Ctrl 키 + U를 누르십시오. 그러나 이것은 또한 너무 많이 제거하려는 경향이 있습니다.
  5. + 마지막 단어를 삭제하십시오. 삽입 모드를 종료하지 않고도이 작업을 수행 할 수 있지만 다시 입력해야합니다. 이것은 내가 지금까지 찾은 최고의 것이다. 내가 longest를 설정하지 않은 경우

, 나는 다른 것을 삽입하지 않고 메뉴를 종료 Ctrl 키 + E을 사용할 수 있습니다. 하지만 가장 길기 때문에 자동 완성이 중지되지만 입력 된 가장 긴 공통 입력이 남습니다.

확실히 더 좋은 방법이 있어야합니다.

답변

2

vim에는이 작업을 수행하는 2 가지 기본 방법이 있습니다. 해당 항목이 완료 메뉴에 없다는 것을 알고 있다면 <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> 
... 
관련 문제