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?

hgiesel
sumber

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.

Christian Brabandt
sumber
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"

MS.Kim
sumber
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.

Benjamin Frazier
sumber
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"
pengguna1902689
sumber