Vim - zamapuj ostatnią komendę powłoki na klucz

10

Czy jest jakiś sposób odwzorowania lidera-r, aby powtórzył ostatnie polecenie wysłane do bash?

Na przykład podczas pracy z plikami C chciałbym skompilować i uruchomić program z vima bez wpisywania:! Make lub gcc.

Wiem, że mogę przypisać określone polecenie do klawisza, ale nie zadziała ono dla innych typów plików.

camabeh
źródło

Odpowiedzi:

9

:!!Komenda powtarza ostatni :!{cmd}. Jest nawet dostępny w czcigodnym ol ' vi .

Ingo Karkat
źródło
1

Edycja: odpowiedź Ingo Karkata jest znacznie lepsza. ... usunę ten post, jeśli nie zostanie zaakceptowany (co oznacza, że ​​nie mogę).

Oto jedno rozwiązanie. Przeszukuje tylko ostatnie 100 poleceń, oczywiście możesz zmienić ten numer (indeksowanie historii zaczyna się od -1, czyli ostatniego wpisanego polecenia, więc im niższy numer, tym więcej wyszukiwań).

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>
Martin Tournoij
źródło
Wolałbym tego nie usuwać, ponieważ jeśli to zrobię, pozostawi to pytanie bez odpowiedzi. Poparłem odpowiedź Ingo, która ma teraz więcej głosów niż twoja. Biorąc pod uwagę dodane oświadczenie, usunięcie wydaje się nieco trudne. Nigdy nie wiadomo, kto może uznać to za przydatne. Jeśli tak bardzo się z tym czujesz, zostaw komentarz OP, prosząc go o zaakceptowanie odpowiedzi Ingo. Następnie, jeśli nadal chcesz, możesz usunąć swój.
terdon