Standart girdiden içerik nasıl düzenlenir?


15

Henüz dosya olmadan dinamik olarak komut satırından oluşturulan vim içeriği düzenlemek istiyorum.

Örnek olarak:

$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin

ancak hatalarla başarısız oluyor:

Vim: Uyarı: Giriş bir terminalden değil

Vim: Giriş okunurken hata oluşuyor, çıkıyor ...

Bunu başarmak mümkün mü?


:help stdin... Yerleşik belgelerle ilgili sorularını sorarak cevapları ne kadar hızlı bulabileceği şaşırtıcı.
dash-tom-bang

Yanıtlar:


24

-Komut satırında dosya adı yerine kullanmanız gerekir :

echo This is example. | vim -

Yukarıdaki komut, standart girdiden okunan metinle dolu adsız bir arabellek açacaktır.


7
-For stdin kullanmak komut satırı araçları için oldukça standarttır;
Martin Tournoij

6

Bu çoğunlukla eğlenceli bir nottur bashve readlineancak EDITORortam değişkeninizi olarak ayarlarsanız vim, Ctrl+ x+ tuşuna basmak egeçerli satırı açar vim. Ayrıca, Meta(Alt/Opt/Esc)+ Ctrl+ yazarsanız e, bash geçerli komut satırında yerinde genişletme gerçekleştirir, yani:

$ echo $EDITOR # Assuming EDITOR was set

Meta(Alt/Opt/Esc)+ Ctrl+ ile eolur

$ echo vim # Assuming EDITOR was set

Ctrl+ x+ ile eolur

1 echo vim # Assuming EDITOR was set
~
~
/tmp/sometmpbufferfile

Vim'den çıkıldığında, vim arabelleğinin içeriğinin komut satırında yürütüldüğünü unutmayın.

Bu özellikler, burada deyimler gerektiren döngüler veya programlar gibi bash'da çok satırlı komutlar yapmak istediğimde benim için çok yararlı olur ve daha sonra kullanmak üzere dosyaya biraz komut satırı geçmişi kaydetmek için ilginç bir yol sağlar.

Böylece orijinal soruya cevap vermek için,

$ This is an example

ve yüklemek için Ctrl+ x+ düğmesine ebasın vim. Ayrıca,

 $ $(cat /etc/hosts)

ve Meta(Alt/Opt/Esc)+ Ctrl+ esonra Ctrl+ + ' xyı yapın e; bu, tüm hosts dosyasını bir satıra yerleştirir ve yükler vim(muhtemelen bu özelliklerin en iyi şekilde kullanılmaması - ancak, bu yöntemlerin kullanışlılığı tartışılan birkaç örnekten çıkarılabilir. buraya).

Modunuzun readlineayarlanmış olduğunu varsayıyorum emacs. Modunuz moda readlineayarlanmışsa vim, komutu kullanarak ilgili bağlantıları kolayca keşfedebilirsiniz:

bind -p

ve sırasıyla + + ve + + bağlarıyla ilişkili olan edit-and-execute-commandya da shell-expand-linebunların aranması .CtrlxeMeta(Alt/Opt/Esc)Ctrle


Bash'a emacs yerine vi anahtar bağlamaları kullanmasını söyleyebilirsiniz. set -o viAçmak için kullanın . Ardından v, düzenleyicinizdeki geçerli komutu düzenlemek için eşlemeyi normal modda kullanabilirsiniz.
Quincy Bowers

1
Bu, vi kullanarak komut satırını düzenlemek için harika bir numaradır, ancak stdin'den metin okumak için bu yöntemi kullanarak en az iki sorun vardır: 1. shell-expand-linegenişletilmiş metinden yeni satırları kaldırın ve 2. edit-and-execute-commandarabellekte yazılmış komutu çalıştırmayı deneyin , kaydedilmiş olsun ya da olmasın, vi.
toro2k

Vay, bu harika. Her gün readline hakkında yeni bir şey öğreniyorum, öyle görünüyor ...
Doorknob

2

Bash'da <(command)sözdizimini kullanarak işlem ikamesi kullanmayı yararlı buldum , örneğin:

vim <(echo This is example.)
vim <(cat /etc/hosts)

Ayrıca bakınız:


4
Not Bu irade olmaz tüm kabuklarda çalışır. Ben sadece çalışacak düşünüyorum bashve zsh(ve sh, ksh, dash, fish, csh, tcsh, vb)
Martin Tournoij

@Carpetsmoker Bence ksh88 ve üzerinde çalışmalı, ama evet, süreç ikamesi POSIX değil.
muru

4
Ve kendinizi kandırmamaya dikkat edin! Vim'i bu şekilde başlattığınızda, benzer bir dosya için bir arabellek açar /proc/PID/fd/FD. Arabelleği yazar ve çıkarsanız, Vim şikayet etmez, ancak yazdığınız dosya işletim sistemi tarafından kaldırılır. Kullanılması -dosya adı olarak açılmış tampon Eğer Vim sizi uyarır tasarrufu (uzun gibi bir patlama komutu veya benzeri kullanmayın) olmadan bırakmayı deneyin eğer öyleyse onunla ilişkili hiçbir dosya var.
toro2k

1
Bu güzel çünkü iyi genelleme vimdiff <(echo foo) <(echo bar).
wchargin

@ toro2k Takip etmek için, akışı kullanıyor :nextve :prevakışı yeniden okuyor ve hiçbir şey almıyor . Ayrıca, süreçlerin birbirine paralel olmadığını (örneğin cat <(sleep 3; echo a) <(echo b)sırayla yazdırır) ve catserpiştirmeler yazarken ve okurken, vimdış çerçeve hariç tümünü görüntülemeden önce dosyayı "okumayı bitirmeyi" bekler.
John P

-1

Yeni bir Vim'e boru hattı kullanmak bir zorunluluk değilse, Vim'in komutların çıktısını geçerli arabelleğe çekme yeteneğini kullanabilirsiniz, dosya destekli bir arabelleğe sahip olmakla ( :newvarolmayan bir dosyada olduğu gibi veya var olan bir dosyayı düzenlerken)

:read!cat /etc/hosts komut kipinde, çıktıyı geçerli imlecinizin altındaki geçerli arabelleğinize yerleştirir.

Bu, boş bir arabellek üzerinde yapıldığında kalan boş ilk satırı silmek zorunda kalmanın yanı sıra, bu iyi çalışır ve özellikle Vim zaten çalışıyorsa uygundur.


1
Bu soruya nasıl cevap veriyor?
muru

Komutun çıktısını alır ve vim'e koyar.
ewatt
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.