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?

Derekerdmann
fuente
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.

Xhantar
fuente
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/
TinkerTank
fuente
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.

Caimán
fuente
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
Néstor Waldyd
fuente
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.

efímero
fuente
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
kzh
fuente
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).

laktak
fuente
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 :)

Wolph
fuente
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

Ivan Lopes
fuente
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.

David Watson
fuente
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
ghostdog74
fuente
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

Sergio Abreu
fuente