web-dev-qa-db-ja.com

vimでのbashのようなコード補完?

私は現在、Vimでの補完にsuperTabを使用しています。ただし、完成はもっとbashのようにしたいと思います。たとえば、入力している場合

st

可能な完了は

struct, string

Tabキーを押すとstrまで完了し、理想的には完了可能なメニューを表示したいと思います。

プラグインはOKです。

3

次のプラグインはあなたが求めていることを実行すると思います:
YouCompleteMe

説明から:

YouCompleteMeは、Vim用の高速で入力どおりのあいまい検索コード補完エンジンです。 2つの補完エンジンがあります。すべてのプログラミング言語で動作する識別子ベースのエンジンと、C/C++/Objective-C/Objective-C++のセマンティックコード補完を提供するセマンティックClangベースのエンジンです(以降、「 Cファミリー言語」)。

2

パッティングset completeopt=menu,longestは、ほとんどの場合、トリックを実行することが判明しました。残念ながら、さらにテキストを入力してからTabキーを押すと、次に長い共通プレフィックスを指定する代わりに、完全に完了しようとします。

1

アレクサンダーの答えに基づいて、私は私の.vimrcにこれらの行のようなものを持っています

"unix like completion - longest substring
set completeopt+=longest
"add command to retrigger longest substring
"Naive version... see below
inoremap <C-m> <C-e><C-n>

したがって、「最長」ビットがほとんどの作業を実行しますが、その後の<C-n>の押下は、オプションの循環を開始するだけです。オートコンプリートを行う<C-e>を押すと、<C-n>で再度トリガーすると、次に長い部分文字列と一致します...そのショートカットを追加すると、2つのキーを押す必要がなくなります..。

それを<C-n>にバインドしたくないのは、慣れ親しんだ方法でサイクリングを停止するからです。

Nのすぐ隣にあるMを選択し、チェック(:h insert-index)はデフォルトでsame as <CR>....にバインドされているだけです。これはvimであり、簡単なことは何もないため、これは次のことを意味します。 vimは実際にはできません 2つのキーを押すことを区別します

<C-m>の使用を気にしない場合は、他のものを選択してください。それ以外の場合は、以下をお読みください...

他の投稿に基づいて、下部の回答を調整し、構文を少しクリーンアップしました( this に基づく)

私はこれで終わった:

"add command to retrigger longest substring
inoremap <expr> <C-M> pumvisible() ? "\<C-e><C-n>" : "\<C-m>"

pumvisible()は、ポップアップメニューが開いているかどうかを示すフラグを返します。これにより、ポップアップメニューが開いていないときに、挿入モードでのEnterキーの動作を変更できなくなります。

残念ながら、?のドキュメントが見つかりません。と:そしてなぜ文字列を渡さなければならないのか。

0
JonnyRaa