Jak przekierować dane wyjściowe polecenia do vima w bash?

87

Próbuję przekierować dane wyjściowe polecenia bash do nowego pliku.

Jeśli spróbuję potoku, jak poniżej:

ls -la | vim

Bash pokazuje mi błędy:

Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

Wiem, że mogę otworzyć Vima, a następnie użyć:

:r !ls -la

Ale czy istnieje sposób, aby to zrobić w samym bashu, aby Vim został otwarty, a dane wyjściowe wklejone tam automatycznie?

faizal
źródło

Odpowiedzi:

140

Możesz użyć podstawiania procesów (działa to również z aplikacjami, które nie potrafią czytać STDIN):

vim <(ls -la)

Lub użyj vimfunkcji do odczytu z STDIN:

ls -la | vim -
chaos
źródło
2
<(ls -la)jest faktycznie podstawieniem procesu, a nie podstawieniem polecenia .
Eliah Kagan
1
Naprawdę podoba mi się opcja vima, pozwala mi łatwo wyszukiwać, znajdować i zapisywać dane wyjściowe ze zrzutów danych.
Josue Alexander Ibarra
38

Jesteś naprawdę blisko. Brakowało Ci tylko jednej postaci.

ls -la | vim -
Cris Holdorph
źródło
10
Technicznie są to dwie postacie. ;)
Cory Klein
19

Oto inne podejście, mam nadzieję, że nauczy kogoś czegoś nowego.

Jeśli wiesz, że polecenie :r !ls -ladziała w vimie, możesz wykonać następujące czynności, aby otworzyć vim i sprawić, aby uruchomił polecenie, gdy tylko się otworzy, prosto z bash:

vim -c ':r! ls -la'

Jest to odpowiednik otwarcia, vima następnie wykonania polecenia :r! ls -la. Powinno to działać z każdym vimpoleceniem, w którym polecenie występuje po -copcji.

Alaa Ali
źródło
12

Możesz powiedzieć vimowi, aby otworzył standardowe wejście:

ls -la | vim -
niepewny
źródło
1

Jeśli Twoim celem jest po prostu umieszczenie danych wyjściowych w pliku tekstowym, nie musisz wywoływać vima. Bash może to zrobić sam

ls -la > outputfile.txt
Jake Stewart
źródło
1

setlocal buftype=nofile

Jest to dobra opcja, jeśli zamierzasz utworzyć alias, aby zastąpić less:

seq 100 | vim +':setlocal buftype=nofile' -

Teraz nie musisz pisać! do wyjścia.

Inną opcją jest:

seq 100 | vim +'nnoremap q :quit!' -

więc możesz wyjść za pomocą just q<enter>.

Ciro Santilli
źródło
Dobry pomysł. Zdecydowanie krótszy niż pisanie tak długo! :)
kode