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
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
Odpowiedzi:
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
:r!echo
bez zmiany bufora.
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.txt
i 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 #
:new
tworzy podział poziomy, użyj, :vnew
jeśli chcesz zamiast tego podział pionowy i :tabnew
dla nowej karty.
:tabnew | enew | r ! <your shell cmd>
pracuje dla mnie.
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>