Come inserisco un'interruzione di riga dove si trova il cursore senza entrare in modalità di inserimento in Vim?


89

È possibile inserire un'interruzione di riga dove si trova il cursore in Vim senza entrare in modalità di inserimento? Ecco un esempio ( [x]significa che il cursore è acceso x):

if (some_condition) {[ ]return; }

Di tanto in tanto, potrei voler inserire altro codice. Quindi premere iper entrare in modalità di inserimento, premere Enterper inserire l'interruzione di riga e quindi eliminare lo spazio extra. Successivamente, entrerei in modalità normale e posizionerei il cursore prima della parentesi graffa di chiusura e quindi farei la stessa cosa per posizionarlo su una riga separata.

Lo faccio da un po ', ma c'è sicuramente un modo migliore per farlo?


Vuoi inserire qualcosa senza entrare in modalità INSERT?
Jeremy Cantrell

26
@ jeremy-cantrell Sì, proprio come "J" si unisce alla riga successiva e inserisce uno spazio bianco senza entrare in modalità INSERT!
awendt

Risposte:


108

Per l'esempio che hai fornito, potresti usare rEnterper sostituire un singolo carattere (lo spazio) con Invio. Poi,fspace. per passare allo spazio successivo e ripetere l'ultimo comando.

A seconda delle impostazioni di rientro automatico, quanto sopra può o meno indentare correttamente l'istruzione di ritorno. In caso contrario, utilizzare sEnterTabEscinvece per sostituire lo spazio con una nuova riga, far rientrare la riga e uscire dalla modalità di inserimento. Dovresti sostituire il secondo spazio con un comando diverso in modo da non poter usare "." in questo caso.


1
Penso che questa sia la soluzione più semplice. Grazie Greg.
Mark A. Nicolosi

4
'f [spazio]' dovrebbe essere equivalente a 'W' (cioè spostarsi sul prossimo spazio bianco)
Nathan Fellman

4
"W" si sposta di un carattere troppo lontano, si sposta al carattere successivo dopo lo spazio vuoto successivo.
Greg Hewgill,

1
Puoi anche usare >>e <<per aiutare il rientro se non vuoi entrare in modalità di inserimento con s.
Conner

12

Ecco come creare una macro che inserisca una nuova riga in corrispondenza del cursore ogni volta che premi "g" mentre non sei in modalità di inserimento:

Da vim, digita:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

Dove:

  • [Ctrl + V] significa tenere premuto il tasto Ctrl e premere "v"
  • [Invio] significa premere il tasto Invio
  • [Esc] significa premere il tasto Esc

Vedrai quanto segue nella parte inferiore della finestra di vim fino a quando non premi il tasto Invio finale:

:map g i^M^[

Spiegazione:

[Ctrl + V] significa "cita il seguente carattere" - ti permette di incorporare la nuova riga e caratteri di escape nel comando.

Quindi stai mappando il tasto "g" alla sequenza:

i [Invio] [Escape]

Questo è vim per inserire una nuova riga prima del cursore, quindi uscire dalla modalità di inserimento .

Ritocchi:

  • Puoi sostituire la "g" con qualsiasi carattere che non sia già collegato a un comando che utilizzi.
  • Aggiungere di più per il comando, per esempio f}i^M^[O - Questo f ind la } e ho NSERT un'altra nuova linea, poi fuggire dalla modalità di inserimento e O penna una riga vuota per l'inserimento di più di codice.
  • Puoi aggiungere il comando al tuo file .vimrc o .exrc per renderlo permanente. Basta omettere i due punti dall'inizio, quindi il comando inizia con "mappa"

Godere!


Hai risposto alla domanda formulata male nell'oggetto, invece che a quella nel distacco. Quello che vuole sapere è come sbarazzarsi facilmente dello spazio bianco che era nel punto in cui la linea è stata interrotta ma non serve più a uno scopo.
Aristotele Pagaltzis

Grazie. Aggiornata la sezione "Tweaks" per realizzare ciò (credo) richiesto dall'autore. Quando l'ho testato, vi ha rimosso automaticamente gli spazi extra per me; usa 'x' per eliminarli se il tuo non lo fa. E perché i comandi vi sembrano disturbi della linea del modem? :-)
Adam Liss

11

Una semplice mappatura per interrompere la linea in corrispondenza del cursore premendo Ctrl + Invio:

:nmap <c-cr> i<cr><Esc>

essenzialmente entra in modalità "inserimento", inserisce un'interruzione di riga e torna alla modalità normale.

inseriscilo nel tuo file .vimrc per un utilizzo futuro.


5

Se di solito espandi un blocco di una riga a tre righe, prova la sostituzione. Cambia la staffa di apertura in staffa / ritorno e la staffa di chiusura in ritorno / staffa.

Il comando per sostituire parentesi / ritorno con parentesi ha il seguente aspetto:

