Изменить: ответ Инго Каркат намного лучше. ... Я бы удалил этот пост, если он не был принят (что означает, что я не могу).
Вот одно из решений. Он ищет только последние 100 команд, очевидно, вы можете изменить это число (индексирование истории начинается с -1, что является последней введенной вами командой, поэтому чем меньше число, тем дальше производится поиск).
fun! LastCommand()
let l:i = -1
while l:i > -100
let l:cmd = histget("cmd", l:i)
if strpart(l:cmd, 0, 1) == "!"
let l:i = 1
execute l:cmd
break
endif
let l:i -= 1
endwhile
if l:i < 1 | echoerr "No command found" | endif
endfun
nnoremap <Leader>r :call LastCommand()<CR>