Jak wyprowadzać wynik poleceń vima do powłoki


11

Powiedzmy, że jestem w powłoce ( bash) i chcę zobaczyć dane wyjściowe, które :scriptnamesby dawały, ale nie chcę uruchamiać vima, a może chcę to powtórzyć w innym pliku.

Więc wykonuję

vim +scriptnames

Który pokazuje mi wszystkie skrypty, ale jak mogę to powtórzyć w standardowym interfejsie powłoki?

Odpowiedzi:


10

Dzieje się tak, ponieważ zwykle Vim przełącza się na alternatywny ekran i tam działa. Po wyjściu, Vim przełączy się z powrotem i dlatego nie zobaczysz nic z sesji Vima, ale wynik polecenia wykonanego nawet przed uruchomieniem Vima.

Ta funkcja jest wyjaśniona na :h xterm-screens (link)

Więc w zasadzie nie chcesz tego i dlatego chcesz to wyłączyć. Możesz to zrobić, ustawiając :set t_ti= t_te=kody terminali, które to wykonują, na puste.

Podsumowując, chciałbyś uruchomić Vima w ten sposób:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Resetujemy tę 'more'opcję, abyś nie widział monitu o naciśnięcie klawisza Enter.


1
To NIESAMOWITE, dziękuję bardzo! Wątpiłem, czy to możliwe.
hgiesel

Czy dzięki temu można używać VimL jako pełnoprawnego języka skryptowego systemu, pozwalając mu pisać na standardowe wyjście (dla szczególnie masochistycznych)?
shadowtalker 17.07.16

1
Jednym z problemów jest to, że nie mogę przewinąć terminala. (Jeśli tekst jest dłuższy niż wysokość mojego terminalu, nie widzę góry). Tekst znika również, jeśli otworzę vima, a następnie zakończę.
FDinoff,

@FDinoff Po to lesssą takie pagery . Po prostu potnij to w mniej podobny sposób vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. Układ może być zepsuty na początku (jest w moim terminalu), ale po naciśnięciu <CL> wszystko jest ładne i eleganckie.
hgiesel 17.07.16

Nie widzę żadnych danych wyjściowych podczas działania vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', jest tylko „szybki flash”, polecenie kończy się kodem 0, brak danych wyjściowych. Czy coś brakuje?
TrungDQ,

3

Możemy również użyć :redirpolecenia, aby przekierować wyniki poleceń vima do pliku

Na przykład,

vim -c "redir! > vimout | scriptnames | redir END | q"

To przekierowuje wyjście scriptnamesdo pliku „vimout”


1

Doceniam odpowiedź udzieloną przez Christiana Brabandta, ale myślę, że lepszym rozwiązaniem byłoby oddzielenie polecenia zakończenia za pomocą innego polecenia -c, takiego jak:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

Użycie tej metody oznacza, że ​​możesz połączyć razem kilka różnych poleceń, a następnie użyć końcowego „q!” wyjść z Vima.


0

W sytuacjach, gdy potrzebujesz pełnego załadowania vima, tak jakbyś uruchomił go ręcznie, działa to:

vim -c "autocmd! CursorHold * <commands to run>"

Na przykład chciałem przekierować wyjście :mapdo pliku z powłoki, ale chciałem uchwycić mapowanie, które vim-Airlines tworzy dopiero po wyświetleniu jego tabulatora (linia u góry pokazująca wszystkie otwarte nazwy buforów). Ponieważ wydaje się, że to robi to asynchronicznie po prostu uruchomienie -cprzekierowania do pliku nie dawało mu czasu na mapowanie. Może być lepszy sposób, ale to działa dla mnie, zwłaszcza, że updatetimeustawiłem już 100(0,1 sekundy), co wpływa na to, jak długo CursorHoldzdarzenie się uruchomi . Domyślnie vim ustawia go na 4 sekundy.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.