Cara menampilkan hasil dari perintah vim ke shell


11

Katakanlah saya di shell ( bash) dan ingin melihat output yang :scriptnamesakan memberikan, tetapi tidak ingin memulai vim atau mungkin saya ingin mengulanginya ke file lain.

Jadi saya mengeksekusi

vim +scriptnames

Yang menunjukkan kepada saya semua skrip, tetapi bagaimana saya menggemakannya ke stdout shell?

Jawaban:


10

Itu terjadi, karena biasanya Vim beralih ke layar alternatif dan berfungsi di sana. Setelah keluar, Vim akan beralih kembali dan karena itu Anda tidak melihat apa pun yang tersisa dari sesi Vim Anda, tetapi hasil dari perintah dieksekusi bahkan sebelum memulai Vim.

Fitur ini dijelaskan di :h xterm-screens (tautan)

Jadi pada dasarnya Anda tidak menginginkan itu dan karena itu ingin menonaktifkannya. Anda dapat melakukannya, dengan mengatur :set t_ti= t_te=kode terminal yang melakukan ini menjadi kosong.

Menyatukan semuanya, Anda ingin memulai Vim seperti ini:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Kami mengatur ulang 'more'opsi, sehingga Anda tidak melihat klik-tekan-masuk.


1
Ini LUAR BIASA, terima kasih banyak! Saya sebenarnya ragu ini mungkin.
hgiesel

Apakah ini memungkinkan untuk menggunakan VIML sebagai bahasa scripting sistem lengkap dengan membiarkannya menulis ke stdout (untuk yang terutama masokis)?
shadowtalker

1
Satu masalah dengan ini adalah saya tidak dapat menggulir terminal. (Jika teks lebih panjang dari ketinggian terminal saya, saya tidak bisa melihat bagian atas) Teks juga menghilang jika saya membuka vim kemudian keluar.
FDinoff

@FDinoff Itulah gunanya pager less. Hanya pipa itu menjadi kurang seperti itu vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. Tata letak mungkin kacau pada awalnya (ada di terminal saya), tapi setelah menekan <CL> semuanya bagus dan keren.
hgiesel

Saya melihat tidak ada output saat berjalan vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', hanya ada "flash cepat", perintah keluar dengan kode 0, tidak ada output. Apakah saya melewatkan sesuatu?
TrungDQ

3

Kita juga bisa menggunakan :redirperintah untuk mengarahkan ulang hasil perintah vim ke file

Sebagai contoh,

vim -c "redir! > vimout | scriptnames | redir END | q"

Ini mengarahkan ulang output scriptnameske dalam file "vimout"


1

Saya menghargai jawaban yang diberikan oleh Christian Brabandt tapi saya pikir jawaban yang lebih baik adalah dengan memisahkan perintah berhenti menggunakan perintah -c seperti:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

Menggunakan metode ini berarti Anda dapat merangkai sejumlah perintah yang berbeda bersama-sama dan kemudian menggunakan 'q!' Akhir untuk keluar dari vim.


0

Untuk situasi di mana Anda membutuhkan vim untuk dimuat penuh seolah-olah Anda memulainya secara manual, ini berfungsi:

vim -c "autocmd! CursorHold * <commands to run>"

Sebagai contoh, saya ingin mengarahkan output :mapke file dari shell, tetapi saya ingin menangkap pemetaan yang vim-airline ciptakan hanya setelah itu ditampilkan tabline-nya (baris di atas menunjukkan semua buffernames terbuka.) Karena sepertinya melakukan ini tidak sinkron, hanya menjalankan -credirect ke file tidak memberikan waktu untuk membuat pemetaan. Mungkin ada cara yang lebih baik, tetapi ini bekerja untuk saya, terutama karena saya sudah updatetimemengatur ke 100(0,1 detik), yang mempengaruhi berapa lama sampai CursorHoldacara tersebut menyala. Secara default, vim menetapkannya menjadi 4 detik.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.