Zamień na czysty vimscript (bez `: s`)

12

Mam w moim vimrc:

func! AddSpaceBeforeEqual()
  s/\([a-z)_0-9"'\[\]]\)=/\1 =/ge
endfunc

Używam vint, aby pobrudzić mój vimrc i otrzymałem następujące ostrzeżenie:

ProhibitCommandWithUnintendedSideEffect Unikaj poleceń z niezamierzonymi skutkami ubocznymi. Unikaj używania: s [ubstitute], ponieważ przesuwa on kursor i drukuje komunikaty o błędach. Preferuj funkcje (takie jak search ()) lepiej dostosowane do skryptów. Dla wielu poleceń vima istnieją funkcje, które robią to samo z mniejszą liczbą efektów ubocznych. Zobacz: funkcje pomocy (), aby uzyskać listę wbudowanych funkcji. Przewodnik po stylu Google Vimscript

Jednak nie sądzę, że są one sposobem na wykonanie podstawienia bez użycia :spolecenia.

Na przykład search()funkcja podaje linie pasujące do wzorca, ale nie ma możliwości wykonania podstawienia. substitute()Funkcja działa na sznurku, a nie zastępować na całego pliku.

Czy powinienem samodzielnie wdrożyć metodę zastępczą, czy jest to mądrzejszy sposób na przepisanie mojej funkcji?

edi9999
źródło

Odpowiedzi:

10

Oto uproszczona implementacja Twojej funkcji, napisana za pomocą substitute():

function! AddSpaceBeforeEqualInWholeBuffer()
    let l = 1
    for line in getline(1,"$")
        call setline(l, substitute(line, '\([^= ]\)=', '\1 =', "g"))
        let l = l + 1
    endfor
endfunction

Dostosuj wzór wyszukiwania do smaku.

romainl
źródło
10

Powodem, dla którego ostrzega cię przed niezamierzonymi skutkami ubocznymi, jest to, że :substituteprzesuwa kursor i zastępuje poprzednie wyszukiwanie (jeśli jest używane poza funkcją) . Nie oznacza to jednak, że nie powinieneś go używać, ponieważ możesz odwrócić skutki uboczne :substitute. Na przykład, oto funkcja, którą wykonałem, która używa polecenia zastępczego, aby usunąć końcowe białe znaki:

function! StripTrailingWhitespace()
    " Save cursor position
    let l:save = winsaveview()
    " Remove trailing whitespace
    %s/\s\+$//e
    " Move cursor to original position
    call winrestview(l:save)
    echo "Stripped trailing whitespace"
endfunction

Pamiętaj, że możesz również użyć :markpolecenia, aby zapisać pozycję kursora, ale oznacza to również, że zastąpisz znak, którego zdecydujesz się użyć. Nie korzystałem wcześniej z vint, ale jedna wskazówka na linters polega na tym, że możesz wziąć ich ostrzeżenia z odrobiną soli. W tym przypadku prawdą jest, że :substitutema skutki uboczne, ale są to działania niepożądane, którym można zapobiec. Ponadto tak naprawdę nie ma lepszego sposobu na przeszukanie i zastąpienie pliku.

Wiecznie zielone drzewo
źródło
6
Ostatnio używane wyszukiwane hasło jest automatycznie przywracane po opuszczeniu funkcji, więc zapisywanie i przywracanie nie powinno być wymagane podczas używania go wewnątrz funkcji. Zobacz:help function-search-undo
Martin Tournoij,
1
raczej użyj winsaveview () / winrestview () zamiast kursora ()
Christian Brabandt,
1

:sKomenda jest czystym podejście Vimscript.

Domyślam się, że ostrzeżenie oznacza jedynie, że kursor najprawdopodobniej zostanie źle ustawiony po jego użyciu (co można obejść, używając winsaveview()funkcji przed i winrestview()polecenia po jej użyciu). Musisz także zadbać o możliwe błędy, które mogą wystąpić. Zwykle odbywa się to za pomocą eflagi. Trzeba także zadbać o niektóre ustawienia, takie jak gdefaultustawienie, które odwraca znaczenie gflagi.

Trzeba zająć się tymi szczegółami i to prawdopodobnie jest podstawową przyczyną tych ostrzeżeń. Ale to nie oznacza unikania użycia :spolecenia. Użycie :spolecenia jest całkowicie w porządku , jeśli chcesz zastąpić coś w bieżącym buforze.

(Uwaga: można oczywiście zapętlić wszystkie linie i zastosować metodę search () / getline () / setline (). Ale zwykle jest to wolniejsze.)

Christian Brabandt
źródło