Eliminar nueva línea en Vim


271

¿Hay alguna forma de eliminar la nueva línea al final de una línea en Vim, para que la siguiente línea se agregue a la línea actual?

Por ejemplo:

Evaluator<T>():
    _bestPos(){
}

Me gustaría poner todo esto en una línea sin copiar líneas y pegarlas en la anterior. Parece que debería poder colocar mi cursor al final de cada línea, presionar una tecla y hacer que la siguiente línea salte sobre la misma en la que está el cursor.

Resultado final:

Evaluator<T>(): _bestPos(){ }

¿Es esto posible en Vim?


Del al final de la línea en el modo de inserción de vim solía funcionar para mí. Sin embargo, no en todas las terminales.
— Victor Sergienko

Respuestas:


584

Si está en la primera línea, al presionar (mayúscula) Jse unirá esa línea y la siguiente, eliminando la nueva línea. También puede combinar esto con un conteo, por lo que al presionar 3Jse combinarán las 3 líneas.


29
Como se señaló en otra respuesta, gJevitará agregar espacios que Vim puede elegir agregar al usar J.
— Michael Mior

55
También puede seleccionar todas las líneas que desea unir usando V(Modo de línea visual) y luego presionar JogJ
— Sbu

Si desea mantener la posición del cursor, use :joiny :join!eso unirá líneas manteniendo la posición del cursor y no mantenga ningún espacio en el punto de unión. también puedes mapearlo como: nnoremap <Leader>j :joing<cr>y nnoremap <Leader>gj :join!<cr>.
— SergioAraujo

83

Ciertamente. Vim reconoce el carácter \ n como una nueva línea, por lo que puede buscar y reemplazar. En modo comando escriba:

:%s/\n/

1
Gracias, pero no quiero una búsqueda y reemplazo global.
— derekerdmann

16
eliminar el% se encarga de eso. Entonces solo sucederá en la línea en la que está el cursor. Alternativamente, puede especificar un rango como: 11,15s / \ n / (líneas 11-15) o:, + 7s / \ n / (esta línea y las siguientes siete) o: -3, s / \ n / (tres líneas anteriores y esta) ... tienes la idea
— Tristan

1
O puede seleccionar un Vbloque -isual y reemplazarlo.
— Victor Sergienko

51

Mientras estás en la línea superior en modo normal, presiona Shift+ j.

También puede anteponer un recuento, por lo que 3Jen la línea superior se unirían todas esas líneas.


34

Como se mencionó en otras respuestas, (mayúsculas) Jy buscar + reemplazar \npueden usarse generalmente para quitar caracteres de nueva línea y concatenar líneas.

Pero para deshacerse del carácter de nueva línea final en la última línea , debe hacer esto en Vim:

:set noendofline binary
:w

1
La pregunta es sobre la concatenación de dos líneas en el medio de un archivo: esta respuesta elimina la nueva línea al final del archivo, que no es lo que pregunté.
— derekerdmann

3
Esto funcionó para mí. Estaba tratando de deshacerme de una nueva línea al final de un archivo de una sola línea con vim.
— Locane

¿ :set noendoflinePor qué no funciona sin binary?
— darw

32

Jelimina el espacio inicial adicional (si lo hay), uniendo líneas con un solo espacio. (Con algunas excepciones: después /[.!?]$/, se pueden insertar dos espacios; antes /^\s*)/, no se insertan espacios).

Si no desea ese comportamiento, gJsimplemente elimina la nueva línea y no hace nada inteligente con espacios en absoluto.


10

Todo lo siguiente supone que su cursor está en la primera línea:

Usando mapeos normales:

3Shift+J

Usando comandos Ex:

:,+2j

Cuál es una abreviatura de

:.,.+2 join

Que también se puede ingresar mediante el siguiente acceso directo:

3:j

Un comando Ex aún más corto:

:j3

2
Sin espacios entre ellos:j!3
— SergioAraujo

10
set backspace=indent,eol,start

en su .vimrc le permitirá utilizar backspacey deleteen \n(salto de línea) en el modo de inserción.

set whichwrap+=<,>,h,l,[,]

le permitirá eliminar el LF anterior en modo normal con X(cuando está en la columna 1).


2

Probablemente depende de su configuración, pero generalmente hago esto con A<delete>

Donde Ase agrega al final de la línea. Probablemente requiere nocompatiblemodo :)


3
"Normalmente hago esto con A <delete>" Sí, por eso vine aquí; para encontrar una mejor manera;). El objetivo de vim no es mover las manos de la fila de inicio.
— Luc

2
<CURSOR>Evaluator<T>():
    _bestPos(){
}

cursor en primera línea

AHORA, en MODO NORMAL

shift+v
2j
shift+j

o

V2jJ

: normal V2jJ


1

Simplemente presionaría A (agregar al final de la línea, lo pone en modo de inserción) en la línea donde desea eliminar la nueva línea y luego presionar eliminar.


Lamentablemente, eso no parece funcionar para mí; podría ser una configuración de PuTTY que me he perdido.
— derekerdmann

2
probablemente la opción de retroceso vi::help 'backspace'
— glenn jackman

1

si no te importa usar otras herramientas de shell,

tr -d "\n" < file >t && mv -f t file

sed -i.bak -e :a -e 'N;s/\n//;ba' file

awk '{printf "%s",$0 }' file >t && mv -f t file

77
Eso es una exageración, ¿no te parece?
— derekerdmann

no, no es. ¿Por qué crees que es excesivo? Hacerlo dentro de Vim es manual. Depende de si desea hacerlo manualmente a mano cada vez, o simplemente ejecutar estos revestimientos para hacerlo en un santiamén. Vim es un editor. Y cualquier herramienta que pueda procesar archivos, son básicamente "editores" disfrazados.
— ghostdog74

55
Aún más fácil simplemente abrir el archivo en vim y usarlo ggVGJ.
— demasiado php

claro, si le resulta más fácil hacerlo a mano cada vez que necesita cambiar los datos de esa manera. Adelante. Además, intente hacerlo en un archivo grande.
— ghostdog74

No estoy procesando un montón de archivos; Solo estoy trabajando con la condensación de algunas líneas de código.
— derekerdmann

1

El problema es que se pueden acumular múltiples char 0A (\ n) que son invisibles. Suponga que desea limpiar desde la línea 100 hasta el final:

Escribiendo ESC y: (comandante de terminal)

:110,$s/^\n//

En un script vim:

execute '110,$s/^\n//'

Explicación: desde 110 hasta el final, busque líneas que comienzan con una nueva línea (están en blanco) y elimínelas

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.