Giter VIP home page Giter VIP logo

nvim-completion-manager's Introduction

⚠️ THIS REPO IS DEPRECATED. USE NCM2 INSTEAD.


❤️ for my favorite editor

A Completion Framework for Neovim

This is a fast, extensible, async completion framework for neovim. For more information about plugin implementation, please read the Why section.

Future updates, announcements, screenshots will be posted here. Subscribe it if you are interested.

All in one screenshot

Table of Contents

Features

  1. Asynchronous completion support like deoplete.
  2. Faster, all completions should run in parallel.
  3. Smarter on files with different languages, for example, css/javascript completion in html style/script tag.
  4. Extensible async vimscript API and python3 API.
  5. Function parameter expansion via Ultisnips, neosnippet.vim or vim-snipmate.

Scoping Sources:

  • Language specific completion for markdown, reStructuredText
  • Javascript code completion in html script tag
  • Css code completion in html style tag

Completion Sources

Language / Description Repository
Word from current buffer builtin
Word from tmux session builtin
ctags completion builtin
Filepath completion builtin
Python builtin, requires jedi
Css builtin, requires csscomplete#CompleteCSS
Golang builtin, requires gocode
Ultisnips hint builtin, requires Ultisnips
Snipmate hint builtin, requires vim-snipmate
neosnippet hint builtin, requires neosnippet.vim
Language Server Protocol autozimu/LanguageClient-neovim
C/C++ clang_complete [DEPRECATED]
C/C++ ncm-clang
Javascript nvim-cm-tern
Javascript nvim-cm-flow
elm ncm-elm-oracle
Clojure clojure-async-clj-omni
Rust nvim-cm-racer
Vimscript Shougo/neco-vim
Ruby ncm-rct-complete
PHP LanguageServer-php-neovim
PHP ncm-phpactor
Swift dafufer/nvim-cm-swift-completer
gtags completion jsfaint/gen_tags.vim
syntax completion Shougo/neco-syntax
include completion Shougo/neoinclude
github completion ncm-github
mutt mails #97 mutt-aliases.vim
deoplete #50 deoplete
css calebeby/ncm-css
lbdb (addressbook) katsika/ncm-lbdb
Java sassanh/nvim-cm-eclim
TypeScript mhartington/nvim-typescript
Word from other buffers fgrsnau/ncm-otherbuf
R gaalcaras/ncm-R

How to extend this framework?

Please announce your new plugin here after you've created the extension.

Requirements

Installation

" the framework
Plug 'roxma/nvim-completion-manager'
  • If you are vim8 user, you'll need vim-hug-neovim-rpc. The vim8 support layer is still experimental, please 'upgrade' to neovim if it's possible.
" Requires vim8 with has('python') or has('python3')
" Requires the installation of msgpack-python. (pip install msgpack-python)
if !has('nvim')
    Plug 'roxma/vim-hug-neovim-rpc'
endif
  • Install pip modules for your neovim python3:
# neovim is the required pip module
# jedi for python completion
# psutil (optional)
# setproctitle (optional)
pip3 install --user neovim jedi psutil setproctitle

(Optional) It's easier to use python-support.nvim to help manage your pip modules for neovim:

Optional Configuration Tips

  • Supress the annoying completion messages:
" don't give |ins-completion-menu| messages.  For example,
" '-- XXX completion (YYY)', 'match 1 of 2', 'The only match',
set shortmess+=c
  • When the <Enter> key is pressed while the popup menu is visible, it only hides the menu. Use this mapping to hide the menu and also start a new line.
inoremap <expr> <CR> (pumvisible() ? "\<c-y>\<cr>" : "\<CR>")
  • Here is an example for expanding snippet in the popup menu with <Enter> key. Suppose you use the <C-U> key for expanding snippet.
imap <expr> <CR>  (pumvisible() ?  "\<c-y>\<Plug>(expand_or_nl)" : "\<CR>")
imap <expr> <Plug>(expand_or_nl) (cm#completed_is_snippet() ? "\<C-U>":"\<CR>")
  • When using CTRL-C key to leave insert mode, it does not trigger the autocmd InsertLeave. You should use CTRL-[, or map the <c-c> to <ESC>.
inoremap <c-c> <ESC>
  • Use <TAB> to select the popup menu:
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
  • If 'omnifunc' is the only available option, you may register it as a source for NCM.
" css completion via `csscomplete#CompleteCSS`
" The `'cm_refresh_patterns'` is PCRE.
" Be careful with `'scoping': 1` here, not all sources, especially omnifunc,
" can handle this feature properly.
au User CmSetup call cm#register_source({'name' : 'cm-css',
        \ 'priority': 9, 
        \ 'scoping': 1,
        \ 'scopes': ['css','scss'],
        \ 'abbreviation': 'css',
        \ 'word_pattern': '[\w\-]+',
        \ 'cm_refresh_patterns':['[\w\-]+\s*:\s+'],
        \ 'cm_refresh': {'omnifunc': 'csscomplete#CompleteCSS'},
        \ })

Warning: omnifunc is implemented in a synchronouse style, and vim-vimscript is single threaded, it would potentially block the ui with the introduction of a heavy weight omnifunc, for example the builtin phpcomplete. If you get some time, please try implementing a source for NCM as a replacement for the old style omnifunc.

  • There's no guarantee that this plugin will be compatible with other completion plugin in the same buffer. Use let g:cm_smart_enable=0 and call cm#enable_for_buffer() to use this plugin for specific buffer.

  • This example shows how to disable NCM's builtin tag completion. It's also possible to use g:cm_sources_override to override other default options of a completion source.

