Saya ingin mengedit konten dalam vim yang dihasilkan secara dinamis dari command-line tanpa memiliki file.
Sebagai contoh:
$ echo This is example. | vim /dev/stdin
$ cat /etc/hosts | vim /dev/stdin
tetapi gagal dengan kesalahan:
Vim: Peringatan: Input bukan dari terminal
Vim: Kesalahan saat membaca input, keluar ...
Apakah mungkin untuk mencapai itu?
command-line
invocation
unix
kenorb
sumber
sumber
:help stdin
... Sungguh luar biasa seberapa cepat seseorang dapat menemukan jawaban dengan mengajukan pertanyaan mereka tentang dokumentasi bawaan.Jawaban:
Anda harus menggunakan
-
tempat nama file pada baris perintah:Perintah di atas akan membuka buffer tanpa nama yang diisi dengan teks yang dibaca dari input standar.
sumber
-
for stdin cukup banyak standar untuk alat commandline;Ini hanya sebagian besar catatan yang menyenangkan tentang
bash
danreadline
, tetapi jika Anda mengaturEDITOR
variabel lingkungan Andavim
, menekan Ctrl+ x+ eakan membuka baris saat inivim
. Selanjutnya, jika Anda mengetik Meta(Alt/Opt/Esc)+ Ctrl+ e, bash akan melakukan ekspansi di tempat pada baris perintah saat ini, yaitu:dengan Meta(Alt/Opt/Esc)+ Ctrl+ eakan menjadi
dengan Ctrl+ x+ eakan menjadi
Perhatikan bahwa setelah berhenti vim, isi buffer vim dieksekusi pada baris perintah.
Fitur-fitur ini menjadi sangat berguna bagi saya ketika saya ingin melakukan perintah multi-line di bash seperti untuk loop atau program yang membutuhkan pernyataan di sini, dan menyediakan cara yang menarik untuk menyimpan sedikit sejarah baris perintah ke file untuk digunakan nanti.
Jadi untuk menjawab pertanyaan awal, Anda juga bisa menulis,
dan kemudian tekan Ctrl+ x+ euntuk memuatnya
vim
. Anda juga bisa,dan lakukan Meta(Alt/Opt/Esc)+ Ctrl+ elalu Ctrl+ x+ e, yang akan menempatkan semua file host pada satu baris dan memuatnya
vim
(mungkin bukan penggunaan terbaik dari fitur-fitur ini - namun, kegunaan metode ini dapat diekstrapolasi dari beberapa contoh yang dibahas sini).Perhatikan bahwa saya menganggap bahwa Anda
readline
diatur keemacs
mode. Jika Andareadline
diatur kevim
mode Anda dapat dengan mudah menemukan binding yang relevan dengan menggunakan perintah:dan mencari
edit-and-execute-command
ataushell-expand-line
, yang masing-masing terkait dengan binding Ctrl+ x+ edan Meta(Alt/Opt/Esc)+ Ctrl+ e.sumber
set -o vi
untuk menyalakannya. Kemudian Anda bisa menggunakanv
pemetaan dalam mode normal untuk mengedit perintah saat ini di editor Anda.shell-expand-line
menghapus baris baru dari teks yang diperluas dan 2.edit-and-execute-command
mencoba untuk mengeksekusi perintah yang ditulis dalam buffer , apa pun itu disimpan atau tidak, ketika Anda berhenti vi.Dalam bash saya merasa bermanfaat untuk menggunakan proses substitusi menggunakan
<(command)
sintaks, misalnya:Lihat juga:
sumber
bash
danzsh
(dan tidaksh
,ksh
,dash
,fish
,csh
,tcsh
, dll)/proc/PID/fd/FD
. Jika Anda menulis buffer dan berhenti, Vim tidak mengeluh, tetapi file yang Anda tulis akan dihapus oleh OS. Menggunakan-
sebagai nama file, buffer yang dibuka tidak memiliki file yang terkait dengannya jadi jika Anda mencoba untuk berhenti tanpa (selama Anda tidak menggunakan perintah bang atau serupa) menyimpan Vim akan memperingatkan Anda.vimdiff <(echo foo) <(echo bar)
.:next
dan:prev
membaca ulang aliran dan tidak mendapatkan apa-apa. Perlu juga disebutkan bahwa prosesnya tidak sejajar satu sama lain - misalnyacat <(sleep 3; echo a) <(echo b)
cetakan berurutan - dan sementaracat
interleaves menulis dan membaca,vim
menunggu file untuk "selesai membaca" sebelum menampilkan semua kecuali kerangka luar.Jika menggunakan pipa ke Vim baru bukan keharusan, Anda dapat menggunakan kemampuan Vim untuk menarik output perintah ke buffer saat ini, ditambah dengan memiliki buffer yang didukung file-non (seperti dengan
:new
atau mengedit file yang tidak ada):read!cat /etc/hosts
dalam mode perintah akan menempatkan output ke buffer Anda saat ini di bawah posisi kursor saat ini.Selain harus menghapus baris pertama kosong yang tersisa saat ini dilakukan pada buffer kosong, ini bekerja dengan baik dan sangat nyaman jika Vim sudah berjalan.
sumber