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


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.


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.


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.


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.


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.


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

3
Nie jestem pewien, jak to odpowiada na zadane pytanie?
— Martin Tournoij
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.