let g:cm_sources_override = {
    \ 'cm-tags': {'enable':0}
    \ }

Why?

This project was started just for fun, and it's working pleasingly for me now. However, it seems there's lots of differences between deoplete, YCM, and nvim-completion-manager, by implementation.

I haven't read the source of YCM yet. So here I'm describing the basic implementation of NCM (short for nvim-completion-manager) and some of the differences between deoplete and this plugin.

Async architecture

Each completion source should be a thread or a standalone process, the manager notifies the completion source for any text changing, even when popup menu is visible. The completion source notifies the manager if there's any complete matches available. After some basic priority sorting between completion sources, and some simple filtering, the completion popup menu will be triggered with the complete() function by the completion manager.

If some of the completion source is calculating matches for a long long time, the popup menu will still be shown quickly if other completion sources work properly. And if the user hasn't changed anything, the popup menu will be updated after the slow completion source finishes the work.

As the time as of this plugin being created, the completion sources of deoplete are gathered with gather_candidates() of the Source object, inside a for loop, in deoplete's process. A slow completion source may defer the display of popup menu. Of course it will not block the ui.

The good news is that deoplete has supported async gather_candidates now. But still, NCM is potentially faster because all completion sources run in parallel.

Scoping

I write markdown files with code blocks quite often, so I've also implemented language specific completion for markdown file. This is a framework feature, which is called scoping. It should work for any markdown code block whose language completion source is avaible to NCM. I've also added support for javascript completion in script tag of html files, and css completion in style tag.

The idea was originated in vim-syntax-compl-pop. Since it's pure vimscript implementation, and there are some limitations currently with neovim's syntax api. It's very likely that vim-syntax-compl-pop doesn't work, for example, javascript completion in markdown or html script tag. So I use custom parser in NCM to implement the scoping features.

Experimental hacking

Note that there's some hacking done in NCM. It uses a per 30ms timer to detect changes even popup menu is visible, as well as using the TextChangedI event, which only triggers when no popup menu is visible. This is important for implementing the async architecture. I'm hoping one day neovim will offer better option rather than a timer or the limited TextChangedI.

FAQ

Why Python?

YouCompleteMe has good explanation.

Trouble-shooting

Moved to wiki

Related Projects

asyncomplete.vim

nvim-completion-manager's People

Contributors

aspurdy avatar davidosomething avatar et avatar filipekiss avatar hibachrach avatar jsfaint avatar katsel avatar ldong avatar pioupioum avatar prabirshrestha avatar roxma avatar sassanh avatar severeoverfl0w avatar thalesmello avatar tmcw avatar vietjtnguyen avatar yunhao94 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nvim-completion-manager's Issues

support vim8 without python

I have been working on the vim plugin for language server protocol written in pure vimscript that works on vim8 and neovim and linux, mac and windows. I have been searching for autocompletion plugin to work with. This plugin would be interesting for me.

Do you have any plans on supporting vim8. And better if it could be done without python similar like CtrlP primarily because setting up python on windows is a bit of pain :(

Some related issues related to the async autocompletion via language server protocol in vim Shougo/deoplete.nvim#407 tjdevries/nvim-langserver-shim#11

NCM slows nvim start

NCM is awesome!

After switched from deoplete to NCM, I found nvim starts slowly. Test with same config with --startuptime:

nvim: 0.1.7
NCM: 577.721 total, 432.098: first screen update
deoplete: 194.350 totle, 022.819: first screen update

How this difference is caused?

<Plug>(cm_force_refresh) not working properly on Vim8 on Windows

I'm using NCM on Windows with Vim8. I disabled automatic completions with let g:cm_auto_popup = 0 and I use <Plug>(cm_force_refresh) to initiate completions manually. However, completions don't appear when I use <Plug>(cm_force_refresh) first time, I have to press it two times for completions to appear.

css completion in html stop working

2017-02-26 19 54 31

Minified vimrc:

Plug 'othree/csscomplete.vim'
Plug 'roxma/nvim-completion-manager', {'do': 'npm install'}
Plug 'roxma/nvim-cm-php-language-server',  {'do': 'composer install && composer run-script parse-stubs'}
Plug 'roxma/nvim-cm-tern',  {'do': 'npm install'}
Plug 'ternjs/tern_for_vim'


" NCM {{{
" ----------------------------------------------------------------------------
set shortmess+=c
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
let g:UltiSnipsExpandTrigger = "<Plug>(ultisnips_expand)"
" css
" the omnifunc pattern is PCRE
let g:cm_matcher = {'module': 'cm_matchers.fuzzy_matcher', 'case': 'smartcase'}
au User CmSetup call cm#register_source({'name' : 'cm-css',
        \ 'priority': 9, 
        \ 'scopes': ['css', 'scss'],
        \ 'abbreviation': 'css',
        \ 'cm_refresh_patterns':['\w{2,}$',':\s+\w*$'],
        \ 'cm_refresh': {'omnifunc': 'csscomplete#CompleteCSS'},
        \ })
let g:cm_sources_override = {
    \ 'cm-tags': {'enable':0}
    \ }

inoremap <silent> <c-o> <c-r>=cm#sources#ultisnips#trigger_or_popup("\<Plug>(ultisnips_expand)")<cr>
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "\<S-Tab>"
" }}}

Check Health

health#jedi#check
========================================================================
## jedi
#### Jedi-vim debug information
Using Python version: 2
 - sys.version: 2.7.10 (default, Jul 30 2016, 19:40:32), [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)]
 - site module: /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.pyc
