Come incollare una nuova linea con vim?


144

Spesso devo incollare alcune cose su una nuova linea in vim. Quello che faccio di solito è:

o<Esc>p

Che inserisce una nuova riga e mi mette in modalità inserimento, quindi esce dalla modalità inserimento e infine incolla.

Tre battiture. Non molto efficiente. Qualche idea migliore?


8
3 battiture non sono efficienti?
gtd

60
1 o 2 sarebbe meglio :) Perché usare vim se non per la massima efficienza?
static_rtti,

2
Ne risulta anche una nuova riga aggiuntiva se il contenuto copiato termina con una nuova riga.
Jonathan W.,

1
@gtd Un normale editor funziona con <Invio> <CV>. Due battiture.
user4052054

1
@ user4052054 no, che non fa la stessa cosa, o / O funziona ovunque tu sia sulla linea, in un normale editor devi arrivare all'inizio o alla fine della riga prima. Inoltre, se stai copiando un'intera riga, l'intera cosa diventa solo una sequenza di tasti per inserire una riga, che è una proposta molto più comune nella codifica.
gtd

Risposte:


71

Poco dopo :help pdice:

:[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).

Sfortunatamente non è più breve della tua attuale soluzione a meno che tu non l'abbia combinato con una mappa della tastiera come suggerito in una risposta diversa. Ad esempio, puoi mapparlo su qualsiasi tasto (pari p):

:nmap p :pu<CR>

2
Lo so e lo uso, ma non è quello che sto chiedendo, perché a volte quello che stai copiando non ha alcun LF in esso. Se ci fosse un comando "incolla in una nuova riga", funzionerebbe indipendentemente dal contenuto che stai per incollare, quindi non dovresti pensarci.
static_rtti,

5
Va bene, :pu[t]inseriremo il testo in una nuova riga dopo la riga corrente, :pu[t]!inseriremo il testo in una nuova riga prima della riga corrente. Modificherò la mia risposta di conseguenza. (Evviva per :help p.)
Bombe,

2
Non molto meglio della mia attuale soluzione, ma penso che sia la migliore risposta alla mia domanda.
static_rtti,

4
Mentre lo stesso numero di sequenze di tasti, penso che questo sembri più efficiente. o <Esc> p sembra goffo, mentre non lo è.
Mark Story,

2
Puoi associare il comando a qualsiasi tasto, incluso p stesso: :nmap p :pu<CR>inseriscilo nel tuo file .vimrc e parti :)
Capi Etheriel

55

Opzioni:

1) Utilizzare yyper strappare l'intera riga (incluso il carattere di fine riga). pincollerà quindi la riga su una nuova riga dopo quella corrente e P( Shift- P) incollerà sopra la riga corrente.

2) Crea una mappatura: quindi sono solo una o due chiavi:

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

3) La versione della funzione della mappatura (davvero inutile, ma solo per completezza):

: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

2
Bene, immagino che farò una mappatura. Speravo solo che ci potesse essere una soluzione standard: - / Grazie per la risposta!
static_rtti,

2
@AI: L'uso di ', p' (',' è mappato come il mio <Leader>) è la migliore soluzione secondo me. Hai anche fornito una funzione facile da usare. :) Grande!
Qualcuno usa ancora MS-DOS

30

È possibile incollare un buffer in modalità inserimento usando <C-R>seguito dal nome del buffer da incollare. Il buffer predefinito è ", quindi dovresti farlo

o<C-R>"

Ho scoperto che uso <C-R>"molto spesso e lo lego a <C-F>nel mio vimrc:

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

2
Questo è fantastico perché mantiene il rientro corretto se la riga copiata non è stata rientrata.
CornSmith,

24

Questo utilizza ancora tre sequenze di tasti, ma lo trovo più facile di Esc:

o<Alt-p>

Dato che sei in modalità inserimento dopo aver premuto o, il modificatore Alt ti permetterà di usare un comando come se non lo fossi.


2
Abbastanza utile quando provi lo yank sth che tagli all'interno della linea con "d $" in una nuova linea
Serhat Cevikel,

Siamo spiacenti, ma questo non mantiene il rientro, ma incolla all'inizio della riga.
Michael Goldshteyn,

Qualcuno può elaborare questo metodo per mac (no alt)?
Li haonan,

@Lihaonan La tua domanda è da 8 mesi fa, si spera già visto stackoverflow.com/q/7501092/5407634
m_mlvx

12

Utilizzando questo plugin: https://github.com/tpope/vim-unimpaired

]ppaste sulla linea in basso

