Vim içinden “STDIN'den okuma” mesajını nasıl bastırabilirim?


18

Stdin'den okumak için Vim kullanırken, bilgilendirici bir mesaj yazdırır:

$ echo foo | vim -
Vim: Reading from stdin...

$

Bu sadece bir örnek. Gerçek kullanım kabuk yapılarına izin vermez. vim <(echo foo)bir seçenek değil.

Bunu yalnızca Vim seçeneklerini ve / veya vimrc ayarlarını kullanarak kaldırabilir miyim?


Bunun ne için olduğunu bilmeniz gerekiyorsa, Vim'i manajları (utanmaz fiş) okumak için kullanmaya çalışıyorum . GNU insanı kabuk yapılarına izin vermez MANPAGER, ve ftplugin/man.vimdiğer şeyleri kullanarak, sadece kullanarak rahat bir deneyim elde etmeyi başardım MANPAGER="vim -". Kalan son sıkıntı, gördüğüm her sayfadan sonra yazdırılan çirkin mesajdır.


Kullanılması export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'veya export MANPAGER="vim -"ben bir sorun göremiyorum? man lssayfayı beklendiği gibi açar.
Martin Tournoij

@Carpetsmoker ve kapattıktan sonra?
muru

Hayır, hiçbir şey göremiyorum ...
Martin Tournoij

@Carpetsmoker Hangi Vim sürümünü kullanıyorsunuz? Ne dersinecho foo | vim -Nu NONE -
muru

Vim'de, : help lessçağrı cihazı olarak kullanmak için bazı bilgiler verir.
mtklr

Yanıtlar:


8

Vim 8.0.1308 (Kasım 2017) ile başlayarak, --not-a-termbu mesajı bastırmak için seçeneği kullanabilirsiniz ; örneğin quit:

$ echo hello | vi - --not-a-term -esc '%p|q!'
hello

Veya exit:

$ echo hello | vi - --not-a-term -esc 'x!/dev/stdout'
hello

Olduğu gibi, bu eşdeğerdir cat, ancak girişe Vimscript uygulamak için, örneğin +'runtime! syntax/2html.vim'vurgulanan metni stil edilmiş HTML olarak dışa aktarmak için (çıkarılmış veya belirtilen dosya türü olduğu varsayılarak) yararlı olabilir. Şu ana kadar bahsedilenlerden başka birkaç seçenek var; akla ilk gelen mktempkomutun çıktısını saklamak ve bunu Vim'in girdisi olarak kullanmaktır. Komut sonucunu arabelleğe 'yapıştırmak' için Vim'in yönlendirme ve kabuk komutlarını ekleyebilirsiniz, ancak bu biraz daha fazla iş gerektirir. (Vim komut dosyaları, takma adlar kullanmak yerine uzun çağrıları otomatik hale getirebilir.)
John P

Bir soketten çıkışı düzenlemek / yapıştırmak mümkün olabilir, bu doğruysa gerçekten yararlı olabilir. Kabul edilen cevap için olanlardan daha kötü uyarılar olmadıkça, hala en iyi seçeneğin geçici bir dosya olduğunu söylüyorum. Bununla birlikte, belirli bir kabuk için, zshmisc (yönlendirmeler vb.) İçin kılavuzda listelenenler gibi, bu sürecin bir kısmını basitleştiren mevcut bir takma ad / yerleşik / sözdizimi olabilir. Bir tane daha - belki girişten kaçabilir ve tedarik edebilirsiniz ekleme moduna girilen bir argümandan sonra bir argüman olarak yazılır, böylece yazmış gibi ayrıştırılır
John P

--not-a-termUbuntu 16.04'te (Mac'te 7.4.8056 değil) Vim 7.4.1689'da görüyorum , ancak mesajı bastırmıyor.
sonraki duyuruya kadar duraklatıldı.

@DennisWilliamson Değişiklik günlüğüne bakın :help version8.txt. --not-a-termseçeneğinin kendisi eklendi 7.4.1419ve davranışı, Okumadan standart ... iletisini de bastırmak için değiştirildi 8.0.1308. (Bu arada, mesajı düzenlemek için N dosyalarından da bastırılır 8.1.1258)
ynn

