¿Cómo unir líneas sin producir un espacio?

73

El Jcomando estándar para unir líneas reemplaza los caracteres de nueva línea con un espacio. Es útil al editar 'literatura', pero puede ser problemático si, por ejemplo, edito un volcado hexadecimal a mano si olvido eliminar el espacio superfluo.

¿Existe un método rápido y fácil para unir dos líneas sin producir un espacio entre ellas?

SF.
fuente

Respuestas:

87

La gJcombinación hace esto; de :help gJ:

Unir [recuento] líneas, con un mínimo de dos líneas. No inserte ni elimine espacios.

Puede volver a vincularlo J, si desea guardar una pulsación de tecla:

:nnoremap J gJ

Tenga en cuenta que esto no elimina ningún espacio, por lo que si la línea actual termina con un espacio o la siguiente línea comienza con uno o más espacios, se dejarán como están .

Entonces:

Hello
    world

Se convierte en:

Hello    world

Nosotros podríamos usar Jxen este caso, entonces será Helloworld, pero que no funciona en todos los casos; de la ayuda:

Une las líneas resaltadas, con un mínimo de dos líneas. Elimine la sangría e inserte hasta dos espacios

[...]

Estos comandos, excepto "gJ", insertan un espacio en lugar del a menos que haya un espacio en blanco al final o la siguiente línea comienza con un ')'.

Entonces, en algunos casos, se inserta más de un espacio o ningún espacio. Hasta donde puedo ver, no hay una manera fácil de cambiar este comportamiento; Creé una función para modificar gJpara unir siempre sin espacios:

" 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>

Ver también: :help J,:help 'joinspaces'

Martin Tournoij
fuente
¿Es posible usar alguna función "Preservar" para mantener la posición del cursor al usar esta función o cómo obtengo este resultado?
SergioAraujo
8

Otro truco que puedes probar es usar reemplazar. A veces esto puede ser útil.

%s/$\n//g

Escenario: Eliminar el último personaje y unirse con la siguiente línea:

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

Por ejemplo,

xxxx=
123

se convierte en:

xxxx123
poder interno
fuente
3

Crea una macro y reutilízala:

qaJxq

Ahora reproduzca la macro, autilizando @adonde quiera unir dos líneas sin espacio.

@@repetirá la macro anterior. Por lo tanto, puede mantener presionado @para unir varias líneas.

pelucida
fuente
1
¿Por qué escribir @acuando puedes escribir Jx? ¡El mismo número de pulsaciones de teclas y SHIFT!
Shahbaz
2
@Shahbaz Tal vez debido a la última línea: "puedes sostener @"
muru
1
@muru, eso es cierto!
Shahbaz
44
También lo convierte en un comando repetible, por lo que puede usarlo 3@apara unir 3 líneas, mientras que hacerlo 3Jxuniría 3 líneas con espacios y luego eliminaría el espacio entre las líneas segunda y tercera, dejando espacios entre las otras líneas.
Haegin
1

Para unirse siempre con un solo espacio:

nmap J gJi <ESC>ciW <ESC>

Para unirse sin espacio en absoluto (elimina el espacio final + inicial):

nmap <C-J> gJi <ESC>diW
phil
fuente
1
Bienvenido a este sitio! Sus mapeos se ven un poco sobredimensionados para mí, sería útil si pudiera agregar un poco más de explicaciones sobre cómo funcionan.
Statox
1

Seleccione las líneas que desea fusionar, ingrese un comando Ex escribiendo dos puntos :en modo normal. Luego escriba este comando:

s/$\n\s*//gc

El comando completo debería tener el mismo aspecto:

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

Esta es en realidad una versión modificada del comando @ insidepower que reemplaza las sangrías espaciales, así como los caracteres de nueva línea.

Explicación:

  • '<,'> significa que modificamos solo las líneas seleccionadas en modo visual.

  • /$\n\s*Es un patrón de expresiones regulares . Estamos buscando una coincidencia que termine $con un nuevo carácter de línea \ny que tenga un número no determinado de espacios en blanco a *partir de entonces.

  • s/pattern//gces un comando sustituto para encontrar cada patrón y reemplazarlo con un carácter vacío en la confirmación.

Para descubrir más sobre banderas y metacaracteres para expresiones regulares en Vim, eche un vistazo a este capítulo de Vim Reference.

ubique
fuente
2
Hola ubique, bienvenido a Vi y Vim ! Tienes una respuesta bastante bien escrita allí; felicitaciones por eso. Mi único inconveniente es que vim expresiones regulares = / = expresiones regulares de python, y a veces eso es confuso para los usuarios. ¿Quizás un enlace al documento de ayuda para Vim regex en su lugar?
D. Ben Knoble
2
Segundo punto: la respuesta a la que hace referencia fue escrita por @ insidepower y editada por Peter.
D. Ben Knoble