Pomiń wyjście z autokomandu vim

13

Mam komendę zdefiniowaną w moim vimrc:

au BufWritePost * !./make.sh

Skrypt make.shkompiluje .texplik 3 razy i nie chcę, aby dane wyjściowe były wyświetlane.

Czy istnieje sposób na stłumienie wyjścia?

Próbowałem dodać silentjedną linię przed aupoleceniem, ale to nie zadziałało. Próbowałem również w ten sposób bezskutecznie.

Andre Herman Bezerra
źródło

Odpowiedzi:

20

Milczenie powinno iść wcześniej !./make.sh, a nie wcześniej au. Wstawienie silentprzed auoznacza, że ​​po cichu zarejestruje komendę automatyczną. Zamiast tego powinno to wyglądać tak:

au BufWritePost * silent! !./make.sh

Jednym z problemów z uruchomieniem zewnętrznego polecenia takiego jak to z tym :silentpoleceniem jest to, że ekran nie przerysowuje się, pozostawiając pusty ekran. Jednak vim ma polecenie przerysowujące ekran, którego można użyć w następujący sposób:

au BufWritePost * silent! execute "!./make.sh >/dev/null 2>&1" | redraw!

Powodem, dla którego muszę użyć polecenia wykonania, jest to, że :!polecenie to używa znaków znajdujących się po nim, co oznacza, że ​​nie mogłem tego zrobić, silent! !./make.sh | redraw!ponieważ bash spróbuje zinterpretować wszystkie znaki później !.

Notatki

Zauważ, że :silent!ignoruje komunikaty o błędach, podczas :silentgdy nie. Ponadto >/dev/null 2>&1część przekierowuje wszystkie dane wyjściowe !./make.shdo /dev/null. Możesz przeczytać więcej o przekierowaniach we / wy w bash tutaj .

Odpowiednie tematy pomocy

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar
Wiecznie zielone drzewo
źródło
Drugie polecenie działało, chociaż nadal drukuje dane wyjściowe na ekranie. Ponadto nie muszę naciskać klawisza Enter po zakończeniu skryptu, co jest dobre. Ale zastanawiam się, czy jest jakiś sposób, aby całkowicie stłumić wydajność.
Andre Herman Bezerra
1
Czy wymiana execute "!./make.sh"z execute "!./make.sh >/dev/null 2>&1"pomocą? Spowoduje to przekierowanie wszystkich danych wyjściowych polecenia do /dev/null. Przeczytaj tldp.org/LDP/abs/html/io-redirection.html, aby uzyskać więcej informacji na temat przekierowania w bash.
EvergreenTree
Powinienem o tym pomyśleć! To działa. Dzięki!
Andre Herman Bezerra
7

Odpowiedź na twoje bezpośrednie pytanie jest taka, jak na @EvergreenTree. Jednak wydaje mi się, że brakuje Ci niektórych wbudowanych narzędzi Vima do budowania / kompilowania / lintowania projektów. Przede wszystkim :makelista szybkich poprawek.

Co daje :makenam korzystanie?

Używanie :makepozwala zebrać błędy na listę zwaną listą szybkich poprawek. Za pomocą tej poprawki możesz nawigować między błędami w swoich plikach, więc przeskakujesz od razu do miejsca, w którym kompilator mówi, że błąd (przydatny, prawda?).

:robić

Uruchomiony :makezostanie wykonany program make, 'makeprg'. Następnie przeanalizuj dane wyjściowe za pomocą 'errorformat'i umieść każdy wpis na liście szybkich poprawek.

Zazwyczaj 'makeprg'domyślna jest makekomenda, która uruchamia a Makefile. Jednak można zmienić 'makeprg'za pomocą :compilerpolecenia lub ustawić go bezpośrednio.

Możesz także przekazać dodatkowe argumenty :make. na przykład:make clean

Uwaga: Uruchomienie :makeczęsto pokazuje wynik polecenia na dole ekranu z monitem o naciśnięcie Enter. Wystarczy nacisnąć Enter, ponieważ wszystkie dane wyjściowe będą dostępne na liście szybkich poprawek. Możesz to stłumić za pomocą :silentnp :silent make.

Typowym niestandardowym poleceniem dla cichego wykonania jest:

command -nargs=* -bar Smake silent make <args> <bar> cwindow

lista szybkich poprawek

Po uruchomieniu :makelista poprawek będzie zawierać dane wyjściowe kompilatora.

Użyj następującego polecenia, aby poruszać się po liście poprawek.

  • :copen aby otworzyć okno poprawki
  • :cclose aby zamknąć okno poprawki
  • :cnext/, :cprevaby przejść do następnego / poprzedniego elementu
  • :ccaby wydrukować na dole aktualny błąd lub :cc 3pokazać konkretny błąd w tym przykładzie 3

Osobiście korzystam z nieuszkodzonej wtyczki Tima Pope'a, aby poruszać się po liście poprawek.

Co powiesz na :makeautomatyczne i ciche działanie?

Możesz to zrobić z :autocmddokładnie tak jak ty.

augroup auto_make
    autocmd!
    autocmd BufWritePost * silent make
    autocmd QuickFixCmdPost *make* cwindow
augroup END

Jako bonus dodałem, otwierając okno szybkiej poprawki przez, :cwindowjeśli występują jakieś błędy.

Uwaga: Powinny być bardziej szczegółowe z tym wzorcem pliku na BufWritePostautocmd, aby niepowiązane pliki nie budowały się.

Jest jeszcze więcej ?!

Wykorzystuje tylko kilka wbudowanych poleceń Vima oraz kilka autocmd do przekonania. Istnieją oczywiście wtyczki i narzędzia, które mogą ci pomóc

  • Dispatch.vim może służyć do :makeasynchronicznego uruchamiania zadań.
  • Składnia wtyczek syntastycznych sprawdza plik po :write.
  • Ale.vim (Asynchronous Lint Engine) to wtyczka zapewniająca przechwytywanie w NeoVim i Vim 8 podczas edycji plików tekstowych.
  • Unimpaired.vim ułatwia zarządzanie listą poprawek.
  • Zwykłe stare pliki makefile. Chyba że ./script.shjest to bardzo skomplikowane, możesz rozważyć użycie make. Może skalować wykonać więcej zadań później i jest popularnym narzędziem do budowania.
  • Możesz użyć Vim Awesome, aby wyszukać więcej wtyczek, które mogą pomóc.

Wniosek

Osobiście integruję :makei poprawkę do własnego przepływu pracy. Wierzę, że uchwycenie wyników procesu kompilacji i błędów jest warte inwestycji. Jako dodatkowy bonus, prawdopodobnie poczujesz się bardziej komfortowo z listą szybkich poprawek i możesz używać tej listy do innych aplikacji, takich jak :grep.

Aby uzyskać więcej pomocy, zobacz:

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc
Peter Rincker
źródło
Myślałem o tym, :makekiedy odpowiadałem na to pytanie, ale nie uwzględniłem tego. Lepszym pomysłem jest użycie make make fore compiling.
EvergreenTree,
jak zmienić autocmd, aby uruchomić makeprg tylko dla określonego pliku.
Ibn Saeed,