比 deoplete 更快!比 YCM 更轻!支持 neovim/vim8 的自动补全框架!

2017-03-04 14:19:02 +08:00
 pony279

一大波 gif 在这里: https://github.com/roxma/nvim-completion-manager/issues/12

关于为什么更快的问题,请移步 项目 README 文档。

当然可以和 @autozimuLanguageClient-neovim 配合使用

33225 次点击
所在节点    Vim
107 条回复
pony279
2017-03-08 15:27:54 +08:00
@river1007 不喜欢用 qq 讨论,容易灌水, github 本身也可以用来讨论
kenzi
2017-03-10 20:40:10 +08:00
关注点不同。。。。字体用的啥? timinus?
pony279
2017-03-10 21:21:51 +08:00
ttystudio 生成 gif 的时候重新渲染的默认字体,不是我使用的字体
pony279
2017-03-10 21:22:58 +08:00
@kenzi

ttystudio 生成 gif 的时候重新渲染的默认字体,不是我使用的字体
river1007
2017-03-11 10:51:24 +08:00
@pony279 在自动补全的时候,大概率报这种错误,知道怎么解决不?:-)

error caught while executing async callback:
NvimError(b'Vim(sign):E474: Invalid argument',)
Traceback (most recent call last):
File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/LanguageClient.py", line 799, in addHighlightAndSign
self.signid, startline + 1, signname, buf.number))
File "/usr/local/lib/python3.4/site-packages/neovim/api/nvim.py", line 218, in command
return self.request('nvim_command', string, **kwargs)
File "/usr/local/lib/python3.4/site-packages/neovim/api/nvim.py", line 131, in request
res = self._session.request(name, *args, **kwargs)
File "/usr/local/lib/python3.4/site-packages/neovim/msgpack_rpc/session.py", line 98, in request
raise self.error_wrapper(err)
neovim.api.nvim.NvimError: b'Vim(sign):E474: Invalid argument'

the call was requested at
File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/RPC.py", line 91, in serve
self.handle(msg)
File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/RPC.py", line 122, in handle
self.onNotification(message)
File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/LanguageClient.py", line 928, in handleRequestOrNotification
getattr(self, method)(message['params'])
File "/Users/test/.config/nvim/plugged/LanguageClient-neovim/rplugin/python3/LanguageClient/LanguageClient.py", line 769, in textDocument_publishDiagnostics
self.nvim.async_call(self.addHighlightAndSign, params)
pony279
2017-03-11 11:39:14 +08:00
@river1007 addHighlightAndSign 感觉跟 LanguageClient 的关系比较大,能把复现的方法整理一下发到 github 吗? https://github.com/autozimu/LanguageClient-neovim/issues
jsfaint
2017-03-14 14:51:23 +08:00
看 github 上 ncm 的 clang 支持是 @pony279 fork 了一个版本,这个其实 ok
可是为啥是 python2 ……
目前 ncm 的 source 比起 deoplete 有点少
pony279
2017-03-14 15:16:15 +08:00
@jsfaint
clang 官方库里面把 python3 支持去掉了,我还不清楚是什么原因

据 clang_complete 的维护者说,旧版本的 clang 库 python3 还是可以用的

我还没测试过 python3 ,要求 python2 也是保守起见。
pony279
2017-03-14 15:16:40 +08:00
jsfaint
2017-03-14 15:33:16 +08:00
@pony279 #68 clang_complete 原版有支持 python3
archlinux 默认是 python3 ,然后我 windows , mac 装的都是 python3
如果只能 python2 就有点蛋疼了……
pony279
2017-03-14 15:36:25 +08:00
NCM 是直接使用 python2 命令,一般视不会和 python3 冲突的。
pony279
2017-03-14 15:42:39 +08:00
@jsfaint

let g:cm_sources_override = {
\ 'clang_complete': {'channel': {'module': 'cm_sources.clang_complete', 'type': 'python3'}}
\ }

把这个加到 vimrc 里面,可以强制 python3
jsfaint
2017-03-14 15:47:35 +08:00
@pony279 另外 ncm 该怎么配才能达到 deoplete 按 enter 的效果?
就是在没有选中时,按 enter 选中第一项,并关闭补全菜单
在有选中时直接关闭补全菜单?
谢谢~~
pony279
2017-03-14 16:07:31 +08:00
@jsfaint

这个比较麻烦, 跟 completeopt 的 noselect 选项有关,现在是被 NCM 写死的,暂时不支持改动

此外 NCM 和 deoplete 的实现机制也有些区别,在 NCM 里面直接改 completeopt 还不行,关了 menu 以后可能会重新弹出来

