Хорошо, если вы знаете, что %
будет всегда переназначаться, тогда использование
map <Tab> %
безопасно (отсутствие n
впереди является преднамеренным: %
определяется во всех режимах, охватываемых :map
).Но то, что вы всегда можете сделать, это заменить <SID>
на <SNR>{N}_
, где {N}
- это номер сценария matchit в выходных данных :scriptnames
.В более новом vim вы также можете использовать maparg('%', 'n', 0, 1)
, он выведет словарь, который среди других значений содержит lhs
и sid
.В этом случае код может выглядеть следующим образом:
for s:mode in ['n', 'v', 'o']
let s:map=maparg('%', s:mode, 0, 1)
execute s:mode.'noremap <Tab> '.substitute(s:map.lhs, '<SID>', '<SNR>'.s:map.sid.'_', 'g')
endfor
В этом случае
for s:mode in ['n', 'v', 'o']
execute s:mode.'noremap <Tab> '.maparg('%', s:mode)
endfor
также допустимо, поскольку «старое» (без четвертого аргумента) поведение maparg заключается в расширении <SID>
.