Jalankan skrip bash dari vim

21

Saya menggunakan vim untuk skrip bash. masalahnya kadang-kadang saya tidak ingin membuat file baru, membuatnya dapat dieksekusi, menjalankannya dan kemudian menghapusnya. Maksud saya skrip yang akan digunakan hanya sekali.

Misalnya saya buka vim dan ketik ini:

#!/bin/bash

ll | while read line
do
    echo $line
done

Saya tidak menyimpan file ini, saya hanya menggunakan vim untuk menyederhanakan bash-scripting. Saya tahu saya bisa menjalankan perintah bash via !in vim. Tapi bagaimana dengan mengeksekusi semua yang ada di buffer?

St.Antario
sumber
4
Anda tahu Anda dapat mengedit baris perintah saat ini di Vim dengan <C-x><C-e>dan menjalankannya di tulis, kan?
romainl
Jika Anda menjalankan bash dengan opsi ini set -o vi, Anda dapat menekan Esc-vuntuk mengedit baris perintah di vi. Kemudian Esc-:wquntuk mengeksekusi.
roblogic

Jawaban:

35

Saya menulis jawaban yang cukup luas tentang hal ini di stack-overflow . Ide dasarnya adalah bahwa karena perintah tulis adalah tentang menulis tidak menyimpan , Anda dapat menulis teks dalam buffer Anda ke dalam program eksternal, seperti python atau bash. Dalam kasus Anda, Anda ingin melakukan sesuatu seperti:

:w !bash

atau

:w !sh

Perintah-perintah ini secara harfiah hanya menulis teks dalam buffer Anda langsung ke dalam program yang Anda tentukan !, yang nyaman karena Anda tidak perlu menyimpan file. Tentu saja, Anda juga dapat melakukan sesuatu seperti:

:w | !bash %

yang menyimpan file Anda dan kemudian menjalankannya sebagai skrip bash. Anda dapat memilih mana yang lebih masuk akal bagi Anda.

DJMcMayhem
sumber
Apakah ada cara untuk memberikan opsi argumen dengan cara ini? Saya mencoba :w !bash -a testtetapi mendapat "tidak dapat menjalankan file biner"
St.Antario
@ St.Antario Hmm. Saya yakin pasti ada beberapa cara, tetapi bash saya cukup berkarat (saya kebanyakan menggunakan windows). Ketika saya mencobanya di cygwin dengan testfile kosong , itu berjalan dengan baik untuk saya. Apa yang seharusnya dilakukan oleh perintah, dan apa yang seharusnya testberisi?
DJMcMayhem
Kasus saya yang sebenarnya cukup rumit, jadi biarkan saja cetak argumen yang diteruskan. BTW, apa maksud Anda apa yang seharusnya test berisi? testhanyalah sebuah argumen untuk -a.
St.Antario
1
@ St.Antario Oh, oke saya mengerti. Saya pikir testseharusnya menjadi file. Saya tidak begitu yakin apa yang harus saya lakukan. Jika Anda mencoba sesuatu yang kompleks, mungkin lebih baik menyimpannya dalam file. Mungkin patut ditanyakan sebagai pertanyaan terpisah sehingga Anda dapat memberikan lebih banyak detail. Ini mungkin juga akan menjadi pertanyaan yang bagus untuk Unix dan Linux
DJMcMayhem
4

Skenario: Anda bekerja di bash shell. Pertama, pastikan mode edit lokal adalah vi:

$ set -o vi

Sekarang, ketika Anda menemukan diri Anda mengerjakan perintah panjang seperti berikut ini, tekan Esc+ v.

$ fjhwfq this is my long command

Ini akan memuat perintah Anda ke visesi sementara . Sekarang Anda dapat mengeditnya sesuai keinginan, dan bahkan menambahkan perintah lain ...

fjhwfq some long command
ls -l

Setelah selesai mengedit, ketik Esc :wqdan perintah akan dieksekusi, misalnya:

$ fjhwfq some long command
fjhwfq some long command
bash: fjhwfq: command not found
ls -l
total 44
-rw-r--r-- 1 ropata Domain Users 24073 Nov 10 14:17 _viminfo
drwxr-xr-x 1 ropata Domain Users     0 Jul 15 13:57 bin/
-rw-r--r-- 1 ropata Domain Users   956 Nov  7 10:43 custom_env
roblogic
sumber
3
mungkin tidak berfungsi jika Anda memiliki macbook baru tanpa Esckunci;)
roblogic
1
MacBook baru tidak memiliki Esckunci !? Bagaimana mereka bisa menggunakan Vim?
Hubro
1
Sekarang saya sudah mencobanya, macbook touchbar thingy memang menunjukkan Esckunci ketika menjalankan Vim di terminal.
roblogic