所以,暂时不支持这种配置。

推荐配置是这个
inoremap <expr> <CR> (pumvisible() ? "\<c-y>\<cr>" : "\<CR>")

enter 直接关闭 popup 并换行。
jsfaint
2017-03-14 16:10:54 +08:00
@pony279 #74 其实我有看到你 github 里面的这个配置……但是我就特不习惯换行的这个动作……
我写成
```
inoremap <expr> <CR> (pumvisible() ? "\<c-n>\<c-y>" : "\<CR>")
```
第一个需求倒是满足了,可是如果有选中时候就傻逼了 orz
pony279
2017-03-14 16:25:17 +08:00
@jsfaint

empty(v:completed_item) 可以用来检测有 popupmenu 的情况下是否有选中 item

不过解决不了关闭 popup menu 以后继续弹出的问题。
jsfaint
2017-03-14 16:32:05 +08:00
@pony279 #76 哈哈~我也刚搞定这个

inoremap <expr> <CR> (pumvisible() ? (empty(v:completed_item) ? "\<C-n>\<C-y>" : "\<C-y>") : "\<CR>")

popup menu 没关系啦~这个可以接受
jsfaint
2017-03-14 16:59:42 +08:00
@pony279 #76
Linux 下工作一切正常, windows(vim/neovim)下只有 python 的补全正常,其他的补全( c, js, go )不知道什么原因都没工作


换回 neocomplete ( vim )和 deoplete ( neovim )都可以正常工作
pony279
2017-03-14 20:14:11 +08:00
@jsfaint

用这种方式打日志复现下试试


```
NVIM_PYTHON_LOG_FILE=nvim.log NVIM_NCM_LOG_LEVEL=DEBUG vim test.js
```

windows 的话是
set NVIM_PYTHON_LOG_FILE=nvim.log
set NVIM_NCM_LOG_LEVEL=DEBUG
nvim test.js

然后看下相关的日志文件, js 的话是 nvim.log_xxx_cm_tern
还有 nvim.log_cm_core
jsfaint
2017-03-15 09:42:32 +08:00
@pony279 #79 按照这个方法打开了日志
打开 index.js
出现了一堆 log ,但是没有 nvim.log_xxx.cm_tern


cm_core 中有如下内容。看起来是 cm_tern 注册失败了

```
2017-03-15 09:18:43,110 [ERROR @ cm_core.py:__init__:115] 10164 - register_source for cm_sources.cm_tern failed
Traceback (most recent call last):
File "C:\Users\jia.sui\vimfiles\plugged\nvim-completion-manager\pythonx\cm_core.py", line 110, in __init__
m = importlib.import_module(modulename)
File "C:\Users\jia.sui\AppData\Local\Programs\Python\Python35\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 673, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "C:\Users\jia.sui\vimfiles\plugged\nvim-cm-tern\pythonx\cm_sources\cm_tern.py", line 6, in <module>
```

打开 main.go ,有 cm_gocode 生成,但是在执行 cm_refresh 时候报错了

```
2017-03-15 09:18:44,009 [ERROR @ cm_start.py:on_notification:168] 5028 - Failed processing method: cm_refresh, args: [{'early_cache': 1, 'enable': 1, 'priority': 9, 'sort': 1, 'scopes': ['go'], 'channel': {'events': [], 'type': 'python3', 'id': 6, 'module': 'cm_sources.cm_gocode'}, 'scoping': 1, 'cm_refresh_patterns': ['\\.(\\w*)$'], 'abbreviation': 'Go', 'cm_refresh_min_word_len': 3, 'name': 'cm-gocode'}, {'scope_match': 'go', 'base': 'f', 'changedtick': 8, 'curpos': [0, 8, 6, 0, 6], 'bufnr': 1, 'col': 6, 'lnum': 8, 'startcol': 5, 'early_cache': 1, 'typed': ' f', 'scope': 'go', 'filetype': 'go', 'force': 0, 'filepath': 'D:\\Downloads\\js_test\\main.go'}]
Traceback (most recent call last):
File "C:\Users\jia.sui\vimfiles\plugged\nvim-completion-manager\pythonx\cm_start.py", line 165, in on_notification
func(*args)
File "C:\Users\jia.sui\vimfiles\plugged\nvim-completion-manager\pythonx\cm_sources\cm_gocode.py", line 56, in cm_refresh
stderr=subprocess.DEVNULL)
File "C:\Users\jia.sui\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 676, in __init__
restore_signals, start_new_session)
File "C:\Users\jia.sui\AppData\Local\Programs\Python\Python35\lib\subprocess.py", line 955, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/344868

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX