2016-01-19 3 views
1

Есть ли возможность заменить первое вхождение без запроса подтверждения в vim?Как заменить первое вхождение только в vim

Я хочу заменить Нью-Йорк \place{New York} в первом случае только без запроса подтверждения. Я использовал этот код:

silent! /\\begin{text}/,/\\end{textit}/s/New York/\\place{New York}/g 

> \begin{text}..[paragraphs]...\end{textit} 

New York может содержаться в 10 раз в этом пункте.

ответ

2

Так что вы хотите в диапазоне линии делают только одиночный замену, а не один сабвуфер в каждой строке. Так что /start/,/end/ s/pat/rep/ не будет работать. Я хотел бы сделать свой пример проще, учитывая, что мы имеем:

foo 
nyc nyc 
nyc nyc 
bar 

Я предполагаю, что вы ожидаете, чтобы это

foo 
\\place{nyc} nyc 
nyc nyc 
bar 

Однако :/foo/,/bar/ s/nyc/\\place{&} даст

foo 
\\place{nyc} nyc 
\\place{nyc} nyc 
bar 

Поскольку :s будет делать sub для каждой строки в диапазоне.

Я бы сузить диапазон, чтобы решить эту проблему:

/foo//nyc/s/nyc/\\place{&}/ 

к сведению, что между /foo/ and /nyc/, нет никакого запятая.

Вывод должен быть:

foo 
\\place{nyc} nyc 
nyc nyc 
bar 

Вы можете прочитать :h range для деталей.

2

Флаг /g в конце вашей замены означает, что он будет выполнен на каждые в результате вашего шаблона поиска. Удалите его, и он будет выполняться только при первом появлении.

Также :s не запрашивает подтверждение по умолчанию; для этого вам нужно будет добавить флаг /c. Поэтому я не уверен, почему вы добавили его с :silent.

Другой комментарий: Вы можете повторно совпавший текст в замене части с &:

:/\\begin{text}/,/\\end{textit}/s/New York/\\place{&} 
+0

Если шаблон не найден, тогда он показывает некоторую ошибку msg, например, шаблон не найден, если мы используем silent !, тогда он не отображает сообщения об ошибках. – Zam

+0

Эти сообщения полезны. – romainl

+0

, но у меня есть много шаблонов поиска в моей функции, может быть 300. Таким образом, сообщение, отображаемое каждый раз, меня беспокоит. – Zam