Как писал Инго Каркат, решение можно найти с помощью 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
.
.*
соответствует тому, что находится в строке замены до сих пор.
\\$
соответствует, только если команда до сих пор заканчивается обратной косой чертой.