Ograniczanie operacji do sekcji kodu

10

W moim codziennym życiu zawodowym wiele razy muszę obsługiwać określoną funkcję, np. Podświetlanie lub wyszukiwanie zmiennej, ale nigdy nie udało mi się ograniczyć zakresu edycji / wyszukiwania.

Czy istnieje vim sposób na wybiórcze powiedzenie, znajdowanie wszystkich odniesień do $colortych zestawów nawiasów klamrowych lub tego zagięcia itp. Jeśli to możliwe, byłoby idealnie, gdyby było to względnie ogólne, aby można je było zastosować do edycji / zamiany tekstu.

Jako przykład:

$color = "#fff";
function PickColor () {
  $color = "#bbb";
  $newColors = ["#000", "#fbf", $color];
  foreach ($newColors as $c) {
    if ($c == "#fff") {
       break;
    }
  }
}
$differentColor = $color;

Ten kod jest jednak stosunkowo złym przykładem, jeśli jednak musiałbym zastąpić wszystkie wystąpienia $ color, jak zrobiłby to w kontekście funkcji PickColor. Jako kolejny przykład, używając #i *Możesz przejść do następnej instancji tego obiektu tekstowego, w jaki sposób ograniczysz zakres wyszukiwania tylko do tej funkcji (w zasadzie zawijanie wyszukiwania) w przeciwieństwie do całego pliku, który może obejmować tysiące linii i tracić twoje miejsce lub niepoprawnie zastępując coś w innej funkcji, której nie powinieneś mieć?

Kyle Mcgill
źródło

Odpowiedzi:

15

Oto kilka sposobów, aby to zrobić.

1  | $color = "#fff";
2  | function PickColor () {
3  |     $color = "#bbb";
4  |     $newColors = ["#000", "#fbf", $color];
5  |     foreach ($newColors as $c) {
6  |         if ($c == "#fff") {
7  |             break;
8  |         }
9  |     }
10 | }
11 | $differentColor = $color;

Zmodyfikowałem twój przykład, aby zawierał numery linii.

Teraz możesz zastąpić wystąpienia $color, powiedzmy $newColor, na następujące sposoby.

Zakresy numerów linii

:1,11s/\$color/$newColor/g

To sprawia, że ​​podstawienie działa na liniach 1-11 włącznie.

Względne zakresy liniowe

Umieść kursor na linii 1, a następnie ...

:.,11s/\$color/$newColor/g

Oznacza to, że zakres zaczyna się od bieżącej linii, a kończy na linii 11.

Zakresy selekcji wizualnej

Przejdź do wiersza 1 i naciśnij Shift+Vnastępnie G. To wizualnie wybiera linię 1. Następnie ...

:'<,'>:s/\$color/$newColor/g

Ogranicza to podstawienie do zakresu objętego wyborem. Vim automatycznie wstawi '<,'>dla ciebie zakres po naciśnięciu :z aktywnym wyborem.

Quincy Bowers
źródło
Uwielbiam vima, zawsze jest coś do nauczenia się i odkrycia, aby ułatwić życie na codzień :)
Kyle Mcgill
6

Jeśli nie masz ochoty wybierać trasy wtyczki, jest NrrwRgn .

Wybierz wizualnie blok, a następnie uruchom :NRpolecenie, które otwiera nowy bufor (podzielony) z zaznaczonym tekstem. Możesz modyfikować ten bufor, a kiedy go zapiszesz, zostanie on również zapisany z powrotem w oryginalnym pliku.

Moim zdaniem ta wtyczka bardzo dobrze rozwiązuje problem, pozwalając Ci skupić się na operacjach, które chcesz wykonać, bez ponownego zastanawiania się, jak zastosować je do określonego zakresu.

tommcdo
źródło
Jest to jedna z wtyczek, do których przysięgam ... to tak, jakby mieć mały bufor scratch, który możesz zatwierdzić z powrotem do normalnego pliku kodu.
craigp
3

Wybierz blok, który Cię interesuje, w trybie linii wizualnej (Shift + V), a następnie wpisz :polecenie i polecenie, które będzie miało zastosowanie do bloku.

Więc jeśli chcesz zastąpić zaznaczenie, możesz uruchomić :s/string/replacement_string

Stefan Dorunga
źródło
dobrze; np.VaB:s/\$color/replaced/g
wchargin
Właśnie to dodałem, dobra uwaga :)
Stefan Dorunga
0

Użyj obiektu tekstowego nawiasów klamrowych „}” i wybierz wewnątrz nawiasów klamrowych za pomocą „i}”

na linii z otwierającym nawiasami klamrowymi funkcji:

$<C-V>i}:s/\$color/$newColor/g

najpierw przejdź do końca linii (która będzie na lub wewnątrz nawiasu otwierającego), a następnie przejdź do wizualnego zaznaczenia, a następnie wybierz za pomocą obiektu tekstowego nawiasów klamrowych. „i}” jest w nawiasach klamrowych „a}” jest w nawiasach klamrowych.

W przypadku języków bez nawiasów klamrowych Vim Text Object: The Definitive Guide sugeruje niektóre wtyczki:

  • Dla języków takich jak Python i CoffeeScript, Indent Object zapewnia obiekty tekstowe oparte na poziomie wcięcia: aiobejmuje bieżący poziom wcięcia i wiersz powyżej; iiobejmuje bieżący poziom wcięcia z wyłączeniem powyższej linii.
  • Ruby Block dodaje obsługę obiektów tekstowych ari ir, w zależności od obecności endsłowa kluczowego.
użytkownik50136
źródło