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


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

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.


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


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>

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
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.