Komut satırından standart çıktıya tam tampon nasıl yazılır?


10

/dev/stdoutDosya yerine tüm çıktıyı standart çıktıya ( ) yazmak istiyorum ve dosyayı düzenlerken aşağıdaki komut beklendiği gibi çalışıyor:

:w >> /dev/stdout

İpucu: Ekranı yenilemek için Control+ tuşuna basın L.

Ancak, komut satırından ( etkileşimli olmayan ) aynı şeyi yapmaya çalıştığımda beklendiği gibi çalışmıyor , örneğin:

$ echo This is example. | vim - '+:w >> /dev/stdout' '+:q!'
Vim: Reading from stdin...

İle aynı :w !tee, :x! /dev/stdout, :%printve benzeri.

Önce söylediğini, çıkın: [Device] 1L, 17C appended.

Vim'i standart girişi bir borunun ortasındaki standart çıkışa yazmaya zorlamanın bir yolu var mı? Belki bir şekilde tamponludur?


4
Sadece merak ediyorum, ne yapmaya çalışıyorsun? İçinde olduğu gibi, vim sizin için burada başka bir aracın yapamayacağı ne yapacak?
Jay Thompson

1
@JayThompson vimyerine dosya ayrıştırma için kullanmaya çalışıyorum sed(örneğin birden çok büyük dosyalarda toplu tekrarlanan karmaşık değişiklikler). Örnek, basit tutmak ve başka bir gönderinin potansiyel kopyasını yapmak için hiçbir şey yapmaz .
kenorb

Vipe'yi biliyorsun, bu yüzden kullanmamanın herhangi bir nedeni var mı?
muru

muru Henüz kullanmadım, fazla doküman mevcut değil ve burada konu dışı .
kenorb

Vipe ile ilgili sorular olabilir, ancak bunun cevabı olamamasının bir nedeni yoktur. Bu yüzden neden cevap olarak göndermemem gerektiğini merak ediyorum.
muru

Yanıtlar:


9

Tamponu standart çıktıya kabuk olarak yazdırmak için vimEx modunda başlaması gerekir, aksi takdirde kendi penceresiyle "normal" şekilde açılır ve çıkıldığında çıktı tamponlarını temizler.

İşte en basit çalışma örneği:

$ echo foo | vim -e '+%print' '+q!' /dev/stdin
foo

veya daha kısa:

$ echo foo | ex +%p -cq! /dev/stdin
$ echo foo | ex +"%p|q!" /dev/stdin

Not: Komut vim -etemel olarak exkomuta eşdeğerdir .

/dev/stdinEk can sıkıcı mesajları önlemek için standart girişe özel dosya tanımlayıcı belirtilmelidir ( ) (aşağıda açıklandığı gibi).


İşte ayrıştırma dizeleri içeren bazı örnekler:

$ echo This is example. | vim -e '+s/example/test/g' '+%print' '+q!' /dev/stdin
This is test.
$ echo This is example. | vim - -es '+s/example/test/g' '+%print' '+q!'
Vim: Reading from stdin...
This is test.

Not: Son örnek, gizlemek mümkün olmayan ekstra sinir bozucu mesajı gösterir, çünkü tüm dosyayı hafızaya okumak ve standart girdiden okunduğunu söylemek için standart bir strateji. İlk örnek mesaj olmadan çalışır, çünkü dosya dosya sonu ( EOF ) sinyali olmadan sonsuz veri üretir , bu nedenle giriş okumasının sonuna asla ulaşmaz.


İlişkili:


1
Sadece yapmak +q!yerine yapabilirsin +:q!, değil mi?
Andrew

@AndrewMacFie Aynı şey, güncellenmiş, teşekkürler.
kenorb

3

vipemoreutilspaketin bir parçası olan boru hatlarını düzenlemek için kullanışlı bir araçtır . Editörler için bir sarıcıdır ( viadını veren de dahil ). O kullanır EDITORfaydalanmak diğer araçları gibi, bu yüzden, editör ayarlamak için ortam değişkeni EDITOR(örneğin crontab, visudovs.) o değişkeni kullanarak yapabilirsiniz komut eylemleri. Örneğin, bunu yapmak için değiştirebilirsiniz:

$ echo foo | EDITOR='vim +:s/foo/bar/ +wq' vipe | tail
bar

Tabii ki, karmaşık eylemler cehennemden alıntı yapabilir, böylece bir senaryo yazabilirsiniz:

#! /bin/sh

vim "+:s/foo/bar" '+wq' "$@"

Ve kullanın EDITOR="sh /path/to/script".

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.