Редагувати: Відповідь Інго Каркат набагато краща. ... Я б видалив цю публікацію, якщо її не було прийнято (це означає, що я не можу).
Ось одне рішення. Він шукає лише останні 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>