web-dev-qa-db-ja.com

INSERTモードのキーストロークでオムニコンプリート/オートコンプリートをトリガーするにはどうすればよいですか?

VIMの完全なオートコンプリートは実際には期待どおりに機能していません。

それをよりスマートにする方法はありますか?たとえば、サラウンドテキストのコンテキストを監視するには? (例:コメントまたは引用符内の場合はトリガーしないでください)

Visual Studio、IntelliJ、Sublime、Atom(これらすべてを使用しました)などのIDEのオートコンプリート/ IntelliSenseと比較すると、Vimに切り替えてから幸せな場所にたどり着けないので質問します過去の開発用)。

この質問の基本的な目標:

  • Omnicompleteは、INSERTモードのA-Za-zキーストロークでトリガーできますか?すでに「。」を介してトリガーされています。ドット記号。
  • Omnicompleteにfuncのパラメーターを挿入させる方法は?

私は数ヶ月間Vimを初めて使用し、スムーズなワークフローを実現しようと必死になっています。しかし、適切なオートコンプリートオプションがないと、使用しようとしているコードの学習にもっと注意を払う必要がありますが、過去に使用した他のIDEよりも非常にゆっくりと落ち込んでいます。

Atom + Go-Plus

Atom + Go-Plusで私の期待を調べてみましょう。

同じパッケージ内の別のGoファイルの別の場所にfunc generate(entropy chan<- uint64)という名前の関数があります。

22行目に文字gを入力すると、gで始まるすべてのプロンプトがすぐに表示されます。

Atom's autocomplete with Go-Plus

ご覧のとおり、すぐにポップアップする3つのオプションがあります(最初の2つは単なるコードスニペットだと思います)。矢印キーを使用して、どちらかのオプションまで下にスクロールできます。

3番目のオプションを選択した場合(またはgenと入力し続けた場合、フィールドは1つのオプションのみに絞り込まれます)、_press enter_ Atom/Visual Studio/Sublimeはすべて、メソッドの詳細を入力します。私:

atom with go-plus autocompletion

上記のいずれも入力しませんでした。挿入されたので、詳細を上書きしたり、変更したり、Tabキーを押して入力を続けたりすることができます。

Vim + Vim-Go(本当にオムニコンプリート)

それを私の現在の(おそらく壊れている?)設定のomnicompleteと比較してみましょう。私はこれを私の.vimrcに持っています:

_set completeopt=longest,menuone_

Vim内で、genと入力すると、このバッファーの他の場所(およびこのバッファーのみ、他のバッファーではない)に入力した以前に入力したテキストと思われるものだけが表示されます。何かのつづりを間違えた場合、vimを開いている間、以前に入力したつづりの間違ったバージョンをすべて取得します。これは、IntelliSense /オートコンプリートが機能していないことを示しています-私が行うキーストロークを監視するものだけです:

vim with omnicomplete and autocomplete not working

ご覧のとおり、入力時にオートコンプリートが機能していません。ただし、これは他の場所のコメントや文字列で役立ちます。vimが入力したフリーテキストをどのように記憶しているかが好きです。

どのVimオプションがこれを可能にしているのかよくわかりません。ただし、オートコンプリートではありません。

これで、_CTRL-X + CTRL-O_を押してオートコンプリートを強制し、generate()を表示することができます。

vim with omnicomplete and autocomplete

これの方が良い;ただし、入力するとオートコンプリートオプションが表示されると思います。それを実現するために3回の追加のキーストロークは必要ありません。これは、数時間のコーディングを通じて発生するC-xC-oの多くです。

VimにINSERTモードでキーストロークを監視させ、一致するctagまたは関数がある場合にオートコンプリートを表示する方法はありますか?これが答えかもしれません機能。

パラメータによるオートコンプリート

