Seleziona un elemento nell'elenco di completamento automatico di vim senza inserire l'interruzione di riga


22

Una caratteristica piuttosto fastidiosa di vim è che se sei in modalità di inserimento e fai un completamento automatico (Ctrl-N), il tasto freccia giù verso l'elemento desiderato e premi il tasto Invio, quindi inserisce l'elemento ma inserisce anche una nuova riga che quindi eliminare.

Esiste un modo per selezionare un elemento dall'elenco di completamento automatico senza ottenere una nuova riga indesiderata aggiuntiva?


1
Non è così che funziona per me ... Seleziono qualcosa, premo Invio e dopo il cursore si trova ancora sulla stessa riga.
Riccioli d'oro

Risposte:


37

Dipende dallo stato del menu popup in cui ci si trova (vedere :help popupmenu-completion). Capisco dalla tua domanda che sei nello stato 2 (poiché hai premuto i tasti freccia per trovare un completamento). Tuttavia, il comportamento predefinito per Enternello stato 2 è quello di inserire il completamento senza newline; quello che descrivi è normalmente il comportamento dello stato 1 (che è quando usi Ctrl+ N/ Ctrl+ P.)

Un modo che funziona in modo coerente in tutti gli stati è usare Ctrl+ Y. Mi piace ricordare la Y come "sì, accetta quella parola". È anche possibile iniziare a digitare il testo che dovrebbe venire dopo la parola completa, a meno che tu non abbia rimappato le cose come nella risposta di geedoubleya.

Nello stesso contesto, puoi premere Ctrl+ Eper annullare il menu e lasciare il testo com'era prima di invocarlo. Se sei abituato agli abbinamenti di Ctrl+ Ee Ctrl+ Yin altri contesti (ad es. Per scorrere verso l'alto o verso il basso in modalità normale o per inserire il carattere sotto o sopra il cursore in modalità inserimento), è un modo per ricordarlo qui. Immagino che potresti anche pensarlo come "uscire" dal menu o simili.

Vedi :help popupmenu-keysdi più.


2
Ah ah, ha senso. Ho usato Ctrl-N per aprire il menu a discesa. Ho appena usato i tasti freccia per navigare nel menu a discesa. Non sapevo che avresti potuto usare i tasti freccia per aprire il menu a discesa.
Tyler Durden,

I tasti freccia non possono aprire il menu a discesa, nella configurazione predefinita. La distinzione che ho menzionato riguardava la navigazione nel menu una volta aperto.
ecristopherson,

Per qualche motivo, quando ho provato a farlo con <kbd> Ctrl </kbd> + <kbd> Y </kbd> ha indentato anche la riga, che è indesiderata. Qualche idea sul perché sarebbe successo?
mpacer,

Non l'ho mai incontrato. Forse è dovuto a qualche impostazione di rientro o a un plugin che hai dimenticato. Vorrei chiedere sulla mailing list di Vim: vim.org/maillist.php .
echristopherson,

6

Personalmente uso questo:

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>"

Chiunque utilizzi il plug-in CtrlP potrebbe trovare conveniente questa mappatura.


3

So che questo è vecchio, ma un po 'di supporto sulla risposta di geedoubleya poiché sebbene la risposta di echristopherson fosse istruttiva e fantastica, se qualcuno vuole una soluzione rapida e sporca:

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

2

In alternativa all'utilizzo dei tasti freccia, abilita i tasti j& kper scorrere l'elenco di completamento automatico.

In questo modo si modifica la riga corrente in modo che corrisponda alla parola selezionata durante lo scorrimento.

Pertanto non è necessario premere Invio poiché il cursore si trova ancora nella modalità di inserimento alla fine della parola sostituita.

Per abilitarlo aggiungi questo al tuo .vimrc (grazie ad altri su StackOverflow):

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

Separatamente, invece di usare i tasti freccia, potresti semplicemente ripetere Ctrl-nciò che imprecherà tra le opzioni ( Ctrl-pper tornare indietro) e sostituire la linea corrente mentre si muove, senza necessità Entero mappature dei tasti vim.


Questo comportamento può essere un po 'confuso, dato che è sia 1) in modalità inserimento che 2) interpretando j e k per fare cose che non fanno in modalità inserimento. In particolare, non è possibile selezionare una voce di menu e quindi seguirla direttamente con qualcosa che inizia con j o k.
ecristopherson,

D'accordo, ecco perché ho fornito l'altra opzione se questo è stato un passo troppo avanti. Personalmente, preferirei la confusione piuttosto che muovere la mano per usare le frecce.
geedoubleya,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.