Jedi path: /Users/wangsong/dotfiles/nvim/bundle/jedi-vim/jedi/jedi/__init__.pyc
 - version: 0.10.0
 - sys_path:
    - /Users/wangsong/dotfiles/nvim/bundle/jedi-vim
    - /Library/Python/2.7/site-packages/virtualenv-15.1.0-py2.7.egg
    - /Library/Python/2.7/site-packages/pyproj-1.9.5.1-py2.7-macosx-10.12-intel.egg
    - /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip
    - /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
    - /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
    - /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
    - /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
    - /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
    - /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old
    - /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload
    - /Users/wangsong/Library/Python/2.7/lib/python/site-packages
    - /Library/Python/2.7/site-packages
    - /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
    - /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC
    - _vim_path_
    - /Users/wangsong/dotfiles/.vim/bundle/vim-virtualenv/autoload
    - /Users/wangsong/dotfiles/nvim/bundle/MatchTagAlways/autoload/../python
jedi-vim git version: 0.8.0-73-g682f377
jedi git submodule status:  70200861661a921016563717487c1ced9993acdb jedi (v0.10.0)


##### Settings

g:force_py_version = '2' (default: 'auto')


  omnifunc=emmet#completeTag
	Last set from ~/dotfiles/nvim/init.vim
  completeopt=menu,menuone,noinsert,noselect
	Last set from ~/.local/share/nvim/plugged/nvim-completion-manager/autoload/cm.vim


health#nvim#check
========================================================================
## Configuration
  - SUCCESS: no issues found

## Performance
  - SUCCESS: Build type: RelWithDebInfo

## Remote Plugins
  - SUCCESS: Up to date

## terminfo
  - ERROR: key_backspace (kbs) entry is ^H (ASCII DELETE): key_backspace=^H,
    - SUGGESTIONS:
      - Set key_backspace to \177 (ASCII BACKSPACE). Run these commands:
          infocmp $TERM | sed 's/kbs=^[hH]/kbs=\\177/' > $TERM.ti
          tic $TERM.ti
      - See https://github.com/neovim/neovim/wiki/FAQ

## tmux
  - SUCCESS: escape-time: [warn]kq_init:detectedbrokenkqueue;notusing.:Undefinederror:00ms
  - INFO: $TERM: screen-256color

health#provider#check
========================================================================
## Clipboard
  - SUCCESS: Clipboard tool found: pbcopy

## Python 2 provider
  - INFO: Using: g:python_host_prog = "/usr/bin/python"
  - INFO: Executable: /usr/bin/python
  - INFO: Python2 version: 2.7.10
  - INFO: python-neovim version: 0.1.13
  - SUCCESS: Latest python-neovim is installed: 0.1.13

## Python 3 provider
  - INFO: Using: g:python3_host_prog = "/usr/local/bin/python3"
  - INFO: Executable: /usr/local/bin/python3
  - INFO: Python3 version: 3.5.2
  - INFO: python3-neovim version: 0.1.13
  - SUCCESS: Latest python3-neovim is installed: 0.1.13

## Ruby provider
  - SUCCESS: Found up-to-date neovim RubyGem
  - INFO: Ruby Version: ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
  - INFO: Host Executable: /usr/local/bin/neovim-ruby-host
  - INFO: Host Version: 0.3.1

vim8 fails to work

nvim.log_py3_cm_core:

2017-03-12 21:24:10,739 [INFO @ cm_start.py:start_channel:54] 66464 - start_channel for cm_core
2017-03-12 21:24:10,739 [INFO @ cm_start.py:setup_neovim:103] 66464 - connecting to neovim server: 127.0.0.1:52413
2017-03-12 21:24:10,758 [INFO @ session.py:request:97] 66464 - 'Received error: [1, b'vim_eval not implemented']
2017-03-12 21:24:10,758 [ERROR @ cm_start.py:start_channel:95] 66464 - Exception when running cm_core: b'vim_eval not implemented'
Traceback (most recent call last):
  File "/Users/xlc/.vim/plugged/nvim-completion-manager/pythonx/cm_start.py", line 66, in start_channel
    nvim = setup_neovim(serveraddr)
  File "/Users/xlc/.vim/plugged/nvim-completion-manager/pythonx/cm_start.py", line 113, in setup_neovim
    pythonxs = nvim.eval('globpath(&rtp,"pythonx",1)')
  File "/Users/xlc/anaconda3/lib/python3.5/site-packages/neovim/api/nvim.py", line 224, in eval
    return self.request('vim_eval', string, **kwargs)
  File "/Users/xlc/anaconda3/lib/python3.5/site-packages/neovim/api/nvim.py", line 129, in request
    res = self._session.request(name, *args, **kwargs)
  File "/Users/xlc/anaconda3/lib/python3.5/site-packages/neovim/msgpack_rpc/session.py", line 98, in request
    raise self.error_wrapper(err)
neovim.api.nvim.NvimError: b'vim_eval not implemented'

nvim.log_py3_neovim_rpc_server:

