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

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

vim のかなり厄介な機能は、挿入モードでオートコンプリート (Ctrl-N) を実行し、矢印キーで目的の項目まで移動して Enter キーを押すと、項目が挿入されるだけでなく、後で削除しなければならない改行も挿入されることです。

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

答え1

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

すべての状態で一貫して機能する方法は、Ctrl+を使用することですY。 Y は「はい、その単語を受け入れます」を表すものとして覚えておくのが好きです。 geedoubleya の回答のように再マップしていない限り、完了した単語の後に続くテキストの入力を開始することもできます。

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

詳細については、こちらをご覧ください:help popupmenu-keys

答え2

個人的にはこれを使用します:

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プラグインこのマッピングは便利だと思うかもしれません。

答え3

これは古いことだとはわかっていますが、geedoubleya の回答に便乗するようなものです。echristopherson の回答は有益で素晴らしいものでしたが、もし誰かが手っ取り早く簡単な解決策を求めているなら、次のようになります。

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

答え4

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

これを行うと、スクロールするときに現在の行が選択した単語に合わせて変更されます。

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

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

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

別途、矢印キーを使用する代わりに、 を繰り返すだけで、Ctrl-nオプションを順に選択し (Ctrl-p後戻りする)、移動しながら現在の行を置換できるため、Entervim キー マッピングは必要ありません。

関連情報