У меня есть следующее в моем vimrc:
func! AddSpaceBeforeEqual()
s/\([a-z)_0-9"'\[\]]\)=/\1 =/ge
endfunc
Я использую vint для lint мой vimrc, и получил следующее предупреждение:
ProhibitCommandWithUnintendedSideEffect Избегайте команд с непреднамеренными побочными эффектами. Избегайте использования: s [ubstitute], поскольку он перемещает курсор и печатает сообщения об ошибках. Предпочитают функции (такие как search ()), лучше подходящие для скриптов. Для многих команд vim существуют функции, которые делают то же самое с меньшим количеством побочных эффектов. Смотрите: help functions () для списка встроенных функций. Руководство по стилю Google Vimscript
Однако я не думаю, что это способ сделать замену без использования :s
команды.
Например, search()
функция выдает строки, соответствующие шаблону, но нет способа сделать замену. substitute()
Функция работает на шнурке, и не подменять на весь файл.
Должен ли я сам реализовать метод замены или это более разумный способ переписать мою функцию?
источник
:help function-search-undo
Команда
:s
- это чистый подход Vimscript.Я предполагаю, что предупреждение означает только то, что курсор, скорее всего, будет неправильно расположен после его использования (что вы можете обойти, используя
winsaveview()
функцию до иwinrestview()
команду после ее использования). Также вам необходимо позаботиться о возможных ошибках, которые могут возникнуть. Обычно это делается с помощьюe
флага. Также необходимо позаботиться о некоторых настройках, таких какgdefault
настройка, которая инвертирует значениеg
флага.Нужно заботиться об этих особенностях, и это, вероятно, является основной причиной этих предупреждений. Но это не значит, что нужно избегать использования
:s
команды. Вполне нормально использовать:s
команду, если вы хотите что-то заменить в текущем буфере.(Обратите внимание, что можно, конечно, перебрать все строки и использовать подход search () / getline () / setline (). Но обычно это медленнее.)
источник