2017-03-12 21:24:10,540 [INFO @ neovim_rpc_server.py:handle:86] 66462 - === socket opened ===
2017-03-12 21:24:10,541 [INFO @ neovim_rpc_server.py:handle:100] 66462 - received: b'[1,"neovim_rpc_setup"]\n'
2017-03-12 21:24:10,541 [INFO @ neovim_rpc_server.py:handle:115] 66462 - sending ["ex", "scall neovim_rpc#_callback()"]
2017-03-12 21:24:10,741 [INFO @ neovim_rpc_server.py:handle:141] 66462 - === socket opened for client ===
2017-03-12 21:24:10,741 [INFO @ neovim_rpc_server.py:handle:152] 66462 - unpacked: [0, 1, b'vim_get_api_info', []]
2017-03-12 21:24:10,741 [INFO @ neovim_rpc_server.py:notify:71] 66462 - sending notification: ["ex", "call neovim_rpc#_callback()"]
2017-03-12 21:24:10,742 [INFO @ neovim_rpc_server.py:process_pending_requests:247] 66462 - process_pending_requests
2017-03-12 21:24:10,742 [INFO @ neovim_rpc_server.py:process_pending_requests:259] 66462 - get msg from channel [1]: [0, 1, 'vim_get_api_info', []]
2017-03-12 21:24:10,742 [INFO @ neovim_rpc_server.py:process_pending_requests:293] 66462 - sending result: [1, 1, None, [1, {'error_types': {'Validation': {'id': 1}, 'Exception': {'id': 0}}, 'functions': [{'return_type': 'Integer', 'method': True, 'since': 1, 'name': 'nvim_buf_line_count', 'parameters': [['Buffer', 'buffer']]}, {'method': False, 'name': 'buffer_get_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index']], 'return_type': 'String', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'buffer_set_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index'], ['String', 'line']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'buffer_del_line', 'parameters': [['Buffer', 'buffer'], ['Integer', 'index']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'buffer_get_line_slice', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'include_start'], ['Boolean', 'include_end']], 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'since': 0}, {'return_type': 'ArrayOf(String)', 'method': True, 'since': 1, 'name': 'nvim_buf_get_lines', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing']]}, {'method': False, 'name': 'buffer_set_line_slice', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'include_start'], ['Boolean', 'include_end'], ['ArrayOf(String)', 'replacement']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_buf_set_lines', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing'], ['ArrayOf(String)', 'replacement']]}, {'return_type': 'Object', 'method': True, 'since': 1, 'name': 'nvim_buf_get_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_buf_set_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_buf_del_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name']]}, {'method': False, 'name': 'buffer_set_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'buffer_del_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'return_type': 'Object', 'method': True, 'since': 1, 'name': 'nvim_buf_get_option', 'parameters': [['Buffer', 'buffer'], ['String', 'name']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_buf_set_option', 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']]}, {'return_type': 'Integer', 'method': True, 'since': 1, 'name': 'nvim_buf_get_number', 'parameters': [['Buffer', 'buffer']]}, {'return_type': 'String', 'method': True, 'since': 1, 'name': 'nvim_buf_get_name', 'parameters': [['Buffer', 'buffer']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_buf_set_name', 'parameters': [['Buffer', 'buffer'], ['String', 'name']]}, {'return_type': 'Boolean', 'method': True, 'since': 1, 'name': 'nvim_buf_is_valid', 'parameters': [['Buffer', 'buffer']]}, {'method': False, 'name': 'buffer_insert', 'parameters': [['Buffer', 'buffer'], ['Integer', 'lnum'], ['ArrayOf(String)', 'lines']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'return_type': 'ArrayOf(Integer, 2)', 'method': True, 'since': 1, 'name': 'nvim_buf_get_mark', 'parameters': [['Buffer', 'buffer'], ['String', 'name']]}, {'return_type': 'Integer', 'method': True, 'since': 1, 'name': 'nvim_buf_add_highlight', 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['String', 'hl_group'], ['Integer', 'line'], ['Integer', 'col_start'], ['Integer', 'col_end']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_buf_clear_highlight', 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['Integer', 'line_start'], ['Integer', 'line_end']]}, {'return_type': 'ArrayOf(Window)', 'method': True, 'since': 1, 'name': 'nvim_tabpage_list_wins', 'parameters': [['Tabpage', 'tabpage']]}, {'return_type': 'Object', 'method': True, 'since': 1, 'name': 'nvim_tabpage_get_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_tabpage_set_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name'], ['Object', 'value']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_tabpage_del_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']]}, {'method': False, 'name': 'tabpage_set_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name'], ['Object', 'value']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'tabpage_del_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'return_type': 'Window', 'method': True, 'since': 1, 'name': 'nvim_tabpage_get_win', 'parameters': [['Tabpage', 'tabpage']]}, {'return_type': 'Integer', 'method': True, 'since': 1, 'name': 'nvim_tabpage_get_number', 'parameters': [['Tabpage', 'tabpage']]}, {'return_type': 'Boolean', 'method': True, 'since': 1, 'name': 'nvim_tabpage_is_valid', 'parameters': [['Tabpage', 'tabpage']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_ui_attach', 'parameters': [['Integer', 'width'], ['Integer', 'height'], ['Dictionary', 'options']]}, {'method': False, 'name': 'ui_attach', 'parameters': [['Integer', 'width'], ['Integer', 'height'], ['Boolean', 'enable_rgb']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_ui_detach', 'parameters': []}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_ui_try_resize', 'parameters': [['Integer', 'width'], ['Integer', 'height']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_ui_set_option', 'parameters': [['String', 'name'], ['Object', 'value']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_command', 'parameters': [['String', 'command']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_feedkeys', 'parameters': [['String', 'keys'], ['String', 'mode'], ['Boolean', 'escape_csi']]}, {'return_type': 'Integer', 'method': False, 'since': 1, 'name': 'nvim_input', 'parameters': [['String', 'keys']]}, {'return_type': 'String', 'method': False, 'since': 1, 'name': 'nvim_replace_termcodes', 'parameters': [['String', 'str'], ['Boolean', 'from_part'], ['Boolean', 'do_lt'], ['Boolean', 'special']]}, {'return_type': 'String', 'method': False, 'since': 1, 'name': 'nvim_command_output', 'parameters': [['String', 'str']]}, {'return_type': 'Object', 'method': False, 'since': 1, 'name': 'nvim_eval', 'parameters': [['String', 'expr']]}, {'return_type': 'Object', 'method': False, 'since': 1, 'name': 'nvim_call_function', 'parameters': [['String', 'fname'], ['Array', 'args']]}, {'return_type': 'Integer', 'method': False, 'since': 1, 'name': 'nvim_strwidth', 'parameters': [['String', 'str']]}, {'return_type': 'ArrayOf(String)', 'method': False, 'since': 1, 'name': 'nvim_list_runtime_paths', 'parameters': []}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_set_current_dir', 'parameters': [['String', 'dir']]}, {'return_type': 'String', 'method': False, 'since': 1, 'name': 'nvim_get_current_line', 'parameters': []}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_set_current_line', 'parameters': [['String', 'line']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_del_current_line', 'parameters': []}, {'return_type': 'Object', 'method': False, 'since': 1, 'name': 'nvim_get_var', 'parameters': [['String', 'name']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_set_var', 'parameters': [['String', 'name'], ['Object', 'value']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_del_var', 'parameters': [['String', 'name']]}, {'method': False, 'name': 'vim_set_var', 'parameters': [['String', 'name'], ['Object', 'value']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_del_var', 'parameters': [['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'return_type': 'Object', 'method': False, 'since': 1, 'name': 'nvim_get_vvar', 'parameters': [['String', 'name']]}, {'return_type': 'Object', 'method': False, 'since': 1, 'name': 'nvim_get_option', 'parameters': [['String', 'name']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_set_option', 'parameters': [['String', 'name'], ['Object', 'value']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_out_write', 'parameters': [['String', 'str']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_err_write', 'parameters': [['String', 'str']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_err_writeln', 'parameters': [['String', 'str']]}, {'return_type': 'ArrayOf(Buffer)', 'method': False, 'since': 1, 'name': 'nvim_list_bufs', 'parameters': []}, {'return_type': 'Buffer', 'method': False, 'since': 1, 'name': 'nvim_get_current_buf', 'parameters': []}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_set_current_buf', 'parameters': [['Buffer', 'buffer']]}, {'return_type': 'ArrayOf(Window)', 'method': False, 'since': 1, 'name': 'nvim_list_wins', 'parameters': []}, {'return_type': 'Window', 'method': False, 'since': 1, 'name': 'nvim_get_current_win', 'parameters': []}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_set_current_win', 'parameters': [['Window', 'window']]}, {'return_type': 'ArrayOf(Tabpage)', 'method': False, 'since': 1, 'name': 'nvim_list_tabpages', 'parameters': []}, {'return_type': 'Tabpage', 'method': False, 'since': 1, 'name': 'nvim_get_current_tabpage', 'parameters': []}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_set_current_tabpage', 'parameters': [['Tabpage', 'tabpage']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_subscribe', 'parameters': [['String', 'event']]}, {'return_type': 'void', 'method': False, 'since': 1, 'name': 'nvim_unsubscribe', 'parameters': [['String', 'event']]}, {'return_type': 'Integer', 'method': False, 'since': 1, 'name': 'nvim_get_color_by_name', 'parameters': [['String', 'name']]}, {'return_type': 'Dictionary', 'method': False, 'since': 1, 'name': 'nvim_get_color_map', 'parameters': []}, {'return_type': 'Array', 'method': False, 'since': 1, 'name': 'nvim_get_api_info', 'parameters': []}, {'return_type': 'Array', 'method': False, 'since': 1, 'name': 'nvim_call_atomic', 'parameters': [['Array', 'calls']]}, {'return_type': 'Buffer', 'method': True, 'since': 1, 'name': 'nvim_win_get_buf', 'parameters': [['Window', 'window']]}, {'return_type': 'ArrayOf(Integer, 2)', 'method': True, 'since': 1, 'name': 'nvim_win_get_cursor', 'parameters': [['Window', 'window']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_win_set_cursor', 'parameters': [['Window', 'window'], ['ArrayOf(Integer, 2)', 'pos']]}, {'return_type': 'Integer', 'method': True, 'since': 1, 'name': 'nvim_win_get_height', 'parameters': [['Window', 'window']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_win_set_height', 'parameters': [['Window', 'window'], ['Integer', 'height']]}, {'return_type': 'Integer', 'method': True, 'since': 1, 'name': 'nvim_win_get_width', 'parameters': [['Window', 'window']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_win_set_width', 'parameters': [['Window', 'window'], ['Integer', 'width']]}, {'return_type': 'Object', 'method': True, 'since': 1, 'name': 'nvim_win_get_var', 'parameters': [['Window', 'window'], ['String', 'name']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_win_set_var', 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_win_del_var', 'parameters': [['Window', 'window'], ['String', 'name']]}, {'method': False, 'name': 'window_set_var', 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'window_del_var', 'parameters': [['Window', 'window'], ['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'return_type': 'Object', 'method': True, 'since': 1, 'name': 'nvim_win_get_option', 'parameters': [['Window', 'window'], ['String', 'name']]}, {'return_type': 'void', 'method': True, 'since': 1, 'name': 'nvim_win_set_option', 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']]}, {'return_type': 'ArrayOf(Integer, 2)', 'method': True, 'since': 1, 'name': 'nvim_win_get_position', 'parameters': [['Window', 'window']]}, {'return_type': 'Tabpage', 'method': True, 'since': 1, 'name': 'nvim_win_get_tabpage', 'parameters': [['Window', 'window']]}, {'return_type': 'Integer', 'method': True, 'since': 1, 'name': 'nvim_win_get_number', 'parameters': [['Window', 'window']]}, {'return_type': 'Boolean', 'method': True, 'since': 1, 'name': 'nvim_win_is_valid', 'parameters': [['Window', 'window']]}, {'method': True, 'name': 'buffer_line_count', 'parameters': [['Buffer', 'buffer']], 'return_type': 'Integer', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_get_lines', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing']], 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_set_lines', 'parameters': [['Buffer', 'buffer'], ['Integer', 'start'], ['Integer', 'end'], ['Boolean', 'strict_indexing'], ['ArrayOf(String)', 'replacement']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_get_var', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_get_option', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_set_option', 'parameters': [['Buffer', 'buffer'], ['String', 'name'], ['Object', 'value']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_get_number', 'parameters': [['Buffer', 'buffer']], 'return_type': 'Integer', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_get_name', 'parameters': [['Buffer', 'buffer']], 'return_type': 'String', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_set_name', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_is_valid', 'parameters': [['Buffer', 'buffer']], 'return_type': 'Boolean', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_get_mark', 'parameters': [['Buffer', 'buffer'], ['String', 'name']], 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_add_highlight', 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['String', 'hl_group'], ['Integer', 'line'], ['Integer', 'col_start'], ['Integer', 'col_end']], 'return_type': 'Integer', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'buffer_clear_highlight', 'parameters': [['Buffer', 'buffer'], ['Integer', 'src_id'], ['Integer', 'line_start'], ['Integer', 'line_end']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'tabpage_get_windows', 'parameters': [['Tabpage', 'tabpage']], 'return_type': 'ArrayOf(Window)', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'tabpage_get_var', 'parameters': [['Tabpage', 'tabpage'], ['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'tabpage_get_window', 'parameters': [['Tabpage', 'tabpage']], 'return_type': 'Window', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'tabpage_is_valid', 'parameters': [['Tabpage', 'tabpage']], 'return_type': 'Boolean', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'ui_detach', 'parameters': [], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'ui_try_resize', 'parameters': [['Integer', 'width'], ['Integer', 'height']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_command', 'parameters': [['String', 'command']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_feedkeys', 'parameters': [['String', 'keys'], ['String', 'mode'], ['Boolean', 'escape_csi']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_input', 'parameters': [['String', 'keys']], 'return_type': 'Integer', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_replace_termcodes', 'parameters': [['String', 'str'], ['Boolean', 'from_part'], ['Boolean', 'do_lt'], ['Boolean', 'special']], 'return_type': 'String', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_command_output', 'parameters': [['String', 'str']], 'return_type': 'String', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_eval', 'parameters': [['String', 'expr']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_call_function', 'parameters': [['String', 'fname'], ['Array', 'args']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_strwidth', 'parameters': [['String', 'str']], 'return_type': 'Integer', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_list_runtime_paths', 'parameters': [], 'return_type': 'ArrayOf(String)', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_change_directory', 'parameters': [['String', 'dir']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_current_line', 'parameters': [], 'return_type': 'String', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_set_current_line', 'parameters': [['String', 'line']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_del_current_line', 'parameters': [], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_var', 'parameters': [['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_vvar', 'parameters': [['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_option', 'parameters': [['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_set_option', 'parameters': [['String', 'name'], ['Object', 'value']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_out_write', 'parameters': [['String', 'str']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_err_write', 'parameters': [['String', 'str']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_report_error', 'parameters': [['String', 'str']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_buffers', 'parameters': [], 'return_type': 'ArrayOf(Buffer)', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_current_buffer', 'parameters': [], 'return_type': 'Buffer', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_set_current_buffer', 'parameters': [['Buffer', 'buffer']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_windows', 'parameters': [], 'return_type': 'ArrayOf(Window)', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_current_window', 'parameters': [], 'return_type': 'Window', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_set_current_window', 'parameters': [['Window', 'window']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_tabpages', 'parameters': [], 'return_type': 'ArrayOf(Tabpage)', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_current_tabpage', 'parameters': [], 'return_type': 'Tabpage', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_set_current_tabpage', 'parameters': [['Tabpage', 'tabpage']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_subscribe', 'parameters': [['String', 'event']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_unsubscribe', 'parameters': [['String', 'event']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_name_to_color', 'parameters': [['String', 'name']], 'return_type': 'Integer', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_color_map', 'parameters': [], 'return_type': 'Dictionary', 'deprecated_since': 1, 'since': 0}, {'method': False, 'name': 'vim_get_api_info', 'parameters': [], 'return_type': 'Array', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_get_buffer', 'parameters': [['Window', 'window']], 'return_type': 'Buffer', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_get_cursor', 'parameters': [['Window', 'window']], 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_set_cursor', 'parameters': [['Window', 'window'], ['ArrayOf(Integer, 2)', 'pos']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_get_height', 'parameters': [['Window', 'window']], 'return_type': 'Integer', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_set_height', 'parameters': [['Window', 'window'], ['Integer', 'height']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_get_width', 'parameters': [['Window', 'window']], 'return_type': 'Integer', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_set_width', 'parameters': [['Window', 'window'], ['Integer', 'width']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_get_var', 'parameters': [['Window', 'window'], ['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_get_option', 'parameters': [['Window', 'window'], ['String', 'name']], 'return_type': 'Object', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_set_option', 'parameters': [['Window', 'window'], ['String', 'name'], ['Object', 'value']], 'return_type': 'void', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_get_position', 'parameters': [['Window', 'window']], 'return_type': 'ArrayOf(Integer, 2)', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_get_tabpage', 'parameters': [['Window', 'window']], 'return_type': 'Tabpage', 'deprecated_since': 1, 'since': 0}, {'method': True, 'name': 'window_is_valid', 'parameters': [['Window', 'window']], 'return_type': 'Boolean', 'deprecated_since': 1, 'since': 0}], 'version': {'api_prerelease': False, 'api_compatible': 0, 'major': 0, 'api_level': 1, 'minor': 1, 'patch': 7}, 'types': {'Window': {'id': 1, 'prefix': 'nvim_win_'}, 'Buffer': {'id': 0, 'prefix': 'nvim_buf_'}, 'Tabpage': {'id': 2, 'prefix': 'nvim_tabpage_'}}}]]
2017-03-12 21:24:10,749 [INFO @ neovim_rpc_server.py:process_pending_requests:296] 66462 - sended
2017-03-12 21:24:10,756 [INFO @ neovim_rpc_server.py:handle:152] 66462 - unpacked: [0, 2, b'vim_eval', [b'globpath(&rtp,"pythonx",1)']]
2017-03-12 21:24:10,756 [INFO @ neovim_rpc_server.py:notify:71] 66462 - sending notification: ["ex", "call neovim_rpc#_callback()"]
2017-03-12 21:24:10,757 [INFO @ neovim_rpc_server.py:process_pending_requests:247] 66462 - process_pending_requests
2017-03-12 21:24:10,757 [INFO @ neovim_rpc_server.py:process_pending_requests:259] 66462 - get msg from channel [1]: [0, 2, 'vim_eval', ['globpath(&rtp,"pythonx",1)']]
2017-03-12 21:24:10,757 [ERROR @ neovim_rpc_server.py:_process_request:325] 66462 - method vim_eval not implemented
2017-03-12 21:24:10,757 [ERROR @ neovim_rpc_server.py:process_pending_requests:287] 66462 - process failed: vim_eval not implemented
Traceback (most recent call last):
  File "/Users/xlc/.vim/plugged/vim-hug-neovim-rpc/pythonx/neovim_rpc_server.py", line 285, in process_pending_requests
    result = _process_request(channel,method,args)
  File "/Users/xlc/.vim/plugged/vim-hug-neovim-rpc/pythonx/neovim_rpc_server.py", line 326, in _process_request
    raise Exception('%s not implemented' % method)
Exception: vim_eval not implemented
2017-03-12 21:24:10,757 [INFO @ neovim_rpc_server.py:process_pending_requests:293] 66462 - sending result: [1, 2, [1, 'vim_eval not implemented'], None]
2017-03-12 21:24:10,757 [INFO @ neovim_rpc_server.py:process_pending_requests:296] 66462 - sended
2017-03-12 21:24:10,765 [INFO @ neovim_rpc_server.py:handle:158] 66462 - channel 1 closed.
2017-03-12 21:24:21,041 [INFO @ neovim_rpc_server.py:stop:333] 66462 - stop begin
2017-03-12 21:24:21,288 [INFO @ neovim_rpc_server.py:handle:98] 66462 - === socket closed ===

Another question: It seems that nvim-completion-manager will result in a delay in exiting from vim, which is normal in neovim. The delay issue disappears when nvim-completion-manager is diabled in vim.

Support for deoplete plugins

There's a lot of deoplete plugins that exist. Would it be possible to add support for those in this library? Or maybe just to have full deoplete as one of the sources.

Channel doesn't exist?

After upgrading to the latest commit, I started getting this error...

Error detected while processing function <SNR>94_check_changes[4]..<SNR>94_on_changed[13]..<SNR>94_notify_core_channel:
line    6:
E475: Invalid argument: Channel doesn't exist

Still use Ultrasnips

So should I remove the existing ultrasnips plug in I have or do I keep it? Does the snippets still come from the snippets files?

<c-x><c-n>-like completion not working in vim

That's just it. Even though nvim-completion-manager does work on vim (with vim-hug-neovim-rpc), the -like completion source doesn't get activated, neither by <Plug>(cm_force_refresh) nor after the third repeated word in a row.

Working in virtualenv

Thanks, I really like NCM. But when I'm working in virtualenv NCM works only if neovim installed in this virtualenv. Deoplete bypasses this problem somehow.

TODO: Auto calculate startcol via cm_refresh_patterns

This is the cm_refresh_pattern of bufkeyword currently:

cm_refresh_patterns=[r'[0-9a-zA-Z_#]{4,}$'],

The framework should be able to calculate startcol using the last matching group of the pattern, if the pattern is changed into this:

cm_refresh_patterns=[r'([0-9a-zA-Z_#]{4,})$'],

Props:

  • Less code
  • move some tricky calculations to the framework so it should work better, #25

Cons:

  • Less readable code?

Trigger popup with less than 3 characters?

I just moved over from deoplete, and so far this library seems like a big improvement!

Just wondering how I can trigger the completion popup with less the 3 characters. I couldn't find any setting for this in the docs.

Screenshots, Updates, Announcement

Inspired by deoplete.

This issue is a good place to upload screenshots for README.md.

Screenshots shoould not be put into git repo, otherwise it will make the plugin download time much much longer .

Additional tips screenshots will also be published in this issued,

Subscribe this issue if you are interested

Unwanted auto-complete issue

The auto-trigger of the complete menu while typing is useful, but when it automatically choose the first match when the thing I want to type is not even in the list, the autocomplete would be quite annoying.

Even when I use backspace, the erasing action will trigger the menu again and what is erased would pop back again.

New line issue

When i wanted to add a newline i have to press enter twice, first is to exit the suggestion window, the next one is to enter a new line, how do i prevent this from happening?

Support goto definition

NCM has integrated with jedi and it works great, but I am wondering if it could also support goto definition.

refine the css omnifunc

First of all, thanks for the great work, best Vim completion I've tried so far. Shout out to "Made in China"

Seconded, can we refined the CSS completion with a ; in the end? You know typically we don't want to type that when making an autocompletion in CSS.

Expecting(from Atom editor):
2017-02-13 02 30 22

Now in Neovim:
2017-02-13 02 31 02

todo: refine multi process architecture

Sources process may be forked from, and should be managed by the manager process

Forking may utilize the copy-on-write feature of *nix system and reduce memory usage.

The mamager process should take care of the killing the subprocess so that neovim could start and exit quickly.

<SNR>#_on_core_channel_exit upon exiting neovim

Hey there @roxma, loving this plug, super fast and works well so far. Just have one minor issue, with this plugin installed and enabled via vim-plug, i get the following output when exiting neovim:

E118: Too many arguments for function: 5
E118: Too many arguments for function: <SNR>76_on_core_channel_exit
E118: Too many arguments for function: 6

Please let me know if there are any steps you'd like me to do for debugging or any additional info you'd need.

I'm on OS X 10.11.6, iterm2 nightly, neovim-HEAD.

Thanks!

[question] JavaScript completion not working?

Hey there @roxma, I decided to open a separate issue/question to avoid muddying up the other issue that you've already fixed (feel free to close it, I've confirmed it working -- thanks!)

I'm having a tough time getting javascript completion working.. I presently have tern_for_vim installed (and working via deoplete), and would love to get it working with n-c-m. When I enter a .js file, and type a prototype, such as Object, it doesn't complete with anything, but the command input message does display: autoload/cm/sources/cm_tern.py exit.

Is there anything else I can do to debug further, or are there specific settings I need setup in my config?

Thanks again!

Issues about file path and c++ header completion and neosnippet

nvim @ Arch

File path completion with nvim-completion-manager is not complete:
image
While use c-x c-f, all files are listed.
image


I install clang_complete for c++ completion and notice it can't complete header. here gives a plugin which is not compatible with. Any suggestion?


By the way, I want to know whether there exists a plan to support neosnippet since I recognize it as more convenient to use when compared with Ultisnips.


Thanks for the nice plugin.

todo: omnifunc support

Synchronized omnifunc is highly discoraged in NCM, but sometimes omnifunc seems to be the only option available, eg, csscomplete#CompleteCSS

Add omnifunc addapter into NCM core to help these cases.

How to disable auto selection in popup?

For example in x.py, when you typed json., NCM will popup available function/class, and auto select json._default_encoder.

What I want is just open popup, is there anyway to disable the auto selection?

Conflicts with Raimondi/delimitMate (neovim 0.1.7)

with plug Raimondi/delimitMate the option delimitMate_expand_cr is invalid.
the reason is the map inoremap <CR> is covered by plug roxma/nvim-completion-manager

i found this in file nvim-completion-manager/autoload/cm.vim on line 61

 inoremap <expr> <buffer> <CR> (pumvisible() ? "\<c-y>\<cr>" : "\<CR>")

how to solve

Ultisnips stopped working in visual mode

I have the following LaTeX snipped:

snippet it "Italics" i
\\textit{${1:${VISUAL}}}${0}
endsnippet

Which allows me to visually select some text I want to italicize, say, the word text, press <tab>, which makes the text text disappear and puts me in insert mode, type it and press <tab> again, which then gives me \textit{text}. Somehow, if I'm using nvim-completion-manager, that stops working.

Completion popup menu not appearing

Hi roxma. I love the plugin, but after an update the popup menu that populates with a list of autocomplete suggestions is not longer showing up for me. I've never reported an issue on github before - so I'll almost certainly be forgetting some details. If you let me know if any other info would be helpful I'd be happy to provide it!

Here's a gif of what's happening:

basically, you can see that the autocompletion of the def snippet works when I hit tab, but it doesn't appear in the popup menu beforehand. I'm also using Supertab, Ultisnips, and your vim8 compatability extension if that helps at all.

Restoring default `CTRL-X CTRL-N` behavior

This is a great plugin you wrote. Thanks for sharing!

Something I use frequently and which this plugin breaks a bit is this:

CTRL-X CTRL-N or
CTRL-X CTRL-P
Further use of CTRL-X CTRL-N or CTRL-X CTRL-P will
copy the words following the previous expansion in
contexts unless a double CTRL-X is used.

With nvim-completion-manager, I have to type CTRL-X CTRL-N CTRL-N to get the same effect. Do you know any workarounds?

Switch to multi-thread implementation for memory efficiency?

NCM chooses multi-process implementation at first for implementation simplicity.

But multi-thread should be more memory efficient.

Since the cpython implementation has GIL, it would still be nice and more efficient to allow standalone process for some sources with heavy calculation in python, eg, jedi library.

Vim8 Support

It seems it's possible to create a compatible python layer for vim8 support. Maybe It will be done in the future.

NCM will stick to python for productivity and performance. Replace #1 with this issue.

TODO: integrate with ultisnips for completions with snippet

For example:

def foobar(param1,param2)
  pass

foobar|

| is the cursor position after foobar is completed by NCM, then press ultisnips expand trigger should expand the completion into

def foobar(param1,param2)
  pass

foobar(|<param1>,<param2>)

I'm not sure whether this is possible but it's worth a try

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.