Vim 문장 삽입 모드 완성

Vim 문장 삽입 모드 완성

줄 대신 문장에 대해 vim에서 삽입 모드 완성을 원합니다.

C-x C-l줄을 완성하지만 새 줄로 시작하지 않는 문장은 완성할 수 없습니다.

예를 들어:

I have a dog. My dog's name is Spot.

나는 다음을 입력할 수 있기를 원합니다:

My dog

그런 다음 키를 눌러 문장을 완성하세요.

이를 수행하는 가장 좋은 방법은 무엇입니까? ㅏ같은 제목의 스레드해결책이 없습니다.

답변1

Cx Copper를 사용해 보세요. vim 도움말의 전체 기능 섹션에 설명된 대로 완성을 정의해야 합니다. 유형:

:help complete-functions

그래야만 이 섹션을 볼 수 있습니다. 비슷하게,

:help i_^X

(여기서 ^X는 Cx 문자입니다.) 이 모드를 설명하는 섹션이 표시됩니다. 문장은 일반적으로 / 패턴으로 끝나는 것을 기억하세요. /. 행운을 빌어요.

답변2

문장을 완성하기 위해 동의어 사전 완성기를 수정했습니다. 일부 개선은 PWD/를 사용하여 수행할 수 있습니다., 구텐베르크/책/, 커서 주위의 컨텍스트를 사용하는 더 나은 정규식입니다.

" What: Complete sentence
" Usage: :so % <CR> Get sentence[press C-x C-o]
" How:  Get sentence completions using perl from current  file

set completeopt+=menuone

set omnifunc=MoshCompleteSentence
function!    MoshCompleteSentence(findstart, base)
    " == First call: find-sentence-backwards, see :help omnifunc
    if a:findstart
        let s:line = getline('.')
        let s:wordStart = col('.') - 1
        " Check backward for a sentence_prefix
        while s:wordStart > 0 && s:line[s:wordStart - 1] =~ '[A-Za-z0-9 _,]'
            let s:wordStart -= 1
        endwhile
        return s:wordStart

    else
        " == Second call: grep for sentence_regex, output: list of sentences
        let a:sentence_regex = a:base
        " in regex trim spaces
        let a:sentence_regex = substitute( a:sentence_regex,'\v^\s*(.{-})\s*$','\1','')
        " in regex change punctuation as dot.
        let a:sentence_regex = substitute(a:sentence_regex,'\W','.','g')
        " grep using perl
        let s:cmd='perl -ne '' '
            \.'chomp;'
            \.'next if m/^[;#]/;'
            \.'if( /('.a:sentence_regex.'.{1,30})/io ){'
            \.'   print qq/$1;;/ '
            \.'}'
            \. ' '' '
            \.expand("%:p")
        " == To debug: redir echom to file
        " redir >> c:/tmp/vim.log
        echom s:cmd
        let   s:rawOutput = system(s:cmd)
        let   s:listing = split(s:rawOutput, ';;')
        " echom join(s:listing,',')
        " redir END
        return s:listing
    endif
endfunction

관련 정보