我希望在 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