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


22

vimのやっかいな機能は、挿入モードでオートコンプリート(Ctrl-N)を実行し、目的のアイテムまで矢印キーを押しながらEnterキーを押すと、アイテムを挿入するだけでなく、改行も挿入することです。その後削除する必要があります。

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


1
これは私のためにどのように機能するかではありません...私は何かを選択してEnterを押します、そしてカーソルはその後同じ行にあります。
goldilocks 14年

回答:


37

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

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

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

詳細:help popupmenu-keysをご覧ください。


2
ああ、それは理にかなっています。Ctrl-Nを使用してドロップダウンを開きました。矢印キーを使用してドロップダウンをナビゲートしています。矢印キーを使用してドロップダウンを開くことができるとは知りませんでした。
タイラーダーデン14年

デフォルトの構成では、矢印キーでドロップダウンを開くことはできません。私が言及した違いは、メニューが開かれた後にメニューをナビゲートすることでした。
echristopherson

何らかの理由で<kbd> Ctrl </ kbd> + <kbd> Y </ kbd>でこれを行おうとしたときに、行もインデントされましたが、これは望ましくありません。なぜそれが起こるのかについての考えはありますか?
mpacer 16

私はそれを見たことがない。おそらく、インデントの設定または忘れてしまったプラグインが原因です。Vimのメーリングリストvim.org/maillist.phpで質問します。
echristopherson 16

6

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

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

私はこれが古いことを知っていますが、echristophersonの答えは有益で素晴らしいものでしたが、誰かが迅速で汚い解決策を望んでいる場合、geedoubleyaの答えを支持しています

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

2

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

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

そのため、カーソルは置換された単語の最後で挿入モードのままなので、Enterキーを押す必要はありません。

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

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

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


この動作は1)挿入モードであり、2)jとkを解釈して挿入モードではしないことを行うため、少し混乱する可能性があります。特に、メニューエントリを選択して、jまたはkで始まるものを直接追跡することはできません。
echristopherson 14年

同意したので、もしこれがあまりにも一歩進んだなら、私は他のオプションを提供しました。個人的には、矢印を使用するために手を動かすよりも混乱を好むでしょう。
geedoubleya 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.