Jak usunąć linię powyżej / poniżej kursora, ale nie bieżącą?

11

Czy istnieje polecenie usuwania linii (lub n linii) powyżej bieżącej? Powyżej = prąd nie jest uwzględniony.

Tj. Czy istnieje alternatywa, dkktóra nie usuwa bieżącej linii? Podobne do sposobu działania o/ Oi p/ P, ale z usunięciem.

Obecnie robię kdd, który przesuwa kursor o jedną linię w górę i usuwa go. Mogłem zrobić nnoremap <Leader>d kddi nnoremap <Leader>D jdd-, ale mając alternatywę, która nie porusza się kursor wydaje się lepszym rozwiązaniem. Czy jest taki

Martin Tóth
źródło
Jeśli twoim problemem jest to, że twoje mapowania poruszają kursorem, dlaczego tego nie robisz nnoremap <Leader>d kddji nnoremap <Leader>D jddk?
statox
Użycie albo kddjlub jddk, pozycja kolumny nie jest zachowana. Nie mówię, że to duży problem, ale to denerwujące. Dla zapisu kddjprzesuwa kursor o 1 linię poniżej pierwotnej pozycji. I jdd-wydaje się lepszą alternatywą dla, jddkponieważ przynajmniej powracam do pierwszej postaci niebiałej spacji. Jeśli linia poniżej linii, którą chcę usunąć, jest pusta, zostaję na początku linii.
Martin Tóth,
Co powiesz na użycie makdd`a do mapy? Ustawia znak i wraca do niego później ... możesz jednak zmienić go na rzadziej używaną postać.
PhilippFrank
@PhilippFrank Lub mogę użyć ``, aby odzyskać kursor i nie zajmować rejestru (nie żebym go używał :)).
Martin Tóth,
Nie, to nie działa, k nie jest skokiem, więc nie możesz wrócić używając ``.
PhilippFrank,

Odpowiedzi:

30
:-d

przecina linię powyżej bieżącej linii.


:-5d

przecina 5 linię powyżej bieżącej linii (ale przesuwa kursor).


:-5,-d

tnie 5 linii powyżej bieżącej linii.


:+,+5d

tnie 5 linii poniżej bieżącej linii.

romainl
źródło
2
To jednak wciąż porusza kursorem.
PhilippFrank,
1
Nie można uniknąć poruszania kursorem. Najlepsze, co możesz zrobić, to przesunąć kursor i cofnąć go .
romainl,
Dziękuję Ci! Tego rodzaju „vim way” szukałem. Użyję tego w połączeniu z ``, aby przywrócić kursor tam, gdzie był.
Martin Tóth,
6

Jeśli użyjemy małego rejestru usuwania ”- możemy przywrócić pozycję kursora po usunięciu powyżej n wierszy.

Na przykład d0dgk"-Pusuwa powyżej 1 linii i przywraca kursor tam, gdzie był.

  1. d0usuwa znaki z kursora do pierwszego znaku linii. Ponieważ 0jest to ruch wyłączny, znak pod kursorem nie jest usuwany. Usunięte znaki są umieszczane w małym rejestrze „-.

  2. dgkusuwa powyżej 1 linii. Spowoduje to opuszczenie bieżącej linii, ponieważ gknie jest liniowe i wyłączne.

  3. "-P wstawia tekst z małego rejestru usuwania "-.

To rodzaj włamania. Ale jeśli szukasz poleceń innych niż ex, rozważ użycie go.

MS.Kim
źródło
Fajne rozwiązanie! Chociaż myślę, że chcesz "-Pnie "-p. Ten ostatni trochę popsuje tekst.
James
@DJMcMayhem Masz rację. Poprawiłem odpowiedź. Dziękuję za zwrócenie na to uwagi.
MS.Kim
5

EDYCJA Nie znałem wbudowanych funkcji sugerowanych przez @Romainl w jego odpowiedzi: oczywiście należy wybrać metodę -di, +dponieważ jest to o wiele prostsze niż dodawanie funkcji do twojego.vimrc

Może dodanie czegoś takiego do twojego .vimrcmoże być tym, czego chcesz:

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

Funkcje te usuwają linię pod lub linię nad bieżącą i wracają do pozycji przed usunięciem.

Do funkcji DeleteOver()musimy przejść o jedną linię w górę normal kpo usunięciu, ponieważ usunięcie zmienia numer oryginalnej linii, co się nie dziejeDeleteUnder()

Możesz także dodać to do swojego .vimrc

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

Aby utworzyć odwzorowania wywołujące funkcje.

statox
źródło
Alternatywą dla zapisywania / przywracania pozycji kursora jest rozbrojenie / przywrócenie nostartoflineopcji.
Bogaty
2

Być może poprawisz przepływ pracy, jeśli nie boisz się ... skoczyć :)

Przykład:

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.

Twoje działania (tryb normalny, kursor znajduje się _) /I want Enter 5dd Ctrl-o. Otóż ​​to.

Oczywiście odpowiedź romainl jest najlepsza, jeśli wszystko, co chcesz usunąć całe linie, i możesz łatwo policzyć ich przesunięcie (na przykład używając względnych numerów bielizny). Powyżej jest bardziej ogólny sposób „działania”: idź tam, używając czegoś, co liczy się jako skok: oznacza to, że zawsze możesz skoczyć do tyłu, po zmodyfikowaniu tekstu.

Na przykład, jeśli używasz bezwzględnych numerów linii, możesz zamienić na /I want Entercoś podobnego 78gglub 78Gprzeskoczyć bezpośrednio na ten numer linii.

VanLaser
źródło
0

W oparciu o rozwiązanie ms-kim opracowałem nieco inną odmianę, która oszczędza pozycję.

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: Użyłem również tego postu jako odniesienia.

SergioAraujo
źródło
Masz na myśli @statox zamiast @ MS.Kim?
Bogaty
-1

Jeśli chcesz usunąć zduplikowane linie w całym pliku, wykonaj następujące czynności:

:g/any part of the string/d

Przykład:

W trybie komend

:g/I want to delete/d

Jeśli chcesz początkowo listę ciągów znaków:

:g/I want to delete/p
użytkownik11509
źródło
3
Nie jestem pewien, jak to odpowiada na zadane pytanie?
Martin Tournoij