Come unire le linee senza produrre uno spazio?


73

Il Jcomando standard per unire le linee sostituisce i caratteri di nuova riga con uno spazio. È utile quando si modifica la 'letteratura' ma può essere problematico se, per esempio, modifico manualmente una discarica esadecimale se dimentico di rimuovere lo spazio superfluo.

Esiste un metodo rapido e semplice per unire due linee senza produrre uno spazio tra loro?

Risposte:


87

La gJcombinazione fa questo; da :help gJ:

Unisci [conta] linee, con un minimo di due linee. Non inserire o rimuovere spazi.

Si potrebbe ricollegarlo a J, se si desidera salvare una sequenza di tasti:

:nnoremap J gJ

Nota che questo non rimuove nessuno spazio, quindi se la riga corrente termina con uno spazio o la riga successiva inizia con uno o più spazi, rimarranno così come sono .

Così:

Hello
    world

diventa:

Hello    world

Abbiamo potuto usare Jxin questo caso, allora sarà Helloworld, ma che non funziona in tutti i casi; dall'aiuto:

Unisci le linee evidenziate, con un minimo di due linee. Rimuovere il rientro e inserire fino a due spazi

[...]

Questi comandi, tranne "gJ", inseriscono uno spazio al posto di a meno che non vi sia spazio bianco finale o la riga successiva inizia con un ')'.

Quindi in alcuni casi viene inserito più di uno spazio o nessuno spazio. Per quanto posso vedere, non esiste un modo semplice per modificare questo comportamento; Ho creato una funzione da modificare gJper unire sempre senza spazi:

" Like gJ, but always remove spaces
fun! JoinSpaceless()
    execute 'normal gJ'

    " Character under cursor is whitespace?
    if matchstr(getline('.'), '\%' . col('.') . 'c.') =~ '\s'
        " When remove it!
        execute 'normal dw'
    endif
endfun

" Map it to a key
nnoremap <Leader>J :call JoinSpaceless()<CR>

Vedi anche: :help J,:help 'joinspaces'


È possibile utilizzare alcune funzioni "Conserva" per mantenere la posizione del cursore quando si usa questa funzione o come posso ottenere questo risultato?
SergioAraujo,

8

Un altro trucco che potresti provare è utilizzare Sostituisci. A volte questo potrebbe essere utile.

%s/$\n//g

Scenario: elimina l'ultimo carattere e unisciti alla riga successiva:

%s/=$\n\(.\)/\1/g

Per esempio,

xxxx=
123

diventa:

xxxx123

3

Crea una macro e riutilizzala:

qaJxq

Ora riproduci la macro, ausando @adove vuoi unire due linee senza spazio.

@@ripeterà la macro precedente. Quindi puoi semplicemente tenere premuto @per unire più linee.


1
Perché digitare @aquando è possibile digitare Jx? Stesso numero di tasti premuti e MAIUSC!
Shahbaz,

2
@Shahbaz Forse a causa dell'ultima riga: "puoi semplicemente tenere @"
muru

1
@muru, è vero!
Shahbaz,

4
Lo rende anche un comando ripetibile, quindi è possibile utilizzare 3@aper unire 3 linee, mentre facendo 3Jxsi unirebbero 3 linee con spazi e quindi si eliminerebbe lo spazio tra la seconda e la terza linea, lasciando spazi tra le altre linee.
Haegin,

1

Per unirti sempre con un unico spazio:

nmap J gJi <ESC>ciW <ESC>

Per unirti senza spazio (rimuove il trascinamento + spazio iniziale):

nmap <C-J> gJi <ESC>diW

1
Benvenuti in questo sito! Le tue mappature mi sembrano un po 'troppo ingegnerizzate, sarebbe utile se potessi aggiungere qualche spiegazione in più su come funzionano.
statox

1

Seleziona le linee che desideri unire, inserisci un comando Ex digitando i due punti :in modalità normale. Quindi digitare questo comando:

s/$\n\s*//gc

L'intero comando dovrebbe apparire allo stesso modo:

:'<,'>s/$\n\s*//gc

Questa è in realtà una versione ottimizzata del comando @ insidepower che sostituisce i rientri spaziali e i caratteri di nuova riga.

Spiegazione:

  • '<,'> significa che modifichiamo solo le linee selezionate in modalità visiva.

  • /$\n\s*è un modello regex . Stiamo cercando una partita che termina $con un nuovo carattere di linea \ne che successivamente abbia un numero non determinato di spazi bianchi *.

  • s/pattern//gcè un comando sostitutivo per trovare ogni modello e sostituirlo con un carattere vuoto alla conferma.

Per saperne di più sulle bandiere e sui metacaratteri per le espressioni regolari in Vim, dai un'occhiata a questo capitolo di Vim Reference.


2
Ciao ubique, benvenuto a Vi e Vim ! Hai una risposta abbastanza ben scritta lì; complimenti per quello. Il mio unico pazzo è che le espressioni regolari di Vim = / = le espressioni regolari di Python, e talvolta sono confuse per gli utenti. Magari un link al documento di aiuto per Vim regex invece?
D. Ben Knoble

2
Secondo punto: la risposta a cui fai riferimento è stata scritta da @ insidepower e modificata da Peter.
D. Ben Knoble
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.