Saat menggunakan Vim untuk membaca dari stdin, ia mencetak pesan yang informatif:
$ echo foo | vim -
Vim: Reading from stdin...
$
Ini hanya sebuah contoh. Penggunaan aktual tidak memungkinkan konstruksi shell. vim <(echo foo)
bukan pilihan.
Bisakah saya menekannya dengan hanya menggunakan opsi Vim dan / atau pengaturan vimrc?
Jika Anda perlu tahu untuk apa ini, saya mencoba menggunakan Vim untuk membaca halaman manual (plug shameless). Orang GNU tidak mengizinkan shell konstruksi di MANPAGER
, dan dengan menggunakan ftplugin/man.vim
dan hal-hal lain, saya telah berhasil berhasil memiliki pengalaman yang nyaman menggunakan adil MANPAGER="vim -"
. Gangguan terakhir yang tersisa adalah pesan yang tidak sedap dipandang dicetak setelah setiap halaman yang saya lihat.
export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'
atauexport MANPAGER="vim -"
saya tidak melihat masalah?man ls
membuka halaman manual seperti yang diharapkan.echo foo | vim -Nu NONE -
: help less
berikan beberapa info untuk menggunakannya sebagai pager.Jawaban:
Dimulai dengan Vim 8.0.1308 (Nov 2017), Anda dapat menggunakan
--not-a-term
opsi untuk menekan pesan ini; misalnya denganquit
:Atau dengan
exit
:sumber
cat
, tetapi masih bisa berguna untuk menerapkan Vimscript ke input, misalnya+'runtime! syntax/2html.vim'
untuk mengekspor teks yang disorot sebagai gaya HTML (dengan asumsi tipe file yang dikurangi atau ditentukan). Ada beberapa opsi selain yang disebutkan sejauh ini; yang pertama terlintas dalam pikiran adalah menggunakanmktemp
untuk menyimpan output perintah dan menggunakan ini sebagai input Vim. Anda bisa menambahkan perintah pengalihan dan shell Vim untuk 'menempelkan' hasil perintah ke dalam buffer, tetapi ini membutuhkan lebih banyak pekerjaan. (File skrip Vim dapat mengotomatiskan pemanggilan yang panjang alih-alih menggunakan alias.)--not-a-term
di Vim 7.4.1689 di Ubuntu 16.04 (tetapi tidak 7.4.8056 di Mac), tetapi tidak menekan pesan.:help version8.txt
.--not-a-term
Opsi itu sendiri ditambahkan7.4.1419
dan perilakunya diubah untuk juga menekan pesan Reading dari stdin ... di8.0.1308
. (Ngomong-ngomong, file N untuk mengedit pesan juga ditekan dari8.1.1258
)Jawaban untuk pertanyaan persis Anda :
adalah: tidak, itu tidak mungkin karena bagian kode berikut
yang berarti bahwa jika Anda memberikan
-
argumen untuk vim, maka itu akan secara otomatis menunjukkan pesan itu.meskipun, sebagai solusi, jika Anda menggunakan pengalihan file alih-alih
-
argumen Anda akan menyingkirkan pesan:dan inilah contoh
MANPAGE
pengaturan yang hanya berfungsi ™ (diambil dari intertubes):sumber
ALWAYS_USE_GUI
didefinisikan, kau tahu?echo "foo" | vim < /dev/tty
menyelesaikannya. Melakukannya memberi[2]+ Stopped echo "foo" | vim < /dev/tty
.echo "foo" | gvim /dev/stdin
(meskipun vim non-GUI masih akan mengeluarkan keluhan tentang ituVim: Warning: Input is not from a terminal
:).<(col -b)
sebagian. Pada dasarnya itu adalah beberapa versi canggihcat
untuk mencetak halaman manual, dan Anda akhirnya dapat menyingkirkan pesan vim denganecho test | vim < /dev/tty <(cat>
Di Vim, masalah ini telah diatasi di
234d162
commit (> = v8.0.1387).Jadi pesan hanya ditampilkan ketika pengguna belum mengalihkan stdin.
Masalah serupa telah diatasi dalam versi terbaru Neovim ( > = v0.2.2-dev ) yang bisa Anda gunakan sebagai ganti Vim.
Setelah NVim v0.2.2 dirilis, Anda seharusnya dapat menjalankan:
tanpa pesan.
sumber
Dengan vim versi 8.0.1387 dan yang lebih baru, Anda dapat menggunakan
--not-a-term
opsi.Untuk versi yang lebih lama gunakan trik berikut:
$ echo foo | bash -c 'vim < /dev/tty <(cat)'
Argumen pertama
/dev/tty
entah bagaimana menipu Vim untuk berpikir input berasal dari keyboard. Saya kira, itu karena isatty (3) mengembalikan True untuk file itu. Dan argumen kedua hanya melewati segala sesuatu dari input standarnya ke input standar Vim. Akhirnya,bash -c
awalan diperlukan agar konstruksi khusus<(...)
berfungsi jika shell tidak mendukungnya. Dalam bash solusi asli dapat disederhanakan$ echo foo | vim < /dev/tty <(cat)
sumber