Jak osiągnąć wybór różnej długości tekstów w różnych wierszach?

10

zakładam, że mam następujące teksty:

aaa-dd-e: „aaa”,
bb-x: „bb”,
c-9: „c”

Chcę dokonać wyboru jak poniżej:

aaa-dd-e:„aaa”,
bb-x:„bb”,
c-9:„c”

Próbowałem użyć cv do utworzenia bloku wizualnego, ale po utworzeniu zaznaczenia w pierwszej kolumnie i naciśnięciu „f:” (chciałem rozszerzyć zaznaczenie do znaku dwukropka w każdej linii jak wyżej), otrzymuję:

aaa-dd-e: „aaa”,:
bb-x„bb”,
c-9:„c”

zaznaczenie zatrzymuje się na pierwszym dwukropku i tworzy prostokąt.

Aaron Shen
źródło
6
Co chcesz osiągnąć dzięki tej selekcji, może istnieć inny sposób
Arjen Dijkstra
Jeśli jest oddzielony znakami, możesz najpierw spróbować ponownie wyrównać blok, a następnie wybierz go. Zobacz: Wyrównaj tekst tylko na pierwszym separatorze w VIM
kenorb

Odpowiedzi:

6

Selekcja jest na ogół środkiem do celu, tym bardziej w Vimie, w którym selekcja często nie jest konieczna.

Zakładając, że nadal chcesz umieszczać cudzysłowy wokół nazw właściwości w pliku innym niż JSON, aby przekształcić go we właściwy JSON:

  1. wybierz linie do modyfikacji, znakowo lub liniowo, to nie ma znaczenia,
  2. :'<,'>norm I"^[f:i"( '<,'>jest automatycznie wstawiany i ^[uzyskiwany za pomocą <C-v><Esc>).

Jeśli masz piękną wtyczkę surround, krok 2 staje się:

:'<,'>norm ^vt:S"

Po podstawieniu krok 2 może stać się:

:'<,'>s/^\s*\([^:]*\):/"\1"
romainl
źródło
macie rację, teraz uważam, że selekcja wizualna prawdopodobnie nie jest konieczna. z pomocą lub :g/regex/normmogę po prostu osiągnąć wszystko, co chcę zrobić.
Aaron Shen
Czy jest jakiś sposób na umieszczenie całego zaznaczonego bloku w schowku systemowym i wklejenie go w innym pliku?
Aaron Shen
Oczywiście. Zakładając, że Twój Vim jest skompilowany z obsługą schowka, którą możesz zrobić "+ylub "*y, w zależności od schowka, na który chcesz celować. Tutaj jest wiele powiązanych pytań.
romainl
14

Vim obsługuje tylko prostokątne zaznaczenia blokowe, z wyjątkiem poszarpanej prawej ramki po naciśnięciu $.

Istnieją wtyczki (takie jak wiele kursorów vim ), które mogą emulować wiele wyborów, ale powinieneś być w stanie osiągnąć swój rzeczywisty cel (o którym niestety nie wspomniałeś) za pomocą czystych poleceń Vima, na przykład :globali :substitute(jeśli możesz sformułować regularny wyrażenie pasujące do zaznaczenia w każdym wierszu) lub przez powtarzanie makr (jeśli istnieje określony ruch, który obejmuje zaznaczenie w każdym wierszu).

Ingo Karkat
źródło
co jeśli chcę wyciąć te linie i wkleić do innego bufora?
Aaron Shen
1

Aby rzucić kolejny pierścień na pierścień, jeśli naprawdę chcesz użyć selekcji wizualnej, możesz użyć wtyczki Tabular do wyrównania dwukropków, a następnie dokonać selekcji wizualnej.

Jeśli weźmiesz oryginalny tekst:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs wyrówna wszystko po dwukropku, jak poniżej

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

Następnie możesz dokonać wizualnego wyboru bloku.

Jednak, jak powiedzieli inni, selekcja wizualna prawdopodobnie nie jest konieczna w tej sytuacji. Używanie normlub zastępowanie może prawdopodobnie osiągnąć to, czego chcesz, bez kłopotów z selekcjami wizualnymi.

Zach Ingbretsen
źródło
1

Znalazłem rozwiązanie tego problemu, który jest zaskakująco prosty! Uruchom tryb blokowania wizualnego od dołu zaznaczenia tekstu, który chcesz skopiować, i wybierz w górę! Będzie powiększał blok w miarę wchodzenia w górę, a jeśli podświetlisz w dół, wydaje się, że wybór jest mniejszy.

Arthur Bowers
źródło
Ale w ten sposób zawsze będzie to prostokątny blok, prawda? Gdy czytam, OP nie chce tego (wspominają, że próbowali trybu blokowania wizualnego).
Martin Tournoij
Nie. Zawsze będzie prostokątny blok, jeśli wszystkie linie będą tej samej długości. Przekonałem się, że rozpoczęcie od dołu i wyróżnienie w górę, a następnie naciśnięcie $, aby przejść do końca linii, spowoduje, że wszystkie podświetlone linie zostaną podświetlone do końca linii.
Arthur Bowers,