[ppaste sulla linea sopra

vantaggi:

  • funziona su tutto il testo strappato (parola, linea, carattere, ecc.)
  • rientra il testo incollato in modo che corrisponda al rientro del testo circostante
  • 2 battute invece di 3 e battute molto più "facili"
  • veloce

1
Anche il mio preferito. Potrebbe valere la pena ricordare che è necessario tpope/vim-unimpairedche questo funzioni 😉.
alextes,

1
ah l'ho installato così tanto tempo fa che me ne sono dimenticato. grazie del promemoria!
Crogers

9

Personalmente ho inserito Enter (CR) in questo modo:

nmap <CR> o<Esc>k

... basato su questo articolo di Vim Wikia.

In questo modo posso creare newline direttamente dalla modalità normale, e combinando questo con il voler incollare in una nuova riga qui sotto farei:

<CR>jp

Potresti anche saltare k nella nmap sopra, a seconda della funzionalità che preferisci da Enter , quindi sarebbe solo <CR>p.

Ho anche importato jj su Esc , il che aiuterebbe anche in questo caso. Esc è troppo lontano dalla fila di casa per quanto sia significativo in vim.

Non più corto delle altre soluzioni, ma penso che sia meno goffo di alcune di esse, e ha anche altri usi.


5

Se stai copiando un'intera linea e poi incollando un'intera linea, usa Yper strappare la linea o le linee, inclusa l'interruzione di linea, in primo luogo e pper incollare. Puoi anche usare V, che è la modalità linea visiva , in contrasto con vla modalità pianura per la vista.


3
Il problema è che a volte non vuoi semplicemente copiare un'intera riga ... Vorrei una soluzione che funzioni se ho copiato dieci righe o due parole.
static_rtti,

3

Ho una mappatura inoremap jj <ESC>. Così è facile da inserire nuova riga con ojje Ojjper poi p.

quindi ojjpincolla una nuova riga. ha ancora un colpo, o<esc>pma ojjpè facile per me.


2

Ho trovato una soluzione elegante a questo. Se stai inserendo il registro yank negli appunti del tuo sistema operativo (il che è comunque ottimo), con

set clipboard+=unnamed

di quanto tu possa fare o<Ctl-v>.

Oltre ad essere meno tratti, questo migliora su entrambi o<Esc>pe :puperché preserva il rientro: entrambe le altre opzioni ti iniziano con il carattere zero sulla nuova riga.

Un avvertimento è che ciò può dipendere dal sistema operativo o meno. Tutto quello che so è che funziona con la versione recente di OS X, ma gli Appunti sono solo uno dei molti modi per ottenere uno strattone negli Appunti del sistema operativo.


1

Se si desidera terminare anche in modalità inserimento, è possibile incollare mentre si è in modalità inserimento utilizzando CTRL-R ". https://stackoverflow.com/a/2861909/461834

Ancora tre sequenze di tasti, ma nessuna via di fuga, e si salva una sequenza di tasti se si desidera terminare in insert comunque.


1

Uso la seguente mappatura nella mia configurazione di Neovim:

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

Una piccola spiegazione:

  • m`: imposta un segno nella posizione corrente del cursore.
  • o<Esc>p: crea una nuova riga in basso e incolla il testo in questa riga
  • O<Esc>P: crea una nuova riga sopra e incolla il testo in questa riga
  • ``: posiziona il cursore nella posizione originale

Vedere :h markper ulteriori informazioni sui marchi in Vim.


1

Se vuoi rimanere nella modalità di inserimento, puoi farlo o ctrl+o p

  • o - inserire la modalità e passare alla nuova riga
  • ctrl+o - eseguire un singolo comando come in modalità normale
  • p - incolla

Sono tre le sequenze di tasti, ma rimani in modalità inserimento ed o ctrl+oè anche abbastanza veloce, quindi lo considero personalmente come sequenze di tasti 2,5.


0

Questa soluzione sembra applicarsi solo quando il blocco di testo copiato inizia su una nuova riga (anziché afferrare un frammento di testo da qualche parte all'interno di una riga), ma puoi sempre iniziare la tua copia sull'ultimo carattere che vuoi prendere, quindi navigare all'ultimo carattere alla fine della riga prima dell'inizio del blocco di copia desiderato. Quindi, quando si desidera incollarlo, posizionare il cursore alla fine della riga sotto la quale si desidera incollare il testo e premere p. Se non ho rovinato la spiegazione, questo dovrebbe fornire l'effetto che stai cercando.

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.