Jak usunąć zawartość wstecz, aż do „=” w poprzednim wierszu?

9

Korzystam z przykładu kodu javascript:

1        var a = 1;
2        var b = |{};

Kursor znajduje się w pozycji |(na znaku „{”, gdy kształt kursora jest blokowy), dowiaduję się, że chcę, aaby obiekt został przypisany, więc chcę go zmodyfikować jak poniżej:

1        var a = {};

Chcę więc wiedzieć, kiedy kursor znajduje się na „{”, jak szybko usunąć całą zawartość przed „{”, aż będzie pusty po znaku „=” w wierszu 1?

W innych normalnych edytorach po prostu naciskam klawisz Backspace, aby usunąć kod. Ale nie wiem, jak to osiągnąć w vimie.

Aaron Shen
źródło
możesz także nacisnąć ii użyć klawisza Backspace. Żadne ciało cię do tego nie zastrzeli. Myślę.
elyashiv
1
ale backspace nie usunie znaku powyżej linii
Aaron Shen
3
@AaronShen To zależy od twojego ustawienia „backspace”. Jeśli zawiera ona eolnastępnie Backspace będzie usuwać podziały wiersza. Będziesz także musiał startzostać uwzględniony w ustawieniu. (Patrz :help backspace). Nie używaj tej metody! Istnieje kilka znacznie szybszych metod opisanych szczegółowo w odpowiedziach poniżej.
Bogaty

Odpowiedzi:

20

Nie jestem pewien, czy całkowicie rozumiem pytanie, ale jeśli chcesz usunąć, dopóki nie masz var a = {};, możesz z pozycji kursora użyćd?1Enter

dwykonuje ruch i można nadać mu wzorzec wyszukiwania dla wyszukiwania /do przodu lub wyszukiwania ?do tyłu.

Oto mały gif, który to pokazuje:

wprowadź opis zdjęcia tutaj

akshay
źródło
1
Prawdopodobnie warto wspomnieć, że musisz Enterpisać po wpisaniu d?1.
Bogaty
@ Bogu, dzięki, zaktualizowałem odpowiedź, aby to uwzględnić.
akshay,
1
Jakiej czcionki używa ta powłoka?
Chris Burt-Brown
@ ChrisBurt-Brown: Terminus
akshay
10

Jeśli używasz vima (a nie klasycznego vi), to w twoim przykładzie możesz zrobić vkd(lub vkx).

  • v przełączy go w tryb „wizualny” (wybierz)
  • k przejdzie w górę o jeden wiersz, aby umieścić kursor na „1”, wybierając część, którą chcesz usunąć
  • dlub xusunie zaznaczenie
BobH
źródło
5

Usuń w górę

W tym konkretnym przykładzie dgkjest to jeden z najszybszych sposobów, aby to zrobić.

Po dpoleceniu, jak wyjaśnił Akshay , może następować ruch, usuwając wszystkie znaki między początkiem kursora a kierunkiem ruchu.

W swoim kodzie chcesz usunąć wszystko między pozycją kursora a tą samą kolumną o jeden rząd dalej, więc przesunięcie kursora w górę gkruchem (który w przypadku użycia z operatorem nie jest liniowy) osiągnie twój cel.

EDYCJA: BobH wskazuje w komentarzach, że ta metoda działa tylko wtedy, gdy 'wrap'jest ustawiona. Jako taki, chyba że zawsze masz ustawiony pakiet zawijania, prawdopodobnie lepiej jest użyć dvklub vkd, jak sugerują inne odpowiedzi na tej stronie.

Usuń słowa wstecz

Możesz także użyć: d5blub d4B, który usunie odpowiednio 5 słów lub 4 SŁOWA do tyłu. ( 1;to jedno SŁOWO, ale dwa zwykłe słowa).

Bogaty
źródło
dlaczego dk całkowicie usunie zarówno bieżącą linię, jak i linię powyżej
Aaron Shen
@AaronShen Nope. Spróbuj.
Bogaty
1
@Rich, jeśli to działa, masz ustawienie, które umożliwia ruch usuwania. Właśnie go przetestowałem vim -u NONE -U NONEi usuwa obie linie.
Vitor
@Vitor Masz rację. Próbuję teraz ustalić, które ustawienie to robi.
Bogaty
1
BTW okazuje się, że używa gktak, jak wymaga tego pozornie :set wrap(nieco tajemniczo). Nie mogłem zrozumieć, dlaczego to pozornie działało dla wszystkich innych, ale nie dla mnie, skoro pomoc gkrównież wydawała się sugerować, że powinna działać. Jedyną wskazówką było to, że główne znaczenie gkmiało związek z owiniętymi liniami. Kiedyś próbowałem ustawić wrap na (coś w rodzaju kaprysu), voila, zadziałało.
BobH
1

Nie mogę jeszcze komentować, więc muszę udzielić nowej odpowiedzi. Klucze d kpodane przez Richa nie działają dla mnie, nawet gdy korzystam z opcji nocompatible. Przyczyną może być to, że kvim uważa ruch za liniowo, w którym to przypadku obie linie są usuwane. Od :help d:

Wyjątek dla polecenia d {ruch}: Jeśli ruch nie jest liniowy, początek i koniec ruchu nie znajdują się w tej samej linii, a przed początkiem i po zakończeniu są tylko puste miejsca, usuwanie staje się linewise. Oznacza to, że usunięcie usuwa również linię pustych znaków, których możesz się spodziewać. Użyj | o_v | operator, aby wymusić charakter ruchu

Pokazuje także rozwiązanie: użyj, dvkaby wymusić ruch zgodny z charakterem. To załatwia sprawę.

Nie znałem wcześniej, więc oto :help o_v:

v

W przypadku użycia po operatorze, przed poleceniem ruchu: Zmuś operatora do pracy znakowej, także gdy ruch przebiega wzdłuż linii. Jeśli ruch był liniowo, stanie się on | wyłączny | Jeśli ruch był już charakterystyczny, przełącz opcję włączającą / wyłączającą. Można tego użyć, aby ruch wyłączny obejmował ruch wyłączny włącznie

PhilippFrank
źródło
„Niekompatybilny” był kompletnym czerwonym śledziem. Zepsułem się, kiedy testowałem, bo jestem idiotą.
Bogaty
Możemy również użyć dgk, gdzie gk jest również wyłączny, a nie liniowy.
MS.Kim