Править: Ответ Ingo Karkat намного лучше... Я удалил бы это сообщение, если бы не было принято (что означает, что я не могу).
Вот одно решение. Это только ищет последние 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>