Comment coller une nouvelle ligne avec vim?

144

Je dois souvent coller des trucs 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?

static_rtti
la source
8
3 touches ne sont pas efficaces?
gtd
60
1 ou 2 serait mieux :) Pourquoi utiliser vim sinon pour une efficacité maximale?
static_rtti
2
Il en résulte également une nouvelle ligne supplémentaire si le contenu copié se termine par une nouvelle ligne.
Jonathan W.
1
@gtd Un éditeur normal fonctionne avec <Entrée> <CV>. Deux frappes.
user4052054
1
@ user4052054 non, cela ne fait pas la même chose, o / O travaille où que vous soyez sur la ligne, dans un éditeur normal, vous devez d'abord arriver au début ou à la fin de la ligne. De plus, si vous copiez une ligne entière, le tout ne devient qu'une seule touche pour insérer une ligne, ce qui est une proposition beaucoup plus courante dans le codage.
gtd

Réponses:

71

Peu de temps après, :help pil dit:

:[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, ce n'est pas plus court que votre solution actuelle, sauf si vous l'avez combiné avec une carte de clavier comme suggéré dans une réponse différente. Par exemple, vous pouvez le mapper à n'importe quelle clé (même p):

:nmap p :pu<CR>
Bombe
la source
2
Je le sais et je l'utilise, mais ce n'est pas ce que je demande, car parfois ce que vous copiez ne contient tout simplement pas de LF. S'il y avait une commande "coller dans une nouvelle ligne", cela fonctionnerait quel que soit le contenu que vous êtes sur le point de coller, vous n'avez donc pas à y penser.
static_rtti
5
OK, :pu[t]mettra le texte dans une nouvelle ligne après la ligne actuelle, :pu[t]!mettra le texte dans une nouvelle ligne avant la ligne actuelle. Je modifierai ma réponse en conséquence. (Hourra pour :help p.)
Bombe
2
Pas vraiment mieux que ma solution actuelle, mais je pense que c'est la meilleure réponse à ma question.
static_rtti
4
Bien que le même nombre de frappes, je pense que cela semble plus efficace. o <Esc> p semble maladroit, alors que ce n'est pas le cas.
Mark Story
2
Vous pouvez mapper la commande sur n'importe quelle touche, y compris p elle-même: :nmap p :pu<CR>mettez-la dans votre fichier .vimrc et c'est parti :)
Capi Etheriel
55

Options:

1) Utilisez yypour retirer toute la ligne (y compris le caractère de fin de ligne). pcollera alors la ligne sur une nouvelle ligne après la ligne actuelle et P( Shift- P) collera au-dessus de la ligne courante.

2) Faites un mapping: alors ce n'est qu'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
DrAl
la source
2
Eh bien, je suppose que je vais faire une cartographie. J'espérais juste qu'il pourrait y avoir une solution standard: - / Merci pour votre réponse!
static_rtti
2
@AI: Utiliser le ', p' (',' est mappé comme mon <Leader>) est la meilleure solution à mon avis. Vous avez même fourni une fonction facile à utiliser. :) Génial!
Quelqu'un vous utilise toujours MS-DOS
30

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 trouvé que j'utilise <C-R>"très souvent et je l'ai lié <C-F>dans mon vimrc:

inoremap <C-F> <C-R>"
soulmerge
la source
2
C'est génial car cela maintient l'indentation correcte si la ligne copiée n'a pas été indentée.
CornSmith
24

Cela utilise toujours trois touches, mais je trouve cela 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 ne l'étiez pas.

pseudo
la source
2
Manière assez pratique lorsque vous essayez le coup sec que vous coupez à l'intérieur de la ligne avec "d $" dans une nouvelle ligne
Serhat Cevikel
Désolé, mais cela ne garde pas le retrait, il colle au début de la ligne, à la place.
Michael Goldshteyn
Quelqu'un peut-il élaborer cette méthode pour mac (sans alt)?
Li haonan
@Lihaonan Votre question date d'il y a 8 mois, j'espère que vous avez déjà vu stackoverflow.com/q/7501092/5407634
m_mlvx le
12

En utilisant ce plugin: https://github.com/tpope/vim-unimpaired

]pcolle sur la ligne ci-dessous

[pcolle sur la ligne ci-dessus

avantages:

  • fonctionne sur tout le texte copié (mot, ligne, caractère, etc.)
  • met en retrait le texte collé pour correspondre à l'indentation du texte qui l'entoure
  • 2 frappes au lieu de 3 et beaucoup plus "plus faciles"
  • vite
crogers
la source
1
Mon préféré aussi. Cela vaut peut-être la peine de mentionner que vous en avez besoin tpope/vim-unimpairedpour que cela fonctionne 😉.
alextes
1
ah j'ai installé ça il y a si longtemps que je l'ai oublié. Merci pour le rappel!
crogers le
9

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

nmap <CR> o<Esc>k

... basé sur cet article de Vim Wikia.

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

<CR>jp

Vous pouvez également ignorer k dans le nmap ci-dessus, en fonction de la fonctionnalité que vous préférez dans Enter , donc ce serait juste <CR>p.

J'ai également implémenté jj sur Esc , ce qui aiderait également dans ce cas. Esc est bien trop éloigné de la ligne d'accueil pour son importance dans vim.

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

Miyalys
la source
5

Si vous copiez une ligne entière puis collez une ligne entière, utilisez Ypour retirer la ou les lignes, y compris le saut de ligne, en premier lieu, et ppour coller. Vous pouvez également utiliser V, qui est le mode de ligne visuelle , par opposition à plain vpour le mode visuel.

Peter
la source
3
Le problème est que parfois vous ne voulez tout simplement pas copier une ligne entière ... J'aimerais une solution qui fonctionne que j'aie copié dix lignes ou deux mots.
static_rtti
3

J'ai la cartographie inoremap jj <ESC>. Il est donc facile d'insérer une nouvelle ligne avec ojjet Ojjpuis p.

alors ojjpcollez une nouvelle ligne. il a un coup de plus alors o<esc>pmais ojjpc'est facile pour moi.

Natwar Singh
la source
2

J'ai trouvé une solution élégante à cela. Si vous mettez le registre Yank dans le presse-papiers de votre système d'exploitation (ce qui est bien de toute façon), avec

set clipboard+=unnamed

que vous pouvez faire o<Ctl-v>.

En plus d'être moins de traits, cela améliore les deux o<Esc>pet :puparce que cela préserve 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 non dépendre 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 de se retrouver dans le presse-papiers du système d'exploitation.

enfascination
la source
1

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

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

jtpereyda
la source
1

J'utilise le mappage suivant dans ma configuration Neovim:

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

Une petite explication:

  • m`: place 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 au dessus et collez le texte dans cette ligne
  • ``: place le curseur dans sa position d'origine

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

jdhao
la source
1

Si vous souhaitez rester en mode insertion, vous pouvez faire o ctrl+o p

  • o - insérer le mode et aller à la nouvelle ligne
  • ctrl+o - exécuter une seule commande comme en mode normal
  • p - pâte

Il s'agit de trois frappes mais vous restez en mode insertion et o ctrl+oest également assez rapide, donc je le traite personnellement comme 2,5 frappes.

reconnecter
la source
0

Cette solution ne semble s'appliquer que lorsque le bloc de texte copié commence sur une nouvelle ligne (par opposition à 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 naviguer jusqu'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 que votre texte soit collé et appuyez sur p. Si je n'ai pas foiré l'explication, cela devrait donner l'effet que vous recherchez.

ininterrompu
la source