:!<command>
może być użyty do wykonania polecenia w powłoce. Ale to „przejmuje” mój terminal i wypełnia go stdout
tym konkretnym poleceniem.
Jak wykonać polecenie w tle, które powiadamia mnie tylko o niezerowym kodzie wyjścia?
external-command
OrangeTux
źródło
źródło
Odpowiedzi:
:silent exec "!command"
Zauważ, że twoja sesja vim nadal będzie zajęta podczas wykonywania polecenia. Wynika to z synchronicznej natury Vima. Nadal możesz wrócić do powłoki, naciskając CTRL + Z (aby wysłać Vima do tła), a następnie wznowić vim za pomocą polecenia,
fg
jak zwykle.Aby zrobić wszystko asynchronicznie, spójrz na wtyczkę Tima Pope'a vim-dispatch lub projekt NeoVim, który ma natywne wsparcie dla wykonywania poleceń asynchronicznych, które możesz łatwo wykorzystać za pomocą wtyczki NeoMake. Najnowsza wersja Vima obsługuje także zadania asynchroniczne.
Zobacz : h: cichy
źródło
:silent !ls
) ... nie daje prawidłowego wyniku dla kodu wyjścia innego niż 0 ... Więc obawiam się, że jest to trochę bardziej zaangażowane niż tylko użycie:silent
...:silent exec "!ls"
nie:silent !ls
pokazuję żadnych wyników w mojej wersji Vima, 7.4 z łatkami 1-213.:silent !ls
: i.stack.imgur.com/1XvS6.png ... Muszę nacisnąć,^L
aby to naprawić ponownie ...Aby wykonać polecenie bez wyzwalania komunikatu Enter, na przykład:
spróbuj następującego prostego przykładu:
Następnie naciśnij Ctrl+ L(lub
:redraw!
), aby odświeżyć ekran po powrocie do Vima.Aby uniknąć potrzeby odświeżania, możesz zdefiniować własne niestandardowe polecenie, takie jak:
Teraz możesz użyć nowego polecenia Vima, aby uruchomić polecenie powłoki (uwaga: bez ! I dużymi literami S ):
Źródło: Unikanie monitów „Hit ENTER, by kontynuować” na stronie Vim Wikia
źródło
:Silent ctags -R . > /dev/null &
na uruchamianie poleceń w tle. Wysłanie standardowego wyjścia do / dev / null zapobiega wyświetlaniu danych wyjściowych w buforze vim.Szybkie i brudne rozwiązanie (w czystym Vimscript)
Może to uruchomić proces w tle:
Ale Vim potrzebuje sposobu, aby dowiedzieć się, kiedy proces się zakończy i jak, więc użyjmy pliku znaczników:
Teraz możemy prosić Vima, aby sprawdzał co jakiś czas, czy proces się zakończył:
Hej, to nie jest ładne, ale to trochę działa!
Niedogodności
Niestety powyższy autocmd nie uruchomi się, dopóki nie przesuniesz kursora. A jeśli chcesz uruchomić więcej niż jeden proces w tle, musisz dodać unikalne identyfikatory do tych plików i do nazwy grupy autocmd.
Jeśli więc poradzisz sobie z dodatkową zależnością, lepiej byłoby użyć sprawdzonego rozwiązania, takiego jak wtyczka vim-dispatch wspomniana w innej odpowiedzi.
Wyświetlanie wyników
Jeśli chcesz zobaczyć wynik procesu, a nie tylko kod zakończenia , zamień ostatni
echo
z powyższych na:To otworzy okno podglądu. Aby zamiast tego użyć listy błędów szybkiej poprawki:
Lista poprawek pozwala łatwo nawigować do błędów za pomocą
:cnext
. Jednakcopen
przesuwa kursor do okna szybkiego dostępu, gdy zostanie otwarte, co prawdopodobnie będzie zaskakujące / denerwujące.(Obejściem tego problemu byłoby otwarcie okna QF
:copen
przy początkowym uruchomieniu procesu, więc nie trzeba będzie wywoływać go na końcu.)źródło
Uruchamianie polecenia w tle
Uruchomiłem polecenie, które zablokowało się na chwilę, i tak naprawdę nie obchodziło mnie wyjście. Można temu zaradzić, uruchamiając proces podłączony nie do terminala / emulatora, lecz do systemu i przekierowując wszystkie dane wyjściowe do / dev / null. Na przykład:
(...&)
uruchamia go w tle i> /dev/null
przekierowuje wszystkie dane wyjściowe do/dev/null
(nic).Nawias przechwytuje dane wyjściowe do podpowłoki (lub czegoś w tym rodzaju), ale ma taki efekt uboczny, że nie jest dołączony do bieżącej powłoki (nic wielkiego).
Ciche wykonywanie polecenia w tle za pomocą mapowania
Właśnie zdałem sobie sprawę, że jeśli są w rzeczywistości, przyporządkowując je, można zrobić coś takiego
Powyższe nie wyświetli nic na pasku poleceń i dodatkowo nie wyświetli niczego w terminalu poza vimem. Zostanie on zamapowany
<leader>
e, co jest \ edomyślnie.Uruchamianie polecenia, przechwytywanie jego wyniku i wyświetlanie jego zawartości
(Kolejna edycja - i może najładniejsza). Ten będzie wyświetlany na wyjście komendy jeśli więc wybrać:
WEWNĄTRZ NOWEJ ZAKŁADKI:
WEWNĄTRZ PIONOWEGO ROZDZIELENIA:
WEWNĄTRZ HORYZONTALNEGO ROZDZIELENIA:
... rób co chcesz
źródło
Jeśli nie obchodzi Cię kod wyjścia, możesz przejść z tym:
źródło
v:shell_error
zmienna powie ciNie jestem pewien, czy odpowiada to twoim potrzebom (nie obsługuje procesów w tle jak w
foo &
- nie jestem pewien, czy to właśnie rozumiesz przez „w tle” ), ale niestandardowe polecenie może być użyte jak w:Następnie użyj jako np .:
Jeśli nie potrzebujesz / nie chcesz, aby komunikat o błędzie
system()
wystarczył, wystarczy sprawdzićv:shell_error
i zgłoś npecho Error!
.Z pomocy v: shell_error :
źródło
foo &
…” . Z całego tekstu Q zinterpretowałem go jako albo. Albo „Wykonaj jako zewnętrzne polecenie AKA w tle” lub „Wykonaj jako zewnętrzne polecenie _ i_ jako proces w tle” . Odpowiedziałem głównie na podstawie tytułu Q itp. - dodałem komentarz do „Nie jestem pewien…” - i zostawiłem OP, aby wyjaśnić, czy któryś lub.Vim 8 wprowadził obsługę miejsc pracy. Można uruchamiać zewnętrzne polecenia w tle, nie polegając na wtyczkach. Na przykład, aby uruchomić serwer Markdown ( markserv ) w bieżącej lokalizacji i nie blokować sesji vim:
To uruchamia proces markserv jako podproces bieżącego procesu vim. Możesz to zweryfikować za pomocą
pstree
.Zobacz job_start
źródło
Używam następującego kodu:
Teraz możesz wpisać następujące
Wygląda to prawie jak wbudowane
silent !
polecenie Vima , z wyjątkiem stolicyS
. Pozwala nawet na opcjonalne,!
aby wyglądał jeszcze bardziej podobnie. Wezwanie dosystem()
tego, aby polecenie powłoki było naprawdę ciche: żaden ekran nie miga i nie przerysowuje.(a jeśli kiedykolwiek potrzebujesz kodu stanu, możesz sprawdzić
v:shell_error
zmienną, zobacz pomoc, aby uzyskać więcej informacji)źródło
AsyncRun wtyczki jeśli przeznaczone do tego, że pozwala na uruchomienie poleceń powłoki w tle w Vim8 / NeoVim i wyświetla dane wyjściowe w quickfix okna.
Podobnie jak zamiana
!
polecenia:Możesz również całkowicie ukryć dane wyjściowe w oknie szybkiej poprawki:
Po zakończeniu zadania AsyncRun powiadomi Cię, przekazując opcję
-post
:Zdefiniowany przez skrypt vim
-post
zostanie wykonany po zakończeniu zadania.źródło