web-dev-qa-db-fra.com

Comment coller dans une nouvelle ligne avec vim?

Je dois souvent coller des éléments sur une nouvelle ligne dans vim. Ce que je fais habituellement c'est:

o<Esc>p

Ce qui insère une nouvelle ligne et me met en mode insertion, puis quitte le mode insertion et enfin colle.

Trois frappes. Pas très efficace. De meilleures idées?

108
static_rtti

Peu de temps après :help p, il est écrit:

:[line]pu[t] [x]    Put the text [from register x] after [line] (default
                    current line).  This always works |linewise|, thus
                    this command can be used to put a yanked block as
                    new lines.

:[line]pu[t]! [x]   Put the text [from register x] before [line]
                    (default current line).

Malheureusement, elle n’est pas plus courte que votre solution actuelle, à moins que vous ne la combiniez avec une carte de clavier comme suggéré dans une réponse différente. Par exemple, vous pouvez le mapper sur n’importe quelle clé (même p):

:nmap p :pu<CR>
54
Bombe

Options:

1) Utilisez yy pour supprimer toute la ligne (y compris le caractère de fin de ligne). p va ensuite coller la ligne sur une nouvelle ligne après la ligne courante et P (Shift-P) va coller au dessus de la ligne courante.

2) Faire un mapping: alors c'est seulement une ou deux clés:

:nmap ,p o<ESC>p
:nmap <F4> o<ESC>p

3) La version de fonction du mappage (vraiment inutile, mais juste pour être complet):

:nmap <F4> :call append(line('.'), @")<CR>

" This one may be a little better (strip the ending new-line before pasting)
:nmap <F4> :call append(line('.'), substitute(@", '\n$', '', ''))<CR>

:help let-register
:help :call
:help append()
:help line()
:help nmap
45
DrAl

Vous pouvez coller un tampon en mode insertion en utilisant <C-R> suivi du nom du tampon à coller. Le tampon par défaut est ", donc vous feriez

o<C-R>"

J'ai constaté que j'utilise très souvent <C-R>" et lié cela à <C-F> dans mon vimrc:

inoremap <C-F> <C-R>"
21
soulmerge

Cela utilise toujours trois frappes, mais je trouve que c'est plus facile que Esc:

o<Alt-p>

Puisque vous êtes en mode insertion après avoir appuyé sur o, le modificateur Alt vous permettra d'utiliser une commande comme si vous n'étiez pas.

16
Nick

Personnellement, j'ai nmapped Enter (CR) comme ceci:

nmap <CR> o<Esc>k

... basé sur this Article de Vim Wikia.

De cette façon, je peux créer des nouvelles lignes directement à partir du mode normal, et combiner ceci avec le fait de vouloir coller dans une nouvelle ligne ci-dessous, je le ferais:

<CR>jp

Vous pouvez également ignorer k dans le nmap ci-dessus, en fonction de la fonctionnalité que vous préférez utiliser de Entrée, afin que ce soit simplement <CR>p.

J'ai également mappé jj sur Esc, ce qui serait également utile dans ce cas. Esc est bien trop éloigné de la ligne de départ pour son importance dans vim.

Pas plus court que les autres solutions, mais je pense qu'il est moins lourd que certaines d'entre elles et qu'il a également d'autres utilisations.

7
miyalys

Si vous copiez une ligne entière puis collez une ligne entière, utilisez Y pour supprimer la ou les lignes, y compris les sauts de ligne, et p pour coller. Vous pouvez également utiliser V, qui est visualline mode, contrairement à plain v pour le mode visuel.

4
Peter

]p colle sur la ligne ci-dessous

[p colle sur la ligne ci-dessus

avantages:

  • fonctionne sur tout le texte arraché (Word, ligne, caractère, etc.)
  • indente le texte collé pour correspondre à l'indentation du texte qui l'entoure
  • 2 frappes de touche au lieu de 3 et beaucoup plus "facile" coups
  • garde mon .vimrc aussi minime que possible et n'utilise pas de mappage
  • vite
3
crogers

J'ai mappage inoremap jj <ESC>. Il est donc facile d’insérer une nouvelle ligne avec ojj et Ojj et ensuite p.

alors ojjp coller new une nouvelle ligne. il a encore un trait puis o<esc>p mais ojjp est facile pour moi.

2
Natwar Singh

J'ai trouvé une solution élégante à cela. Si vous placez le registre yank dans le presse-papiers de votre système d’exploitation (ce qui est génial quand même), avec

set clipboard+=unnamed

que vous pouvez faire o<Ctl-v>

En plus d'être moins de traits, cela améliore à la fois o<Esc>p et :pu car il conserve l'indentation: les deux autres options vous démarrent au caractère zéro sur la nouvelle ligne.

La mise en garde est que cela peut ou peut ne pas être dépendant du système d'exploitation. Tout ce que je sais, c'est que cela fonctionne sur la version récente d'OS X, mais le Presse-papiers n'est que l'un des nombreux moyens d'obtenir un résultat positif dans le Presse-papiers du système d'exploitation.

1
enfascination

Si vous souhaitez également terminer en mode insertion, il est possible de coller en mode insertion à l'aide de CTRL-R ". https://stackoverflow.com/a/2861909/461834

Encore trois frappes, mais pas d'échappement, et vous enregistrez une frappe si vous voulez terminer par insérer quand même.

1
jtpereyda

Cette solution ne semble s'appliquer que lorsque le bloc de texte copié commence sur une nouvelle ligne (au lieu de saisir un extrait de texte quelque part dans une ligne), mais vous pouvez toujours commencer votre copie sur le dernier caractère que vous souhaitez saisir, puis au dernier caractère à la fin de la ligne avant le début du bloc de copie souhaité. Ensuite, lorsque vous souhaitez le coller, placez le curseur à la fin de la ligne sous laquelle vous souhaitez coller votre texte et appuyez sur p. Si je n'ai pas foiré l'explication, cela devrait fournir l'effet que vous recherchez.

0
unbrokenrabbit

J'utilise le mappage suivant dans ma config Neovim:

nnoremap <leader>p m`o<ESC>p``
nnoremap <leader>P m`O<ESC>p``

Une petite explication:

  • m`: marquer une marque à la position actuelle du curseur.
  • o<Esc>p: créez une nouvelle ligne ci-dessous et collez le texte dans cette ligne
  • O<Esc>P: créez une nouvelle ligne ci-dessus et collez le texte dans cette ligne
  • ``: place le curseur à la position d'origine

Voir :h mark pour plus d'informations sur les marques dans Vim.

0
jdhao