Przesyłaj dane wyjściowe polecenia powłoki (!) Do nowego bufora w Vimie

35

Jak mogę potokować wyjście polecenia powłoki do nowego bufora w Vimie? Następujące rzeczy oczywiście nie działają, ale możesz zobaczyć, o co mi chodzi:

:!echo % | :newtab
Richie Marquez
źródło
1
stackoverflow.com/questions/3826003/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

27

Nie można potokować danych wyjściowych polecenia powłoki do polecenia, które tworzy nowy bufor, ale można utworzyć nowy bufor i odczytać dane wyjściowe polecenia powłoki do tego bufora za pomocą jednego wpisu w wierszu poleceń Vima. Działająca wersja twojego przykładu to

:tabnew | r !echo <c-r>=bufname("#")<cr>

Zauważ, że symbol potoku w tym przypadku jest separatorem między poleceniami ex Vima, a nie potokiem powłoki. Zobacz też

:help :tabnew
:help :r!
:help :bar
garyjohn
źródło
To prawie dokładnie to, czego potrzebuję, na odwrót, aby uzyskać dostęp do nazwy pliku bieżącego bufora. Uwaga: zaktualizowałem pytanie, aby, mam nadzieję, wyjaśnić pożądany wynik końcowy.
Richie Marquez,
@Richard Marquez: zaktualizowałem tę odpowiedź. nowa karta jest teraz otwierana ze „starą” nazwą pliku, więc możesz wywołać
:!
Ale nie :r!echobez zmiany bufora.
Luc Hermitte,
2
@garyjohn, akira: dzięki za pomoc. Część „<cr> = ...” popełniła błędy wyrzucania Vima, ale udało mi się go uruchomić z „: tabnew | r! Echo #”.
Richie Marquez,
1
Warto również zauważyć, że jeśli chcesz zamapować to na klucz w .vimrc, musisz zastąpić | znak za pomocą <bar>.
Richie Marquez
16

Oto co robię. Nawiązuje to do komentarzy w powyższych odpowiedziach.

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

Przykład 1 : Znajdź wszystkie pliki tekstowe w/tmp

:new | r ! find /tmp -name '*.txt'

Przykład 2 : Edytujesz plik foo.txt i chcesz uruchomić ls -la foo.txti pobrać dane wyjściowe do bufora:

:new | r ! ls -la #

Jest #on zastępowany nazwą pliku oryginalnego bufora, który edytujesz. Jest to szczególnie przydatne w przypadku poleceń kontroli źródła ad hoc, np

:new | r ! hg annotate -un #

:newtworzy podział poziomy, użyj, :vnewjeśli chcesz zamiast tego podział pionowy i :tabnewdla nowej karty.

przemyśleć
źródło
Czy jesteś w stanie odpowiedzieć na to pytanie tutaj , jak również? chodzi o próbę użycia bieżącego buforu z %następnym buforem oprócz E499.
hhh
4
:tabnew | enew | r ! <your shell cmd>

pracuje dla mnie.

justrajdeep
źródło
2

Jeśli naprawdę potrzebujesz zapisać wynik w nowym buforze, ale potrzebujesz informacji ze starego bieżącego bufora, możesz użyć system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

lub zapisz bieżącą nazwę bufora na później :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>
Luc Hermitte
źródło
zobacz drugą odpowiedź, możesz to zrobić bez zapisywania nazwy w zmiennej. ale i tak dobra odpowiedź.
akira
W rzeczy samej. Nie byłem pewien, czy w tym przypadku „#” da oczekiwany wynik - ponieważ nigdy nie używam tabulatorów
Luc Hermitte