:s/{/{\r/

Poiché si desidera utilizzarlo spesso, è possibile mappare l'intera sequenza a una sequenza di tasti inutilizzata come questa:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

Dove vedi ^ M nella sequenza, digita [Ctrl-V] , quindi premi Invio .

Ora con il cursore in un punto qualsiasi della linea di esempio, premere il tasto mappato e vengono aggiunti i ritorni a capo.

Verificare i :help map-which-keysconsigli sulla selezione delle sequenze di tasti non utilizzate da mappare.


BTW: gnon è mappato perché è usato come chiave 'namespace' per molte mappature vim costituite da due sequenze di tasti (vedere :h g). Quindi questa mappatura è in realtà un divieto.
Hotschke

Esiste un buon comando che segnala che gè già in uso come chiave "spazio dei nomi"?
Slothbear

Non in particolare. Come ho detto :help gè un modo per vedere un elenco di gmappature predefinite + qualcosa. z, [ ]sono ulteriori chiavi dello "spazio dei nomi", vedere ad es :help index. Puoi invocare :verbose map gper vedere tutte le mappature definite correnti che iniziano con g. Risorse web utili sono viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (diapositive: speakerdeck.com/nelstrom/follow-my -leader )
Hotschke

3

Supponendo che tu stia bene con la mappatura Ksu qualcos'altro (scegli una chiave diversa di tuo gradimento) e l'uso del marker 'come marker temporaneo va bene, perché non farlo?

:nmap K m'a<CR><Esc>`'

ora premendo K in modalità normale sul carattere dopo il quale si desidera che si verifichi l'interruzione di riga, si dividerà la riga e si lascerà il cursore dov'era.


1

Vim ucciderà automaticamente qualsiasi spazio bianco a destra del cursore se interrompi una riga in due mentre autoindent(o qualsiasi altro aiuto per l'indentazione) è abilitato.

Se non si desidera utilizzare una di queste impostazioni, utilizzare sinvece di iper s ubstitute il nuovo testo per il bianco e non solo l'inserimento. (Se sono presenti più spazi vuoti, posizionare il cursore sull'estrema sinistra e utilizzare cwinvece.)


1

Fondamentalmente, quando dividi una riga vuoi semplicemente inserire un ritorno a capo, o nel caso in cui ti trovi su uno spazio, sostituiscilo con un ritorno a capo. Ebbene, perché accontentarsi dell'uno o dell'altro? Ecco la mia mappatura per K:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

Uso l'operatore ternario per condensare le due azioni in una mappa chiave. Scomponendola, <expr>significa che l'output della mappa dei tasti può essere dinamico e in questo caso dipende dalla condizione getline('.')[col('.')-1]==' 'che è il modo prolisso per chiedere a vim se il carattere sotto il cursore è uno spazio. Infine, il familiare operatore ternario ? :sostituisce lo spazio con linebreak ( r<CR>) o ne inserisce uno nuovo (i<CR><Esc> )

Ora hai una bella mappa chiave sorella per il Jcomando.


Questo è abbastanza lucido. Non sono sicuro di aver mai usato intenzionalmente K, ma per questo potrebbe valere la pena sbarazzarsi o rimappare altrove.
dragon788

0

Imposta questa mappatura dei tasti nel tuo vimrc

:map <C-m> i<CR><Esc>h

Quindi premi Ctrl + m se vuoi usarlo nel tuo vim.


0

IMHO, la mappatura incorporata gsnon è una mappatura utile (mettere vim a dormire), si potrebbe usarla per la divisione:

nmap gs i<CR><ESC>

0

In Vrapper puoi usare gql che dividerà una riga senza entrare in modalità di inserimento, ma potrebbe non mantenere sempre il rientro.


0

Infatti sono necessarie le seguenti operazioni combinate:

  1. stampa v per accedere alla modalità visiva
  2. Seleziona la linea che desideri dividere
  3. Premere :per accedere alla modalità di comando
  4. s/\s/\r/g
  5. Fatto

0

Se hai l'input:

aaa bbb ccc ddd

e vuoi produrre

aaa
bbb
ccc
ddd

Puoi usare il comando

f r<ENTER>;.;.

0

Ho trovato che questa è l'implementazione più fedele di ciò che mi sarei aspettato dal comportamento opposto J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

Esegue la semplicistica nuova riga in corrispondenza del cursore, si prende cura di qualsiasi spazio bianco finale sulla riga precedente se ce ne sono presenti e quindi riporta il cursore nella posizione corretta.

i <cr> <esc> - questa è una delle soluzioni suggerite più comuni, non elimina i caratteri non spazi sotto il cursore ma ti lascia anche con spazi vuoti finali

^mw - vai all'inizio di una nuova riga e crea un segno sotto w

gk - salire di una riga

:silent! s/\v +$//<cr> - regex sostituisce qualsiasi spazio bianco alla fine della riga

:noh<cr> - Cancella qualsiasi ricerca evidenziando che la regex potrebbe essere stata attivata

`w - rimettere il segno sotto w

Combina essenzialmente il meglio di entrambi r<esc><cr>ei<cr><esc>

Nota: ho questo limite a Scui potenzialmente sovrascrive una chiave utile, ma è un sinonimo di cce poiché non lo uso tutte le volte che faccio le divisioni, sono d'accordo con la sovrascrittura.



-1

Questa mappatura interromperà qualsiasi funzione di una riga che hai. Posiziona semplicemente il cursore sulla riga e premi "g" in modalità normale:

:map g ^f{malr<CR>`a%hr<CR>`a

Ciò presuppone che abbiate uno spazio dopo la parentesi graffa di apertura e uno spazio prima della parentesi graffa di chiusura. Vedi se va bene per te.

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.