2013-01-04 13 views
9

Otrzymuję nietypowe zachowanie, gdy próbuję usunąć z końca linii przy użyciu wyboru bloku w vim.usuwanie z końca wierszy za pomocą bloku wybierz w vim

Więc powiedzmy, że mam tekst jako takie:

delete this char:x 
and this:x 
also this:x 
and then this:x 
lastly this:x 

Jeśli chcę dołączyć y do każdej linii mogę:

  • wybór blok startu z Cv
  • wybierz wszystkie linie z 4j
  • idą do końców linii z $
  • początek dołączanie z A
  • typu żądany tekst y

w celu uzyskania:

delete this char:xy 
and this:xy 
also this:xy 
and then this:xy 
lastly this:xy 

ale gdy próbuję usunąć x w ostatnim kroku zamiast dodanie bym spodziewać się:

delete this char: 
and this: 
also this: 
and then this: 
lastly this: 

chociaż skończyć z:

delete this char: 
and this:x: 
also this:x: 
and then this:x: 
lastly this:x: 

O ile rozumiem, to dołącza Ostatni znak w pierwszym wierszu do wszystkich innych linii (w tym przypadku :) zamiast usuwania brakujących te (w tym przypadku x) .

Mogę to zrobić za pomocą makr lub zamienników, ale nie do końca rozumiem powody takiego zachowania. Czy jest sposób, w jaki mogę to zrobić przy wyborze bloku?

+0

Nie rozumiem zachowania Ci opisać. Pierwsze 'x' jest usuwane, ale nic nie jest dodawane. – romainl

+0

@romainl używasz tych samych przykładów z pytania? jeśli używasz czegoś takiego jak 'delete this char: x' i delete' x', dodaje spacje końcowe, które mogą być łatwe do przeoczenia .. – none

+0

Nie, widzę końcowe spacje dobrze i nie ma żadnych. W tym kontekście ' {movement} $ A', usuwanie znaków nie jest jednak wykonywane w każdym wierszu selekcji. Działa tylko dodawanie znaków. Jest trochę krótkowzroczny, jeśli chcesz poznać moją opinię, ale tak to jest zaprojektowane. Usunięcie 'x' na końcu zakresu linii jest zwykle wykonywane za pomocą': '<,'> norm $ x' lub ':' <,'> s/x $ //'. – romainl

Odpowiedz

5

$C-v4jx

  1. iść do końca zgodne z $
  2. przełącznik bloku wizualnej C-v
  3. zejść (w przypadku 4x) 4j
  4. usuwać te rzeczy z x

Edit (reakcji na swój komentarz do arbitralnej wcięcia)

, co można zrobić z prostego makra.Makra nie są tak trudne, jak można myśleć:

  1. rozpocząć nagrywanie makra, będziemy go nazwać „a”, więc qa
  2. iść do końca linii $
  3. usunąć jeden znak x
  4. zejść o jedną linię z j
  5. zakończyć naszą makro q

Teraz zastosuj nasze makro: [email protected] - zrobi to samo, co podczas nagrywania makra, 20x.

+0

To działa, ale potrzebuję czegoś, co działałoby z dowolnym wcięciem. Odpowiednio zredagowałem pytanie. – none

+0

Problem z rozwiązaniem makro polega na tym, że muszę policzyć linie, które muszę zmodyfikować. – Jaakko

4

Jeśli mam małą liczbę wierszy I zazwyczaj zrobić Abacksapceesc. Następnie wielokrotnie wykonaj j. do zrobienia. Nie najszybszy, ale łatwy do zapamiętania.

W przypadku dużej liczby linii zazwyczaj wybieram linie za pomocą V, a następnie dokonuję zamiany lub normalnego polecenia na zakresie.

:'<,'>s/.$// 
:'<,'>norm $x 

Uwaga: nie trzeba wpisywać '<,'>. Zostanie on wstawiony automatycznie po uruchomieniu polecenia, gdy jakiś tekst zostanie wybrany wizualnie.

Polecenie zamiany jest bardzo proste, dopasuj ostatni znak (.$), a następnie zastąp go bez niczego.

normalna komenda jest po prostu jak można usunąć ostatni znak w trybie normalnym poprzez $x na jednej linii z wyjątkiem będzie zastosować go do każdej linii w zasięgu.

Więcej Pomocy Zobacz:

:h range 
:h :s 
:h :norm 
+1

+1 dla 'j. Rozwiązania – none

+0

Jeśli zrobisz makro, możesz powtórzyć je dowolną liczbę razy, np. '10 @' zamiast 'j.j.j.j.j.j.j.j.j.j.' (4 naciśnięcia klawiszy zamiast dwudziestu, plus 3 dodatkowe niezbędne do zarejestrowania makra (' q '...' q')). –

2

jak sam pan powiedział, aby osiągnąć swój cel, istnieją inne sposoby, w rzeczywistości lepsze sposoby, aby przejść. :s lub q(macro) lub :g/.../norm $x. :s/.$//g jest całkiem proste.

Ctrl-V nie nadaje się do tego zadania. Co do nazwy: Visual BLOCK. Chcesz usunąć ostatnie x, a one (tylko x) nie są w bloku.

Jednak jeśli naprawdę chcesz trzymać się ctrl-v, musisz zrobić dodatkową pracę, aby te "x" w bloku. Jeśli masz zainstalowaną wtyczkę Align, można:

Wybierz (V) wszystkie linie, które chcesz wykonać trick,

<leader>t: 

następnie tekst wygląda następująco:

delete this char : x 
and this   : x 
also this  : x 
and then this : x 
lastly this  : x 

Ctrl-V usunąć x, powinieneś wiedzieć, jak to zrobić.

następnie

:%s/ *:/:/g 

usunąć wyściełane spacji przed ':'

Jednak nie sądzę, że jest to dobry sposób, aby przejść.

+0

Wszystkie są dobre i wszystkie, ale żadna z nich nie jest tak intuicyjna jak wizualne blokady. Chcę pozostawić to pytanie na jakiś czas, zanim się poddam, ponieważ wciąż mam wrażenie, że nie ma powodu, aby uniemożliwiać wprowadzenie takiej funkcji. – none

8

Czy próbowałeś już :{range}normal? To powinno działać:

:'<,'>normal $x 

('<,'> bit jest wypełniony dla ciebie po wpisaniu .)

+0

Myślę, że wyjaśnienie, co zrobi z powyższym rozwiązaniem, byłoby wspaniałe. Próbowałem edytować jeden z nich, ale został odrzucony. – Jaakko

+1

'{range}' jest dość popularnym językiem Vima w plikach pomocy. 'normal' to polecenie, które wprowadza następujące rzeczy, takie jak podczas pisania w trybie normalnym. Tak więc, to polecenie robi dla każdej linii: przejdź do końca linii, a następnie usuń znak pod kursorem. –

Powiązane problemy