Vim 句子插入模式补全

Vim 句子插入模式补全

我希望在 vim 中对句子而不是行进行插入模式补全。

C-x C-l完成行,但无法完成不以新行开头的句子。

例如:

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

我希望能够输入:

My dog

然后按一个键来完成句子。

做这个的最好方式是什么? A具有相同标题的线程没有解决办法。

答案1

尝试 Cx 铜。您需要按照 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

相关内容