web-dev-qa-db-ja.com

改行を挿入せずにvimオートコンプリートリストの項目を選択します

Vimのかなり厄介な機能は、挿入モードでオートコンプリート(Ctrl-N)を実行し、矢印キーを使用して目的のアイテムまで移動し、Enterキーを押すと、アイテムが挿入されますが、改行も挿入されます。その後、削除する必要があります。

不要な改行を追加せずにオートコンプリートリストから項目を選択する方法はありますか?

25
Tyler Durden

現在のポップアップメニューの状態によって異なります(:help popupmenu-completion)。質問から、状態2であることがわかりました(完了を見つけるために矢印キーを押したため)。ただし、デフォルトの動作 Enter 状態2では、改行なしで補完を挿入します。あなたが説明するのは通常、状態1の動作です(これは Ctrl+N/Ctrl+P。)

すべての州で一貫して機能する方法は、 Ctrl+Y。私はYを「はい、その言葉を受け入れます」を表すものとして覚えたいです。 geedoubleyaの答えのように再マッピングしない限り、完成したWordの後に続くテキストを入力し始めることも可能です。

同じコンテキストで、あなたは押すことができます Ctrl+E メニューをキャンセルし、テキストを呼び出し前の状態のままにします。のペアリングに慣れている場合 Ctrl+E そして Ctrl+Y 他のコンテキスト(たとえば、通常モードで上下にスクロールする、または挿入モードでカーソルの下または上に文字を挿入する)では、これをここで覚えておく方法の1つです。メニューを「終了する」などと考えることもできます。

見る :help popupmenu-keys 多くのための。

41
echristopherson

個人的に私はこれを使います:

inoremap <expr> <TAB> pumvisible() ? "\<C-y>" : "\<CR>"
inoremap <expr> <Esc> pumvisible() ? "\<C-e>" : "\<Esc>"
inoremap <expr> <C-j> pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <C-k> pumvisible() ? "\<C-p>" : "\<Up>"

CtrlPプラグイン を使用する人なら誰でも、このマッピングが便利だと思うかもしれません。

7
Dmitrii

矢印キーを使用する代わりに、jkキーでオートコンプリートリストをスクロールできるようにします。

これを行うと、現在の行がスクロールして選択したWordに一致するように変更されます。

したがって、置換されたWordの末尾でカーソルがまだ挿入モードであるため、Enterキーを押す必要はありません。

これを有効にするには、これを.vimrcに追加します(stackoverflowで他の人に感謝します)。

inoremap <expr> j ((pumvisible())?("\<C-n>"):("j"))
inoremap <expr> k ((pumvisible())?("\<C-p>"):("k"))

別に、矢印キーを使用する代わりに、Ctrl-nオプションを悪用します(Ctrl-p逆方向に移動します)、現在の行が移動するときに置き換えます。Enterまたはvimキーマッピングは必要ありません。

3
geedoubleya

私はこれが古いことを知っていますが、geedoubleyaの答えを裏付けているようなものです。

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))
3
Jay