Komendy Bash wewnątrz vi

33

Czy można wpisać polecenie bash w vi i uzyskać standardowe wyjście?

Uważam, że często nużące jest zamykanie i ponowne otwieranie vi tylko dlatego, że chcę poszukać czegoś w skorupce.

harfa
źródło

Odpowiedzi:

45

Tak, np. Jeśli chcesz to zrobić ls, spróbuj:

:!ls

Aby spawnować powłokę, użyj

:shell

stokrotka
źródło
super, jak mógłbym bez tego żyć?
harfa
3
W rzeczywistości często robię to zapominając o uruchomieniu vi jako root podczas edytowania czegoś. To polecenie uratowało mnie od długiego przepisywania więcej razy, niż pamiętam. :w !sudo tee %
Mark D
1
Chciałbym, żeby był jakiś sposób, aby to zrobić w nano
GNU
1
a potem jak wrócić do edytora po użyciu: shell?
VaTo
@VaTo: Aby wrócić, możesz wpisać: exit
Raman Kathpalia
12

Zwykle używam ctrl+zdo spania vi, uruchamiam to, czego potrzebuję w powłoce, a następnie fgwznawiam vi. Nie do końca odpowiedź na twoje pytanie, ale uważam, że jest to bardzo szybki sposób na pracę.

Jeśli zapomnisz, że masz otwarte vi w tle (może się to zdarzyć, gdy jesteś zajęty), kiedy spróbujesz wylogować się z powłoki ctrl+d, zostaniesz ostrzeżony, że masz uruchomione zadania w tle i możesz je zamknąć, lub naciśnij ctrl + d ponownie, aby się wylogować. Ponadto, jeśli spróbujesz ponownie otworzyć ten sam plik dwukrotnie, pojawi się ostrzeżenie o odzyskiwaniu, więc możesz nacisnąć, aaby przerwać, i uruchomić klawisz fg, aby wrócić do vi.

Rqomey
źródło
1
Może to stać się lepkie, jeśli zostaniesz pochwycony tym, co robisz w wierszu poleceń i zapomnisz, że masz vima w tle.
Eliot Ball
1
Tak, jest to możliwe, sam to zrobiłem. Dla mnie warto mieć stałość skorupy. Zaktualizuję moją odpowiedź, aby uwzględnić Twój komentarz
Rqomey
1
Myślę, że lepiej byłoby użyć ekranu GNU.
user606723,
1
Sam używam tmux ... ale dla szybkości, a jeśli zaloguję się na serwerze bez tmuxa lub ekranu, jest to przydatne
Rqomey
11

Ponieważ wspomniałeś o „get stdout”, pamiętaj, że możesz to zrobić

:r! command

a wynik polecenia zostanie dodany do pliku, lub

:<range>!command

aby filtrować zawartość zakresu za pomocą polecenia [np. :1,$!wc]

Losowo 832
źródło
:%!commandwygląda całkiem przydatnie
Eliot Ball,
Używam tego często do sortowania linii [np. :.,+20 !sort]
Walter A
5

Mój preferowany idiom to

!!command

co jest skrótem od

:.!command

który poprowadzi bieżącą linię przez polecenie i wstawi dane wyjściowe do pliku. Najczęstszym przypadkiem jest dla mnie edycja polecenia za pomocą vi i uruchomienie:

!!sh

Lub

!<motion>command

takie jak (na przykład)

!apsh

aby uruchomić cały bieżący akapit przez powłokę.

Liudvikas Bukys
źródło
2
Uwaga: !}musisz znaleźć się na początku akapitu, spróbuj !ap. (Nie wiem, czy to jest w każdym vi czy tylko vimie)
Random832
4

Używając dwukropka i wykrzyknika, możesz uruchomić dowolne polecenie na ścieżce powłoki i skryptach powłoki, pamiętaj, że polecenie działa pod użytkownikiem uruchamiającym program vi / vim i korzystającym z jego środowiska.

:!<command>

Ponieważ vi korzysta ze środowiska, które obowiązywało podczas jego uruchamiania, używa tej samej ścieżki, która była w poleceniu nadrzędnym. Pamiętaj, że niektóre powłoki przechowują pamięć podręczną programów na ścieżce, a vi może nie działać z tą pamięcią podręczną (w zależności od powłoki, której używa i jej wersji), więc możesz skończyć z uruchomieniem niewłaściwego pliku binarnego, jeśli masz więcej niż jeden plik binarny o tej samej nazwie.

Didi Kohen
źródło
4

Możesz wyświetlić dane wyjściowe polecenia, wpisując na przykład :!ls -lhw trybie polecenia.

Jeśli chcesz wstawić wynik polecenia do edytowanego pliku, po prostu dodaj r. Na przykład :r!which perl.

Eliot Ball
źródło
1

Używanie !jest oczywiście poprawną odpowiedzią, ale jeśli często się zmieniasz, coś takiego jak screen lub tmux może być pomocne.

Ryan A.
źródło
0

Mam to w moim .vimrc. Znalezione w przepełnieniu stosu jakiś czas temu:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>
Clayton Stanley
źródło
0

Poradziłbym sobie z tym łatwo w Linuksie, otwierając dwa okna wiersza poleceń terminalu, uruchamiając vi w jednym i drugim dostępnym do innej pracy w tym samym czasie.

Harry Weston
źródło