Vim completar modo de inserção para sentenças

5

Eu gostaria de ter a conclusão do modo de inserção para sentenças em vez de linhas no vim.

C-x C-l conclui linhas, mas não pode concluir frases que não iniciam com uma nova linha.

Por exemplo:

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

Eu quero poder digitar:

My dog

depois, pressione uma tecla para completar a frase.

Qual é a melhor maneira de fazer isso? Um tópico com o mesmo título não tinha uma solução.

    
por stackoverflowed 06.06.2012 / 01:44

2 respostas

3

Tente C-x C-u. Você precisará definir a conclusão conforme descrito na seção de funções completas da ajuda do vim. Tipo:

:help complete-functions

Para ver esta seção. Da mesma forma,

:help i_^X

(onde ^ X é o caractere C-x) mostrará a seção que descreve este modo. Tenha em mente que as sentenças geralmente terminam com o padrão /. /. Boa sorte.

    
por 06.06.2012 / 20:57
0

Eu modifiquei meu dicionário de sinônimos para concluir a sentença. Algumas melhorias seriam Completo usando PWD / , Gutenberg / books / , Melhor regex usando o contexto em torno do cursor.

" 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*$','','')
        " 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
    
por 08.09.2017 / 06:23