omnicompleteのオートコンプリートには、これが機能した場合に上記のCx Co要件を見落とす可能性があるという2番目の問題があります。オートコンプリートするメソッドを選択すると、パラメーター/フィールドが挿入されません。 。

上のスクリーンショットに戻って、その方法を選択すると、次のようになります。

vim with vim-go autocomplete not fully completing

関数のパラメータを挿入しないことに注意してください。これは、Atom、Sublime、およびVisual Studioのオートコンプリートがすべてパラメーターを表示してメソッドを完了する、上記の2番目の画像とは一致しません。

私はvimwikiaを読み、実行可能な代替手段なしで_set completeopt_を使用してさまざまなオプションを試しました。

たとえば、_set completeopt+=preview_は、次を選択した後にプレビューウィンドウを表示します。

enter image description here

プレビューでパラメータを指定しても、コードの_line 22_がオートコンプリートされず、気が散ることがよくあります(常に停止して「検索」するよりもはるかに高速に入力するため、無効にすることがよくあります。 )。

以下を機能させるには、設定ファイルを大幅に調整する必要がありました。しかし、「ドット」オートコンプリートを機能させることができました。したがって、何らかの形のオートコンプリートが機能しています。

vim and vim-go autocompletion with dot

しかし、繰り返しになりますが、それが何であるかを確認するためだけに_ESC + back arrow + back arrow + : + GoDoc_と入力する必要がある非常に煩わしい関数を選択すると、パラメーターは入力されません。それが何であるかを確認するには10文字のストロークです。

確かに、Atom、Sublime、およびVSは、「ドット自動補完」の場合にはるかにきれいです。

atom and go-plus dot autocompletion

(これはタイプ別に並べた方が良いですが、一番上で最後に使用されたものを覚えておくためのvimセットアップがあります)。しかし、私はきれいなことは気にしません-「ドット」で選択したときにパラメータが表示されるようにしたいだけです。

私はどのIDEよりもVimを使い続けたいので、vim-goと関連プラグインを微調整する方法についてのアドバイスは大歓迎です。ありがとうございました。

編集:

_vim-go_ の作成者がパラメーター補完部分に取り組み、それを機能させたことがわかります。

autocompletion with parameters in vim-go

インストールで動作させることはできないようですが(まだデバッグ中です)、パラメーターを入力してオートコンプリートを実行できることを他の人に示したかったのです。

13
eduncan911

Omnicompleteは、INSERTモードのA-Za-zキーストロークでトリガーできますか?

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()
_

また、vimが完了テキストを自動的に挿入しないように_set completeopt+=menuone,noselect,noinsert_する必要があります。ただし、これは一般的な決定ではなく、おそらくいくつかの問題が発生することを覚えておいてください。私が見つけたのは、それがcgnコマンドを壊すということです。

詳細については、_help InsertCharPre_、_help autocmd-events_、help pumvisible()help feedkeys()を参照してください。

Omnicompleteにfuncのパラメーターを挿入させる方法は?

私は数年間sublimeを使用しましたが、これは組み込み関数(デフォルトのvim omnicompletion)をスニペットで表しています。したがって、パラメータをバッファに挿入する場合は、次のことを行う必要があります。

  1. ltisnipsneosnippetminisnipxptemplateまたは others のようなスニペットマネージャーをインストールします。
  2. 大量のスニペットを作成するか、どこかからインストールします。
  3. コンプリーションシステムに優先スニペットマネージャーを認識させます(多くのコンプリーションマネージャーはltisnipsを認識します)。

いわゆるpreviewウィンドウの使用方法に気が変わった場合は、ここでいくつかのヒントを紹介します。

  1. 画面の下部にプレビューウィンドウを表示することができます_set splitbelow_。
  2. _set previewheight_オプションでサイズを変更できます。
  3. 完了後にウィンドウを自動的に閉じるには_autocmd CompleteDone * pclose_。

詳細については、_help ins-completion_および_help preview-window_を実行してください。

3
Evgeniy