Как обсуждалось в комментариях, проблема в том, что ваша карта, вызывающая :execute
, ведет себя немного иначе, вместо этого вам, вероятно, нужно :call
:
nnoremap <F5> :call ToggleDimTags()
Чтобы уточнить, что говорит @ZyX, :h :exec
содержит следующий текст:
:exe :execute
:exe[cute] {expr1} .. Executes the string that results from the evaluation
of {expr1} as an Ex command.
[...]
Что действительно делает :execute
, так это вычисление выражения в поисках строки, которая будет выполнена как команда Ex (также называемая командами с двоеточием).Другими словами:
exec ToggleDimTags() | " <-- ToggleDimTags() is evaluated and returns 0
exec 0
Что означает:
:0
Сейчас, :h :call
:
:cal :call E107 E117
:[range]cal[l] {name}([arguments])
Call a function. The name of the function and its arguments
are as specified with |:function|. Up to 20 arguments can be
used. **The returned value is discarded**.
[...]
Обновление
Я думал о вашей функции, и, используя троичный оператор и немного магии :execute
, вы можете упростить ее до того момента, когда вы откажетесь от дополнительной функции:
nnoremap <silent> <F9> :exec "color " .
\ ((g:colors_name == "wombat256") ? "dimtag" : "wombat256")<CR>
Здесь, это nnoremap не будет выводить (<silent>
) и основан на :exec
, за которым следует следующее выражение:
"color " . ((g:colors_name == "wombat256") ? "dimtag" : "wombat256")
Когда g:colors_name
установлено на wombat256
, выражение оценивается как:
"color dimtag"
Или, иначе:
"color wombat256"
Тогда любой из них оценивается как :exec
.Конечно, вы можете присоединиться к строкам (не забывая удалить обратную косую черту), я сделал это просто так, чтобы избежать слишком длинной строки.