如何在 INSERT 模式下击键时触发 omnicomplete/auto-completion?
How to trigger omnicomplete/auto-completion on keystrokes in INSERT mode?
VIM 的 omnicomplete 自动完成功能并没有像预期的那样工作。
有没有办法让它更聪明?比如,监视环绕文本的上下文? (例如,如果在评论或引号内则不触发)
我问是因为与 Visual Studio、IntelliJ、Sublime 和 Atom(我'过去我曾将所有这些用于开发)。
本题的基本目标:
- Omnicomplete 可以在 INSERT 模式下按 A-Za-z 键触发吗?我已经通过“。”触发了它。点符号。
- 如何让 Omnicomplete 插入函数的参数?
我刚接触 Vim 几个月,拼命想获得顺畅的工作流程。但是如果没有一个好的自动完成选项,虽然迫使我在学习我尝试使用的代码时更加警惕,但与我过去使用的其他 IDE 相比,我的速度大大降低了。
Atom + Go-Plus
让我们看看我对 Atom + Go-Plus 的期望。
我有一个名为 func generate(entropy chan<- uint64)
的函数,位于同一个包中另一个 Go 文件的其他地方。
当我在第 22 行键入字母 g
时,我立即收到以 g 开头的所有内容的提示:
如您所见,有 3 个选项会立即弹出(前两个我认为只是代码片段)。我可以使用箭头键向下滚动到任一选项。
如果我 select 第三个选项(或者如果我继续键入 gen
字段缩小到只有 1 个选项),并且 press enter
Atom/Visual Studio/Sublime全部填写详细方法给我:
我没有输入以上任何内容。它已插入,我可以覆盖详细信息、修改它们,或者只是关闭 TAB 键并继续输入。
Vim + Vim-Go(真的Omnicomplete)
让我们将其与我当前(可能已损坏?)的 omnicomplete
配置进行比较。我的 .vimrc:
里有这个
set completeopt=longest,menuone
在 vim 内,如果我键入 gen
,我得到的似乎是我之前输入的文本,我在此缓冲区的其他地方键入(并且仅在此缓冲区中,而不是在其他缓冲区中)缓冲区)。如果我碰巧拼错了某些东西,我会得到我之前输入的拼写错误的版本,我打开了 vim。这告诉我没有 IntelliSense/autocomplete 在工作 - 只是监视我所做的击键的东西:
如您所见,我键入时自动完成功能不起作用。不过,这对于其他地方的注释和字符串确实很有用,我有点喜欢 vim 记住我输入的自由文本的方式。
不太确定是什么 Vim 选项启用了此功能;但是,它不是自动完成的。
现在,我可以按 CTRL-X + CTRL-O
强制自动完成并显示 generate()
:
这样更好;但是,我希望它在我键入时显示自动完成选项:不需要 3 次额外的击键来实现它。在几个小时的编码过程中,发生了很多 C-x C-o 事件。
有没有办法让 Vim 在 INSERT 模式下监视我的击键并在有匹配的 ctag 或函数时显示自动完成? 这可能是答案这个功能。
自动完成参数
omnicomplete
的自动补全有第二个问题,如果这可行,我可以忽略上面的 C-x C-o 要求:一旦我执行 select 我想要自动补全的方法,它确实不要为我插入 parameters/fields。
回到上面的截图,如果我select那个方法,这就是我得到的:
请注意,它不会插入 函数的参数。它与上面发布的第二张图片不匹配,其中 Atom、Sublime 和 Visual Studio 中的自动完成都完成了带有参数显示的方法。
我已经阅读了 vim 维基百科,并尝试了 set completeopt
的各种选项,但没有任何可行的选择。
例如,set completeopt+=preview
在 selecting:
之后给我预览 window
为什么要在预览中给我参数,它仍然不会自动完成我的 line 22
代码,而且经常会分散注意力(我经常禁用它,因为我打字的速度比停下来要快得多 "look up"一直)。
为了使下面的工作正常进行,对配置文件进行了大量调整;但是,我能够让 "dot" 自动完成工作。所以,有某种形式的自动完成工作:
但是,一旦我 select 一个函数,它就不会填写参数,不得不键入 ESC + back arrow + back arrow + : + GoDoc
只是为了看看它是什么,这是非常烦人的:那是 10 个字符的笔画那是什么。
当然,当 "dot autocompleting":
时,Atom、Sublime 和 VS 更漂亮
(它也最好按类型排序,尽管我确实有 vim 设置以记住顶部最后使用的,这样会有所帮助)。但我不关心漂亮 - 我只是希望我的参数在 selecting 与 'dot' 时显示。
任何关于如何调整我的 vim-go 和相关插件的建议都将非常受欢迎,因为我更愿意继续使用 Vim 而不是任何 IDE。谢谢。
编辑:
我看到 the author of vim-go
已经完成了参数完成部分并开始工作:
虽然,我似乎无法让它在我的安装中运行(仍在调试它),但我想向其他人展示确实可以在填充参数的情况下自动完成。
Can Omnicomplete be triggered on A-Za-z keystrokes in INSERT mode?
您可以监听 InsertCharPre
事件并检查按下了哪些键。
function! OpenCompletion()
if !pumvisible() && ((v:char >= 'a' && v:char <= 'z') || (v:char >= 'A' && v:char <= 'Z'))
call feedkeys("\<C-x>\<C-o>", "n")
endif
endfunction
autocmd InsertCharPre * call OpenCompletion()
您还应该 set completeopt+=menuone,noselect,noinsert
避免 vim 自动插入完成文本。但请记住,这不是常见的决定,您可能会遇到一些问题。我发现的是它破坏了 cgn
命令。
如需进一步阅读,请执行 help InsertCharPre
、help autocmd-events
、help pumvisible()
、help feedkeys()
。
How to get Omnicomplete to insert the func's parameters?
我使用 sublime 几年了,它用片段表示内置函数(默认 vim omnicompletion)。所以如果你想把参数插入缓冲区你需要:
- 安装片段管理器,例如 ultisnips、neosnippet、minisnip、 xptemplate 或 others.
- 创建一堆片段或从某处安装。
- 让您的完成系统识别首选的代码片段管理器(许多完成管理器识别 ultisnips)。
如果您改变主意使用所谓的 preview window,这里有一些提示:
- 可以在屏幕底部显示预览 window
set splitbelow
。
- 您可以
set previewheight
选项来更改其大小。
- 完成后自动关闭window
autocmd CompleteDone * pclose
。
如需进一步阅读,请执行 help ins-completion
和 help preview-window
有很多方法包括触发 omnicompletion,正如同行在这里回答的那样。另一种方法是使用插件。有几个不错的,我发现最快的没有多余装饰的基本弹出完成,你可以开箱即用地触发 omnicomplete,如下所示:
如果您使用的是 plug
,请在 .vimrc
中放置以下行
Plug 'maralla/completor.vim' " enables completion - https://github.com/maralla/completor.vim
希望对您有所帮助。
我发现@Evgeniy 的回答几乎是完美的 - 但我确实发现
重播宏时,光标有时会落下一行(这会
打破宏)。我设法用以下功能解决了它
自动命令:
set completeopt+=menuone,noselect,noinsert " don't insert text automatically
set pumheight=5 " keep the autocomplete suggestion menu small
set shortmess+=c " don't give ins-completion-menu messages
" if completion menu closed, and two non-spaces typed, call autocomplete
let s:insert_count = 0
function! OpenCompletion()
if string(v:char) =~ ' '
let s:insert_count = 0
else
let s:insert_count += 1
endif
if !pumvisible() && s:insert_count >= 2
silent! call feedkeys("\<C-n>", "n")
endif
endfunction
function! TurnOnAutoComplete()
augroup autocomplete
autocmd!
autocmd InsertLeave let s:insert_count = 0
autocmd InsertCharPre * silent! call OpenCompletion()
augroup END
endfunction
function! TurnOffAutoComplete()
augroup autocomplete
autocmd!
augroup END
endfunction
function! ReplayMacroWithoutAutoComplete()
call TurnOffAutoComplete()
let reg = getcharstr()
execute "normal! @".reg
call TurnOnAutoComplete()
endfunction
call TurnOnAutoComplete()
" don't let the above mess with replaying macros
nnoremap <silent> @ :call ReplayMacroWithoutAutoComplete()<CR>
" use tab for navigating the autocomplete menu
inoremap <expr> <TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <expr> <S-TAB> pumvisible() ? "\<C-p>" : "\<TAB>"
VIM 的 omnicomplete 自动完成功能并没有像预期的那样工作。
有没有办法让它更聪明?比如,监视环绕文本的上下文? (例如,如果在评论或引号内则不触发)
我问是因为与 Visual Studio、IntelliJ、Sublime 和 Atom(我'过去我曾将所有这些用于开发)。
本题的基本目标:
- Omnicomplete 可以在 INSERT 模式下按 A-Za-z 键触发吗?我已经通过“。”触发了它。点符号。
- 如何让 Omnicomplete 插入函数的参数?
我刚接触 Vim 几个月,拼命想获得顺畅的工作流程。但是如果没有一个好的自动完成选项,虽然迫使我在学习我尝试使用的代码时更加警惕,但与我过去使用的其他 IDE 相比,我的速度大大降低了。
Atom + Go-Plus
让我们看看我对 Atom + Go-Plus 的期望。
我有一个名为 func generate(entropy chan<- uint64)
的函数,位于同一个包中另一个 Go 文件的其他地方。
当我在第 22 行键入字母 g
时,我立即收到以 g 开头的所有内容的提示:
如您所见,有 3 个选项会立即弹出(前两个我认为只是代码片段)。我可以使用箭头键向下滚动到任一选项。
如果我 select 第三个选项(或者如果我继续键入 gen
字段缩小到只有 1 个选项),并且 press enter
Atom/Visual Studio/Sublime全部填写详细方法给我:
我没有输入以上任何内容。它已插入,我可以覆盖详细信息、修改它们,或者只是关闭 TAB 键并继续输入。
Vim + Vim-Go(真的Omnicomplete)
让我们将其与我当前(可能已损坏?)的 omnicomplete
配置进行比较。我的 .vimrc:
set completeopt=longest,menuone
在 vim 内,如果我键入 gen
,我得到的似乎是我之前输入的文本,我在此缓冲区的其他地方键入(并且仅在此缓冲区中,而不是在其他缓冲区中)缓冲区)。如果我碰巧拼错了某些东西,我会得到我之前输入的拼写错误的版本,我打开了 vim。这告诉我没有 IntelliSense/autocomplete 在工作 - 只是监视我所做的击键的东西:
如您所见,我键入时自动完成功能不起作用。不过,这对于其他地方的注释和字符串确实很有用,我有点喜欢 vim 记住我输入的自由文本的方式。
不太确定是什么 Vim 选项启用了此功能;但是,它不是自动完成的。
现在,我可以按 CTRL-X + CTRL-O
强制自动完成并显示 generate()
:
这样更好;但是,我希望它在我键入时显示自动完成选项:不需要 3 次额外的击键来实现它。在几个小时的编码过程中,发生了很多 C-x C-o 事件。
有没有办法让 Vim 在 INSERT 模式下监视我的击键并在有匹配的 ctag 或函数时显示自动完成? 这可能是答案这个功能。
自动完成参数
omnicomplete
的自动补全有第二个问题,如果这可行,我可以忽略上面的 C-x C-o 要求:一旦我执行 select 我想要自动补全的方法,它确实不要为我插入 parameters/fields。
回到上面的截图,如果我select那个方法,这就是我得到的:
请注意,它不会插入 函数的参数。它与上面发布的第二张图片不匹配,其中 Atom、Sublime 和 Visual Studio 中的自动完成都完成了带有参数显示的方法。
我已经阅读了 vim 维基百科,并尝试了 set completeopt
的各种选项,但没有任何可行的选择。
例如,set completeopt+=preview
在 selecting:
为什么要在预览中给我参数,它仍然不会自动完成我的 line 22
代码,而且经常会分散注意力(我经常禁用它,因为我打字的速度比停下来要快得多 "look up"一直)。
为了使下面的工作正常进行,对配置文件进行了大量调整;但是,我能够让 "dot" 自动完成工作。所以,有某种形式的自动完成工作:
但是,一旦我 select 一个函数,它就不会填写参数,不得不键入 ESC + back arrow + back arrow + : + GoDoc
只是为了看看它是什么,这是非常烦人的:那是 10 个字符的笔画那是什么。
当然,当 "dot autocompleting":
时,Atom、Sublime 和 VS 更漂亮(它也最好按类型排序,尽管我确实有 vim 设置以记住顶部最后使用的,这样会有所帮助)。但我不关心漂亮 - 我只是希望我的参数在 selecting 与 'dot' 时显示。
任何关于如何调整我的 vim-go 和相关插件的建议都将非常受欢迎,因为我更愿意继续使用 Vim 而不是任何 IDE。谢谢。
编辑:
我看到 the author of vim-go
已经完成了参数完成部分并开始工作:
虽然,我似乎无法让它在我的安装中运行(仍在调试它),但我想向其他人展示确实可以在填充参数的情况下自动完成。
Can Omnicomplete be triggered on A-Za-z keystrokes in INSERT mode?
您可以监听 InsertCharPre
事件并检查按下了哪些键。
function! OpenCompletion()
if !pumvisible() && ((v:char >= 'a' && v:char <= 'z') || (v:char >= 'A' && v:char <= 'Z'))
call feedkeys("\<C-x>\<C-o>", "n")
endif
endfunction
autocmd InsertCharPre * call OpenCompletion()
您还应该 set completeopt+=menuone,noselect,noinsert
避免 vim 自动插入完成文本。但请记住,这不是常见的决定,您可能会遇到一些问题。我发现的是它破坏了 cgn
命令。
如需进一步阅读,请执行 help InsertCharPre
、help autocmd-events
、help pumvisible()
、help feedkeys()
。
How to get Omnicomplete to insert the func's parameters?
我使用 sublime 几年了,它用片段表示内置函数(默认 vim omnicompletion)。所以如果你想把参数插入缓冲区你需要:
- 安装片段管理器,例如 ultisnips、neosnippet、minisnip、 xptemplate 或 others.
- 创建一堆片段或从某处安装。
- 让您的完成系统识别首选的代码片段管理器(许多完成管理器识别 ultisnips)。
如果您改变主意使用所谓的 preview window,这里有一些提示:
- 可以在屏幕底部显示预览 window
set splitbelow
。 - 您可以
set previewheight
选项来更改其大小。 - 完成后自动关闭window
autocmd CompleteDone * pclose
。
如需进一步阅读,请执行 help ins-completion
和 help preview-window
有很多方法包括触发 omnicompletion,正如同行在这里回答的那样。另一种方法是使用插件。有几个不错的,我发现最快的没有多余装饰的基本弹出完成,你可以开箱即用地触发 omnicomplete,如下所示:
如果您使用的是 plug
,请在 .vimrc
Plug 'maralla/completor.vim' " enables completion - https://github.com/maralla/completor.vim
希望对您有所帮助。
我发现@Evgeniy 的回答几乎是完美的 - 但我确实发现 重播宏时,光标有时会落下一行(这会 打破宏)。我设法用以下功能解决了它 自动命令:
set completeopt+=menuone,noselect,noinsert " don't insert text automatically
set pumheight=5 " keep the autocomplete suggestion menu small
set shortmess+=c " don't give ins-completion-menu messages
" if completion menu closed, and two non-spaces typed, call autocomplete
let s:insert_count = 0
function! OpenCompletion()
if string(v:char) =~ ' '
let s:insert_count = 0
else
let s:insert_count += 1
endif
if !pumvisible() && s:insert_count >= 2
silent! call feedkeys("\<C-n>", "n")
endif
endfunction
function! TurnOnAutoComplete()
augroup autocomplete
autocmd!
autocmd InsertLeave let s:insert_count = 0
autocmd InsertCharPre * silent! call OpenCompletion()
augroup END
endfunction
function! TurnOffAutoComplete()
augroup autocomplete
autocmd!
augroup END
endfunction
function! ReplayMacroWithoutAutoComplete()
call TurnOffAutoComplete()
let reg = getcharstr()
execute "normal! @".reg
call TurnOnAutoComplete()
endfunction
call TurnOnAutoComplete()
" don't let the above mess with replaying macros
nnoremap <silent> @ :call ReplayMacroWithoutAutoComplete()<CR>
" use tab for navigating the autocomplete menu
inoremap <expr> <TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <expr> <S-TAB> pumvisible() ? "\<C-p>" : "\<TAB>"