¿Cómo eliminar la línea encima / debajo del cursor, pero no la línea actual?

11

¿Hay un comando para eliminar la línea (o n líneas) sobre la actual? Arriba = corriente no incluida.

Es decir, ¿hay una alternativa a la dkcual no se elimina la línea actual? Similar a cómo o/ Oy p/ Pfunciona, pero con eliminación.

Actualmente, lo estoy haciendo kdd, lo que mueve el cursor una línea hacia arriba y lo elimina. Podría hacerlo nnoremap <Leader>d kddy nnoremap <Leader>D jdd-, pero tener una alternativa que no mueve el cursor parece una mejor opción. ¿Hay tal?

Martin Tóth
fuente
Si su problema es que sus asignaciones mueven el cursor, ¿por qué no lo hace nnoremap <Leader>d kddjy nnoremap <Leader>D jddk?
statox
Usando kddjo jddk, la posición de la columna no se conserva. No digo que sea un gran problema, pero es molesto. Para el registro, kddjmueve el cursor 1 línea debajo de la posición original. Y jdd-parece una alternativa mejor jddkporque al menos estoy volviendo al primer personaje que no es un espacio en blanco. Si la línea debajo de la que quiero eliminar está vacía, me quedo al comienzo de la línea.
Martin Tóth
¿Qué tal usar makdd`a para tu mapa? Establece una marca y vuelve a ella después ... aunque es posible que desee cambiarla a un carácter menos usado.
PhilippFrank
@PhilippFrank O puedo usar `` para recuperar el cursor y no ocupar un registro (no es que use ninguno :)).
Martin Tóth
No, eso no funciona, k no es un salto, por lo que no puede volver con ``.
PhilippFrank

Respuestas:

30
:-d

corta la línea sobre la línea actual.


:-5d

corta la quinta línea sobre la línea actual (pero mueve el cursor).


:-5,-d

corta las 5 líneas sobre la línea actual.


:+,+5d

corta las 5 líneas debajo de la línea actual.

romainl
fuente
2
Sin embargo, eso todavía mueve el cursor.
PhilippFrank
1
No puedes evitar mover el cursor. Lo mejor que puede hacer es mover el cursor y moverlo hacia atrás .
romainl
¡Gracias! Este tipo de "vim way" es lo que estaba buscando. Voy a usar esto en combinación con `` para volver a colocar el cursor donde estaba.
Martin Tóth
5

EDITAR No conocía las funciones integradas sugeridas por @Romainl en su respuesta: por supuesto, el método -dy +ddebería preferirse ya que es mucho más simple que agregar funciones a su.vimrc

Tal vez agregar algo como eso .vimrcpodría ser lo que quieres:

function! DeleteOver()
   let save_cursor = getpos(".")
   normal k
   normal dd
   call setpos(".", save_cursor)
   normal k
endfunction

function! DeleteUnder()
   let save_cursor = getpos(".")
   normal j
   normal dd
   call setpos(".", save_cursor)
endfunction

Estas funciones eliminan la línea debajo o la línea sobre la actual y vuelven a la posición anterior a la eliminación.

Para la función DeleteOver()necesitamos subir una línea normal kdespués de la eliminación porque la eliminación cambia el número de la línea original que no sucede conDeleteUnder()

También puede agregar esto a su .vimrc

nnoremap <Leader>d :call DeleteOver()<CR>
nnoremap <Leader>D :call DeleteUnder()<CR>

Para crear las asignaciones llamando a las funciones.

statox
fuente
Una alternativa para guardar / restaurar la posición del cursor es desactivar / restaurar la nostartoflineopción.
Rich
5

Si utilizamos el pequeño registro de eliminación "-, podemos restaurar la posición del cursor después de eliminar las n líneas anteriores.

Por ejemplo, d0dgk"-Pelimina la línea superior a 1 y restaura el cursor donde estaba.

  1. d0elimina caracteres del cursor al primer carácter de la línea. Como 0es un movimiento exclusivo, el carácter debajo del cursor no se elimina. Y los caracteres eliminados se colocan en el pequeño registro de eliminación "-.

  2. dgkelimina por encima de 1 línea. Esto dejará la línea actual, porque gkno es lineal y exclusiva.

  3. "-P pone el texto del pequeño registro de eliminación "-.

Es una especie de pirateo. Pero si está buscando comandos que no sean ex, considere usarlo.

MS.Kim
fuente
Buena solución! Aunque creo que "-Pno quieres "-p. Este último desordena el texto un poco.
James
@DJMcMayhem Tienes razón. Corrija la respuesta. Gracias por señalarlo.
MS.Kim
2

Tal vez mejorarás tu flujo de trabajo si no temes ... saltar :)

Ejemplo:

This is where cursor initially is: _.

[Some other stuff you want to keep/skip ...]

I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.
I want to delete these lines.

Sus acciones (modo normal, el cursor está en _): /I want Enter 5dd Ctrl-o. Eso es.

Por supuesto, la respuesta romana es la mejor si todo lo que desea es eliminar líneas enteras, y puede contar su desplazamiento fácilmente (usando números de lino relativos, por ejemplo). Lo anterior es una forma más genérica de "actuar": vaya allí, usando algo que cuente como un salto: esto significa que siempre puede saltar hacia atrás, después de modificar el texto.

Por ejemplo, si usa números de línea absolutos, puede reemplazarlos /I want Entercon algo como 78ggo 78Gsaltar directamente a ese número de línea.

VanLaser
fuente
0

Basado en la solución ms-kim , he desarrollado una variación ligeramente diferente que ahorra colisión.

function! DeleteLineAbove()
    if line('.') == 1
        echom "You are at the first line!"
        return
    endif
    let l:colsave = col(".")
    exec  "normal! kdd"
    call cursor(line("."), l:colsave)
endfunction
nnoremap <Leader>k :call DeleteLineAbove()<CR>

OBS: También he usado esta publicación como referencia.

SergioAraujo
fuente
¿Te refieres a @statox en lugar de @ MS.Kim?
Rico
-1

Si desea eliminar líneas duplicadas en todo el archivo, simplemente haga lo siguiente:

:g/any part of the string/d

Ejemplo:

En modo comando

:g/I want to delete/d

Si solo desea una lista de las cadenas inicialmente:

:g/I want to delete/p
usuario11509
fuente
3
No estoy realmente seguro de cómo responde esto a la pregunta formulada.
Martin Tournoij