Sélectionnez un élément dans la liste de saisie semi-automatique de vim sans insérer de saut de ligne

22

Une caractéristique assez ennuyeuse de vim est que si vous êtes en mode insertion et que vous effectuez une saisie semi-automatique (Ctrl-N), appuyez sur la touche fléchée vers le bas pour l'élément souhaité, puis appuyez sur la touche Entrée, puis il insère l'élément mais insère également une nouvelle ligne que vous doivent ensuite supprimer.

Existe-t-il un moyen de sélectionner un élément de la liste de saisie semi-automatique sans obtenir de nouvelle ligne indésirable supplémentaire?

Tyler Durden
la source
1
Ce n'est pas comme ça que ça marche pour moi ... Je sélectionne quelque chose, j'appuie sur Entrée, et le curseur est toujours sur la même ligne après.
goldilocks

Réponses:

37

Cela dépend de l'état du menu contextuel dans lequel vous vous trouvez (voir :help popupmenu-completion). Je comprends de votre question que vous êtes dans l'état 2 (puisque vous avez appuyé sur les touches fléchées pour trouver un achèvement). Cependant, le comportement par défaut de l' Enterétat 2 consiste à insérer l'achèvement sans retour à la ligne; ce que vous décrivez est normalement le comportement de l'état 1 (c'est-à-dire lorsque vous utilisez Ctrl+ N/ Ctrl+ P.)

Une méthode qui fonctionne de manière cohérente dans tous les États consiste à utiliser Ctrl+ Y. J'aime me souvenir que le Y signifie «oui, accepte ce mot». Il est également possible de commencer à taper le texte qui devrait venir après le mot terminé, à moins que vous n'ayez remappé les choses comme dans la réponse de geedoubleya.

Dans le même contexte, vous pouvez appuyer sur Ctrl+ Epour annuler le menu et laisser votre texte tel qu'il était avant de l'invoquer. Si vous êtes habitué aux appariements de Ctrl+ Eet Ctrl+ Ydans d'autres contextes (par exemple pour faire défiler vers le haut ou vers le bas en mode normal, ou pour insérer le caractère en dessous ou au-dessus du curseur en mode insertion), c'est une façon de s'en souvenir ici. J'imagine que vous pourriez aussi penser à cela comme "quitter" le menu ou similaire.

Voir :help popupmenu-keyspour en savoir plus.

echristopherson
la source
2
Ah ha, ça a du sens. J'utilise Ctrl-N pour ouvrir le menu déroulant. Je viens d'utiliser les touches fléchées pour naviguer dans le menu déroulant. Je ne savais pas que vous pouviez utiliser les touches fléchées pour ouvrir la liste déroulante.
Tyler Durden
Les touches fléchées ne peuvent pas ouvrir la liste déroulante, dans la configuration par défaut. La distinction que j'ai mentionnée concernait la navigation dans le menu une fois qu'il était ouvert.
echristopherson
Pour une raison quelconque, lorsque j'ai essayé de le faire avec <kbd> Ctrl </kbd> + <kbd> Y </kbd>, il a également mis en retrait la ligne, ce qui n'est pas souhaité. Avez-vous une idée de la raison pour laquelle cela se produirait?
mpacer
Je n'ai jamais rencontré ça. C'est peut-être dû à un paramètre de retrait ou à un plugin que vous avez oublié. Je demanderais sur la liste de diffusion de Vim: vim.org/maillist.php .
échristopherson
6

Personnellement j'utilise celui-ci:

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

Quiconque utilise le plugin CtrlP peut trouver ce mappage pratique.

Dmitrii
la source
3

Je sais que c'est vieux, mais un peu comme un support de la réponse de geedoubleya car bien que la réponse de l'échophophile soit informative et géniale, si quelqu'un veut une solution rapide et sale:

inoremap <expr> <cr> ((pumvisible())?("\<C-y>"):("\<cr>"))
Geai
la source
2

Au lieu d'utiliser vos touches fléchées, activez vos touches j& kpour faire défiler la liste de saisie semi-automatique.

Cette opération modifie la ligne actuelle pour qu'elle corresponde au mot sélectionné lorsque vous faites défiler.

Par conséquent, vous n'avez pas besoin d'appuyer sur Entrée car le curseur est toujours en mode insertion à la fin du mot substitué.

Pour l'activer, ajoutez ceci à votre .vimrc (Merci aux autres de stackoverflow):

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

Séparément, au lieu d'utiliser les touches fléchées, vous pouvez simplement répéter ce Ctrl-nqui va parcourir les options ( Ctrl-ppour revenir en arrière) et le remplacer sur la ligne actuelle au fur et à mesure qu'elle se déplace, pas besoin de Entermappages de touches vim.

geedoubleya
la source
Ce comportement peut être un peu déroutant, car il s'agit à la fois 1) en mode insertion et 2) d'interpréter j et k pour faire des choses qu'ils ne font pas en mode insertion. En particulier, vous ne pouvez pas sélectionner une entrée de menu, puis la suivre directement avec quelque chose commençant par j ou k.
echristopherson
D'accord, c'est pourquoi j'ai proposé l'autre option si c'était un pas trop loin. Personnellement, je préférerais la confusion plutôt que de déplacer ma main pour utiliser les flèches.
geedoubleya