Как писал Инго Каркат, решение можно найти с помощью c_CTRL-\_e . Вот версия, которую я использую, которая идентична исходному решению, за исключением шаблона регулярных выражений. (Так как это на самом деле просто ответ Инго Карката со скромным улучшением, предложенным Инго Каркатом, я не думаю, что на самом деле он заслуживает своего собственного ответа, но я думаю, что меня обошли стороной: http://chat.stackexchange.com/transcript/message/15021397 # 15021397)
function! TranslateBackslashN()
if getcmdtype() ==# ':' && getcmdline() =~#
\ '[%>]s\([um]\w*\)\?\(.\).\{-}\(\\\)\@<!\2.*\\$'
return getcmdline() . 'r'
endif
return getcmdline() . 'n'
endfunction
cnoremap n <C-\>eTranslateBackslashN()<CR>
Объяснение шаблона регулярных выражений:
[%>]s гарантирует, что замена происходит только тогда, когда s приходит сразу после диапазона
\([um]\w*\)\? соответствует вариантам команды s , таким как smagic .
\(.\) будет первым несловесным символом, поскольку все символы слова уже будут съедены \w в необязательной группе. Обратите внимание, что это группа 2 . Это символ-разделитель, который обычно / . Обратите внимание, что _ , который является символом слова, также является допустимым разделителем, поэтому шаблон не будет работать правильно, если _ используется таким образом. Я никогда не использую _ как разделитель, поэтому я не буду беспокоиться об этом. Точно так же есть некоторые символы, которые не являются символами слова, но которые не должны использоваться в качестве разделителей, но я не беспокоюсь об этом здесь, потому что в этом случае команда все равно должна завершиться неудачей. Я хотел использовать \W здесь, но по какой-то причине это не сработало, когда я его тестировал.
.\{-} должно соответствовать шаблону (\{-} похоже на Perl *?).
\(\\\)\@<!\2 соответствует следующему экземпляру символа разделителя, которому не предшествует обратная косая черта. Перл эквивалент будет (?<!\\)\2 .
.* соответствует тому, что находится в строке замены до сих пор.
\\$ соответствует, только если команда до сих пор заканчивается обратной косой чертой.