Como excluir a linha acima / abaixo do cursor, mas não a linha atual?

11

Existe um comando para excluir a linha (ou n linhas) acima da atual? Acima = corrente não incluída.

Ou seja, existe uma alternativa para a dkqual não apaga a linha atual? Semelhante a como o/ Oe p/ Pfunciona, mas com exclusão.

Atualmente, estou fazendo kdd, que move o cursor uma linha e a apaga. Eu poderia fazer nnoremap <Leader>d kdde nnoremap <Leader>D jdd-, mas ter uma alternativa que não move o cursor parece ser uma opção melhor. Existe tal?

Martin Tóth
fonte
Se o seu problema é que seus mapeamentos movem o cursor, por que você não faz nnoremap <Leader>d kddje nnoremap <Leader>D jddk?
statox
Usando um kddjou ou jddk, a posição da coluna não é preservada. Não estou dizendo que é um grande problema, mas é irritante. Para o registro, kddjmove o cursor 1 linha abaixo da posição original. E jdd-parece ser uma alternativa melhor, jddkporque pelo menos estou retornando ao primeiro caractere de espaço não em branco. Se a linha abaixo da que eu quero excluir estiver vazia, fico no início da linha.
Martin Tóth
Que tal usar o makdd`a no seu mapa? Define uma marca e retorna a ela depois ... você pode alterá-la para um caractere menos usado.
precisa saber é o seguinte
@PhilippFrank Ou eu posso usar `` para recuperar o cursor e não ocupar um registro (não que eu use qualquer :)).
Martin Tóth
Não, isso não funciona, k não é um salto, então você não pode voltar usando ``.
precisa saber é o seguinte

Respostas:

30
:-d

corta a linha acima da linha atual.


:-5d

corta a quinta linha acima da linha atual (mas move o cursor).


:-5,-d

corta as 5 linhas acima da linha atual.


:+,+5d

corta as 5 linhas abaixo da linha atual.

romainl
fonte
2
Isso ainda move o cursor, no entanto.
precisa saber é o seguinte
1
Você não pode evitar mover o cursor. O melhor que você pode fazer é mover o cursor e movê-lo de volta .
Romainl
Obrigado! Esse tipo de "jeito vim" é o que eu estava procurando. Vou usar isso em combinação com `` para colocar o cursor de volta onde estava.
Martin Tóth
5

EDIT Eu não conhecia os recursos internos sugeridos por @Romainl em sua resposta: é claro que o método -de +ddeve ser preferido, pois é muito mais simples do que adicionar funções ao seu.vimrc

Talvez adicionar algo assim ao seu .vimrcpossa ser o que você deseja:

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

Essas funções excluem a linha abaixo ou a linha acima da atual e retornam à posição anterior à exclusão.

Para a função DeleteOver(), precisamos subir uma linha normal kapós a exclusão porque a exclusão altera o número da linha original que não aconteceu comDeleteUnder()

Você também pode adicionar isso ao seu .vimrc

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

Para criar os mapeamentos chamando as funções.

statox
fonte
Uma alternativa para salvar / restaurar a posição do cursor é desativar / restaurar a nostartoflineopção.
23318 Rich
5

Se usarmos o pequeno registro de exclusão "-, podemos restaurar a posição do cursor após excluir acima de n linhas.

Por exemplo, d0dgk"-Pexclui acima de 1 linha e restaura o cursor de volta onde estava.

  1. d0exclui caracteres do cursor para o primeiro caractere da linha. Como 0é um movimento exclusivo, o caractere sob o cursor não é excluído. E os caracteres excluídos são colocados no pequeno registro de exclusão "-.

  2. dgkexclui acima de 1 linha. Isso deixará a linha atual, porque gknão é linear e exclusiva.

  3. "-P coloca o texto do pequeno registro de exclusão "-.

É uma espécie de hack. Mas se você estiver procurando por comandos não-ex, considere usá-lo.

MS.Kim
fonte
Ótima solução! Embora eu acho que você "-Pnão quer "-p. O último atrapalha um pouco o texto.
James
@DJMcMayhem Você está certo. Eu corrigi a resposta. Obrigado por apontar.
MS.Kim
2

Talvez você melhore o seu fluxo de trabalho se não tiver medo de ... pular :)

Exemplo:

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.

Suas ações (modo normal, o cursor está no _): /I want Enter 5dd Ctrl-o. É isso aí.

Obviamente, a resposta romana é a melhor, se tudo o que você deseja excluir linhas inteiras, e você pode contar seu deslocamento facilmente (usando números de roupa relativos, por exemplo). A descrição acima é uma maneira mais genérica de "agir": vá lá, usando algo que conta como um salto: isso significa que você sempre pode voltar atrás depois de modificar o texto.

Por exemplo, se você usar números de linha absolutos, poderá substituí-lo /I want Enterpor algo como 78ggou 78Gpular diretamente para esse número de linha.

VanLaser
fonte
0

Com base na solução ms-kim , desenvolvi uma variação ligeiramente diferente que salva a posição da coluna.

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: Eu também usei este post como referência.

SergioAraujo
fonte
Você quer dizer @statox em vez de @ MS.Kim?
Ricos
-1

Se você deseja excluir linhas duplicadas em todo o arquivo, faça o seguinte:

:g/any part of the string/d

Exemplo:

No modo de comando

:g/I want to delete/d

Se você deseja apenas uma lista de string (s) inicialmente:

:g/I want to delete/p
user11509
fonte
3
Não tenho muita certeza de como isso responde à pergunta feita.
Martin Tournoij 23/02