Mam taką linię:
function my_function(argument, another argument, but there are spaces)
Chcę zastąpić znaki spacji (w nazwach argumentów) znakiem podkreślenia. Chciałbym zatem użyć:
:s/\ /_/g
ale jak mogę nie stosować go do całej linii, ale zaczynając od, powiedzmy, pozycji kursora? (Lub trzecie słowo)?
\%#
. Tak, można użyć::s/\v(%#.*)@<= /_/g
. Który można opisać jako spację poprzedzoną@<=
znakami ( ) po pozycji kursora.\%#
lewę, zaakceptuję jego odpowiedź, jeśli jej nie napiszecie ... Ale czy któryś z was mógłby wyjaśnić wyrażenie regularne nieco bardziej wyraźnie?Odpowiedzi:
Możesz użyć następującego rozwiązania:
Najpierw użyj, v$aby zaznaczyć tekst od kursora do końca linii. Następnie użyj następującego polecenia:
\%V
Wskazują na zmianę tekstu w uprzednio wybranym obszarze wizualnie, zobacz:h /\%V
.Jeśli wezmę twój przykład:
Jeśli mój kursor znajduje się w 40. kolumnie i użyję właśnie napisanego polecenia, otrzymuję:
W odpowiedzi na Twój komentarz możesz także użyć
\%#
który pasuje z pozycji kursora\%>23c
który pasuje po 23 kolumnie.\%>'m
który pasuje po pozycji znakuZobacz
:h /\%#
,:h /\%>c
a:h /\%>'m
.@ User9433424 dał sposób na wykorzystanie
\%#
w swoim komentarzu. Dla wzoru ze znakiem możesz ustawić go dowcipem, maa następnie użyć:Wyjaśnienie wzoru podane przez @ User9433424 jest następujące:
Będziesz chciał zobaczyć
:h \v
i:h /\@<=
źródło
Możesz użyć funkcji look behind (
:h \@<=
), aby upewnić się, że istnieje poprzedzający znak „(” oraz granica końca słowa (:h \>
), aby upewnić się, że podstawienie nastąpi tam, gdzie chcesz.Tak więc z tekstem:
uruchomienie polecenia:
będzie produkować:
Może to być łatwiejsze niż konieczność każdorazowego ustawiania kursora, pod warunkiem, że podstawienie ma zawsze znany punkt początkowy.
źródło