回答:
編集:インゴカーカットの答えははるかに優れています。...この投稿が受け入れられなかった場合は削除します(つまり、私はできません)。
これが1つの解決策です。検索するのは最後の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>