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.