質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

neocompleteとjedi-vimの併用時に補完を打ち切るようにしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,977
退会済みユーザー

退会済みユーザー

neocompleteとjedi-vimを併用している時に補完を打ち切るようにしたいです。

Vim8.0でneocompleteとjedi-vimを併用しているのですが、pythonでnumpyを補完する際にオムニ補完がかなり重たいです。
そこで、補完時に一定時間内に候補を返すことができなかったら処理を返すという設定にしたいと思いました。
例えば、np.と打ってから1秒間内で候補を返せないとき処理だけ返すようにし、np.arraなどと打って候補が絞られ一定時間内に補完候補を返すことができるときだけ補完をするということをしたいです。
また、補完に時間がかかる際も手動での操作(Ctrl-Spaceなど)は常に効くというふうにできたらベストだと考えています。

私はC++とpythonを勉強しており、C++の補完はモタつくということは今のところありません。
ですのでそこの辺もFiletypeによって自動補完を有効にするのかを変えることができればと思っています。

該当のソースコード

今はこの件について解決策が見つからないので、pythonのときは自動補完をoffにするというふうにしています。

[[plugins]]
repo = 'Shougo/neocomplete.vim'
hook_add = '''
" Disable AutoComplPop.
let g:acp_enableAtStartup = 0

" Use neocomplete.
let g:neocomplete#enable_at_startup = 1

" Use smartcase.
let g:neocomplete#enable_smart_case = 1

" Set minimum syntax keyword length.
let g:neocomplete#sources#syntax#min_keyword_length = 3

"If completion time is higher than it, neocomplete will skip auto completion.
" default = '0.3'
" let g:neocomplete#skip_auto_completion_time = '0.3'

" Define dictionary.
let g:neocomplete#sources#dictionary#dictionaries = {
    \ 'default' : '',
    \ 'vimshell' : $HOME.'/.vimshell_hist',
    \ 'scheme' : $HOME.'/.gosh_completions'
        \ }

" Define keyword.
if !exists('g:neocomplete#keyword_patterns')
    let g:neocomplete#keyword_patterns = {}
endif
let g:neocomplete#keyword_patterns['default'] = '\h\w*'

" Plugin key-mappings.
inoremap <expr><C-g>     neocomplete#undo_completion()
inoremap <expr><C-l>     neocomplete#complete_common_string()

" Recommended key-mappings.
" <CR>: close popup and save indent.
inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
  return (pumvisible() ? "\<C-y>" : "" ) . "\<CR>"
  " For no inserting <CR> key.
  "return pumvisible() ? "\<C-y>" : "\<CR>"
endfunction
" <TAB>: completion.
inoremap <expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"
" <C-h>, <BS>: close popup and delete backword char.
inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>"
inoremap <expr><BS> neocomplete#smart_close_popup()."\<C-h>"
" Close popup by <Space>.
"inoremap <expr><Space> pumvisible() ? "\<C-y>" : "\<Space>"

" AutoComplPop like behavior.
"let g:neocomplete#enable_auto_select = 1

" Shell like behavior(not recommended).
"set completeopt+=longest
"let g:neocomplete#enable_auto_select = 1
"let g:neocomplete#disable_auto_complete = 1
"inoremap <expr><TAB>  pumvisible() ? "\<Down>" : "\<C-x>\<C-u>"

" Enable omni completion.
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
" autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags

" Enable heavy omni completion.
if !exists('g:neocomplete#sources#omni#input_patterns')
  let g:neocomplete#sources#omni#input_patterns = {}
endif

"let g:neocomplete#sources#omni#input_patterns.php = '[^. \t]->\h\w*\|\h\w*::'
let g:neocomplete#sources#omni#input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)'
let g:neocomplete#sources#omni#input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::'

" For perlomni.vim setting.
" https://github.com/c9s/perlomni.vim
" let g:neocomplete#sources#omni#input_patterns.perl = '\h\w*->\h\w*\|\h\w*::'
'''
on_i = 1

[[plugins]]
repo = 'davidhalter/jedi-vim'
hook_add = '''
autocmd FileType python setlocal completeopt-=preview " Do not display docstring
autocmd FileType python setlocal omnifunc=jedi#completions

" Invalidate jedi-vim and set completion to neocomplete
let g:jedi#completions_enabled = 0
let g:jedi#auto_vim_configuration = 0

" let g:jedi#popup_select_first = 0
" let g:jedi#completions_command = "<C-k>"
" let g:jedi#popup_on_dot = 0

" for jedi-vim, python completion settings
if !exists('g:neocomplete#force_omni_input_patterns')
        let g:neocomplete#force_omni_input_patterns = {}
endif

let g:neocomplete#force_omni_input_patterns.python = '\%([^. \t]\.\|^\s*@\|^\s*from\s.\+import \|^\s*from \|^\s*import \)\w*'
let g:neocomplete#disable_auto_complete = 1 " disable auto complete
inoremap <expr><C-n> pumvisible() ? "\<down>" : neocomplete#start_manual_complete()

'''
on_i = 1
on_ft = ['python']

試したこと

neocompleteの作者様の紹介スライドを拝見したところ、g:neocomplete#force_omni_input_patterns.を使用すると
neocompleteの機能は全て無効になるとありました。
g:neocomplete#skip_auto_completion_timeを使用し自動補完を一定時間で打ち切るということをしたかったので、今どうしようもない状況になっています。

どなたかこの件についてご教示いただけますでしょうか。

neocomplete作者様のスライド:  https://www.slideshare.net/Shougo/neocompletevim

補足情報(言語/FW/ツール等のバージョンなど)

[自身の環境]
Ubuntu 14.04.5LTS

VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Aug  4 2017 01:55:49)
適用済パッチ: 1-851

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

残念ながら、neocomplete では無理です。
それを実現するにはマルチスレッドかマルチプロセス化しなければいけないからです。
jedi-vim の補完はシングルスレッドなので、もし neocomplete がマルチスレッド化してもやはり止まってしまいます。
neovim をお使いなら deoplete.nvim + deoplete-jedi を使うと状況は多少改善されると思います。deoplete-jedi にはキャッシュ機能や補完のタイムアウトがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/08 21:24

    ご回答ありがとうございます。
    そうなのですか...。
    分かりました、一度neovim, deoplete-jediを使ってみたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る