12

Senin cevabı kesin soru:

Bunu yalnızca Vim seçeneklerini ve / veya vimrc ayarlarını kullanarak kaldırabilir miyim?

is: hayır, kodun aşağıdaki kısmı nedeniyle mümkün değil

    if (read_stdin)
    {
#ifndef ALWAYS_USE_GUI
        mch_msg(_("Vim: Reading from stdin...\n"));
#endif

yani -vim'e argüman verirseniz , o mesajı mekanik olarak gösterecektir.

ancak, bir çözüm olarak, -bağımsız değişken yerine bir dosya yeniden yönlendirme kullanırsanız , iletiden kurtulursunuz:

echo "foo" | vim < /dev/tty

ve işte MANPAGEsadece işe yarayan bir ayar örneği ™ (tüplerden alınır):

export MANPAGER='bash -c "vim -MRn -c \"set ft=man nomod nolist nospell nonu\" -c \"nm q :qa!<CR>\" -c \"nm <end> G\" -c \"nm <home> gg\"</dev/tty <(col -b)"'

2
Ne zaman bir ALWAYS_USE_GUI tanımlanmış, biliyor musunuz?
muru

2
bkz. feature.h (ALWAYS_USE_GUI tanımlanmadığında yapılır, bu nedenle temel olarak tüm unix sürümleri için).
Christian Brabandt

2
Geçici çözüm echo "foo" | vim < /dev/ttyçalışamıyor. Bunu yapmak verir [2]+ Stopped echo "foo" | vim < /dev/tty.
Léo Léopold Hertz 준영

2
@ LéoLéopoldHertz gibi, tty hilesi benim için işe yaramadı (gvim boş bir belge verir, vim klavye girişleriyle gerçekten karışır, ancak en azından bir SIGSTOP almaz). echo "foo" | gvim /dev/stdin(GUI olmayan vim hala bu konuda bir şikayet yayınlayacaktır rağmen) ile daha fazla şansım vardı Vim: Warning: Input is not from a terminal.
Adam Katz

2
Önceki mesajımı unut. Cevaptaki hile <(col -b)kısmen. Bu aslında catadam sayfalarını yazdırmak için bazı sofistike versiyonu ve sonunda vim'in mesajından kurtulabilirsinizecho test | vim < /dev/tty <(cat>
Alexander Solovets

1

Vim'de bu sorun 234d162işleme alındı (> = v8.0.1387).

Çözüm: Mesajın --not-a-termkullanıldığını gösterme.

Bu nedenle, mesaj yalnızca kullanıcı stdin'i yönlendirmediğinde görüntülenir.


Benzer konu olmuştur ele son sürümünde Neovim ( > = v0.2.2-dev yerine Vim kullanabilirsiniz).

NVim v0.2.2 yayınlandıktan sonra şunları çalıştırabilmeniz gerekir:

$ echo foo | nvim -

mesajı almadan.


0
  1. 8.0.1387 ve daha yeni sürümler vim ile --not-a-termseçeneği kullanabilirsiniz .

  2. Eski sürüm için aşağıdaki numarayı kullanın: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

İlk argüman, /dev/ttyVim'in girişin klavyeden geldiğini düşünmesini sağlıyor. Sanırım, isatty (3) bu dosya için True döndürür. İkinci argüman, standart girdisinden Vim'in standart girdisine kadar her şeyi geçer. Son olarak, kabuk desteklemiyorsa bash -cözel yapının <(...)çalışması için önek gereklidir . Gelen bash orijinal çözüm basitleştiirlebilir $ echo foo | vim < /dev/tty <(cat)


Bunların her ikisi de mevcut cevaplarda veya sorunun kendisinde ele alınmıştır. Burada yeni ne var?
muru

@muru İkinci davanın nasıl çalıştığı açıklanmadı ve insanlar neden sadece MANPAGE'de çalıştığını merak ediyorlardı.
Alexander Solovets
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.