VIMの完全なオートコンプリートは実際には期待どおりに機能していません。
それをよりスマートにする方法はありますか?たとえば、サラウンドテキストのコンテキストを監視するには? (例:コメントまたは引用符内の場合はトリガーしないでください)
Visual Studio、IntelliJ、Sublime、Atom(これらすべてを使用しました)などのIDEのオートコンプリート/ IntelliSenseと比較すると、Vimに切り替えてから幸せな場所にたどり着けないので質問します過去の開発用)。
この質問の基本的な目標:
私は数ヶ月間Vimを初めて使用し、スムーズなワークフローを実現しようと必死になっています。しかし、適切なオートコンプリートオプションがないと、使用しようとしているコードの学習にもっと注意を払う必要がありますが、過去に使用した他のIDEよりも非常にゆっくりと落ち込んでいます。
Atom + Go-Plusで私の期待を調べてみましょう。
同じパッケージ内の別のGoファイルの別の場所にfunc generate(entropy chan<- uint64)
という名前の関数があります。
22行目に文字g
を入力すると、gで始まるすべてのプロンプトがすぐに表示されます。
ご覧のとおり、すぐにポップアップする3つのオプションがあります(最初の2つは単なるコードスニペットだと思います)。矢印キーを使用して、どちらかのオプションまで下にスクロールできます。
3番目のオプションを選択した場合(またはgen
と入力し続けた場合、フィールドは1つのオプションのみに絞り込まれます)、_press enter
_ Atom/Visual Studio/Sublimeはすべて、メソッドの詳細を入力します。私:
上記のいずれも入力しませんでした。挿入されたので、詳細を上書きしたり、変更したり、Tabキーを押して入力を続けたりすることができます。
それを私の現在の(おそらく壊れている?)設定のomnicomplete
と比較してみましょう。私はこれを私の.vimrcに持っています:
_set completeopt=longest,menuone
_
Vim内で、gen
と入力すると、このバッファーの他の場所(およびこのバッファーのみ、他のバッファーではない)に入力した以前に入力したテキストと思われるものだけが表示されます。何かのつづりを間違えた場合、vimを開いている間、以前に入力したつづりの間違ったバージョンをすべて取得します。これは、IntelliSense /オートコンプリートが機能していないことを示しています-私が行うキーストロークを監視するものだけです:
ご覧のとおり、入力時にオートコンプリートが機能していません。ただし、これは他の場所のコメントや文字列で役立ちます。vimが入力したフリーテキストをどのように記憶しているかが好きです。
どのVimオプションがこれを可能にしているのかよくわかりません。ただし、オートコンプリートではありません。
これで、_CTRL-X + CTRL-O
_を押してオートコンプリートを強制し、generate()
を表示することができます。
これの方が良い;ただし、入力するとオートコンプリートオプションが表示されると思います。それを実現するために3回の追加のキーストロークは必要ありません。これは、数時間のコーディングを通じて発生するC-xC-oの多くです。
VimにINSERTモードでキーストロークを監視させ、一致するctagまたは関数がある場合にオートコンプリートを表示する方法はありますか?これが答えかもしれません機能。
omnicomplete
のオートコンプリートには、これが機能した場合に上記のCx Co要件を見落とす可能性があるという2番目の問題があります。オートコンプリートするメソッドを選択すると、パラメーター/フィールドが挿入されません。 。
上のスクリーンショットに戻って、その方法を選択すると、次のようになります。
関数のパラメータを挿入しないことに注意してください。これは、Atom、Sublime、およびVisual Studioのオートコンプリートがすべてパラメーターを表示してメソッドを完了する、上記の2番目の画像とは一致しません。
私はvimwikiaを読み、実行可能な代替手段なしで_set completeopt
_を使用してさまざまなオプションを試しました。
たとえば、_set completeopt+=preview
_は、次を選択した後にプレビューウィンドウを表示します。
プレビューでパラメータを指定しても、コードの_line 22
_がオートコンプリートされず、気が散ることがよくあります(常に停止して「検索」するよりもはるかに高速に入力するため、無効にすることがよくあります。 )。
以下を機能させるには、設定ファイルを大幅に調整する必要がありました。しかし、「ドット」オートコンプリートを機能させることができました。したがって、何らかの形のオートコンプリートが機能しています。
しかし、繰り返しになりますが、それが何であるかを確認するためだけに_ESC + back arrow + back arrow + : + GoDoc
_と入力する必要がある非常に煩わしい関数を選択すると、パラメーターは入力されません。それが何であるかを確認するには10文字のストロークです。
確かに、Atom、Sublime、およびVSは、「ドット自動補完」の場合にはるかにきれいです。
(これはタイプ別に並べた方が良いですが、一番上で最後に使用されたものを覚えておくためのvimセットアップがあります)。しかし、私はきれいなことは気にしません-「ドット」で選択したときにパラメータが表示されるようにしたいだけです。
私はどのIDEよりもVimを使い続けたいので、vim-goと関連プラグインを微調整する方法についてのアドバイスは大歓迎です。ありがとうございました。
編集:
_vim-go
_ の作成者がパラメーター補完部分に取り組み、それを機能させたことがわかります。
インストールで動作させることはできないようですが(まだデバッグ中です)、パラメーターを入力してオートコンプリートを実行できることを他の人に示したかったのです。
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)をスニペットで表しています。したがって、パラメータをバッファに挿入する場合は、次のことを行う必要があります。
いわゆるpreviewウィンドウの使用方法に気が変わった場合は、ここでいくつかのヒントを紹介します。
set splitbelow
_。set previewheight
_オプションでサイズを変更できます。autocmd CompleteDone * pclose
_。詳細については、_help ins-completion
_および_help preview-window
_を実行してください。