Vi içindeki Bash komutları


33

Vi'nin içine bash komutu yazıp stdout'u almak mümkün müdür?

Sadece kabuğundaki bir şeye bakmak istediğim için vi'yı kapatıp tekrar açmanın sıkıcı olduğunu düşünüyorum.

Yanıtlar:


45

Evet, örneğin, yapmak istiyorsanız ls, şunu deneyin:

:!ls

Bir kabuk üretmek için,

:shell


harika, bu olmadan nasıl yaşayabilirim?
arp

3
Aslında sık sık yaptığım bir şey, bir şeyi düzenlerken vi'yi root olarak çalıştırmayı unutmaktır. Bu komut beni uzun tekrar yazmalardan hatırlayabildiğimden daha fazla kurtardı. :w !sudo tee %
Mark D,

1
keşke bunu nano
gnu'da

1
ve sonra kullandıktan sonra editöre nasıl geri dönersin: shell?
VaTo

@VaTo: Geri dönmek için şunu yazabilirsiniz: exit
Raman Kathpalia

12

Vi'yi ctrl+zuyumaya meyilliyim , kabuğumda ihtiyacım olanı koştum, sonra fgvi'yi sürdürmek için. Tam olarak sorunuza bir cevap değil ama çalışmanın çok hızlı bir yolunu buldum.

Arka planda açık bir vi olduğunuzu unutursanız (bu, meşgul olduğunuzda gerçekleşebilir), kabuk kullanarak oturumu ctrl+dkapatmaya çalıştığınızda, arka planda çalışan işleriniz olduğu konusunda uyarılırsınız ve bunları kapatabilirsiniz, veya oturumu kapatmak için tekrar ctrl + d tuşlarına basın. Ayrıca, aynı dosyayı iki kez yeniden açmaya çalışırsanız, kurtarma uyarısı alırsınız, böylece aiptal etmek için tuşuna basıp vi'ye geri dönmek için fg komutunu çalıştırabilirsiniz.


1
Komut satırında ne yaptığınıza yetişirseniz bu durum yapışkanlaşabilir ve arka plandaki vim'i unuttuğunuzu unutmayın.
Eliot Ball

1
Evet, mümkün, kendim yaptım. Benim için kabuk istikrarına sahip olmak buna değer.
Yorumunuzu

1
Gnu ekranını kullanmaktan daha iyi olacağını düşünüyorum.
user606723, 11:12

1
Kendim için tmux kullanıyorum ... ama hız için ve tmux veya ekran olmadan bir sunucuya giriş yaptıysanız, bu kullanışlı
Rqomey

11

"Stdout'u al" dediğinizden, yapabileceğinizi unutmayın

:r! command

ve komutun çıktısı dosyaya eklenecektir, veya

:<range>!command

aralık içerisindeki içeriğin [eg :1,$!wc] komutuyla filtrelenmesini sağlamak


:%!commandoldukça kullanışlı görünüyor
Eliot Ball

Bunu sık sık satırları sıralamak için kullanıyorum [örneğin :.,+20 !sort]
Walter A

5

Tercih ettiğim deyim:

!!command

hangi için steno

:.!command

Geçerli satırı komuttan geçiren ve çıktıyı dosyaya ekleyen. Benim için en yaygın örnek, vi komutuyla komutu düzenlemek ve çalıştırmak:

!!sh

Veya

!<motion>command

gibi (örneğin)

!apsh

Geçerli paragrafın tamamını kabuk boyunca çalıştırmak için.


2
Not için !}size paragrafın başında konumlandırılmış lazım, deneyin !ap. (Bunun her vi ya da sadece
vim'de

4

İki nokta ve ünlem işareti kullanarak kabuk yolu ve kabuk komut dosyalarındaki herhangi bir komutu çalıştırabilir, komutun vi / vim programını çalıştıran ve ortamını kullanan kullanıcının altında çalıştığını unutmayın.

:!<command>

Vi, çalıştırıldığında geçerli olan ortamı kullandığından, ana komuttakiyle aynı yolu kullanır. Bazı mermilerin yoldaki programların bir önbelleğini koruduğunu ve vi'nin bu önbellekle çalışmayabileceğini (kullandığı kabuğa bağlı olarak ve sürümüne bağlı olarak çalışmayabileceğini) unutmayın, bu nedenle yanlış ikili dosyayı çalıştırmanız gerekebilir. Aynı ada sahip birden fazla ikili dosya.


4

Komutun çıktısını, örneğin :!ls -lhkomut modunda yazarak görebilirsiniz .

Komutun çıktısını, düzenlediğiniz dosyaya eklemek isterseniz, sadece bir tane ekleyin r. Örneğin :r!which perl,.


1

Kullanılması !açıkçası Doğru cevap, ancak ekranı gibi ileri geri sık sık bir şeyler anahtarlama veya eğer tmux de yararlı olabilir.


0

Bu benim .vimrc içinde var. Stack Overflow'ta bir süre önce bulundu:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>

0

Aynı anda vi'yi diğerinde de çalıştırabilen iki terminal komut satırı penceresi açarak ve Linux'ta kolayca halledebilirdim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.