Saya ingin menjalankan shell berikut.
wea-this is the end of the second word | vim j
exit 0
Yang saya harapkan akan menyalurkan pukulan tombol w
(memajukan kata) kemudian e
(akhir kata) lalu a
(menambahkan) kemudian -this is the end of the second word
(teks) ke dokumen Vim bernama j
yang sudah memiliki kata-kata di dalamnya.
Kesalahan berikut terjadi ketika saya menjalankan skrip shell.
/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal
Saya menjalankan Ubuntu 14.04. Dua jenis jawaban akan dihargai:
- Cara menggunakan perpipaan untuk mencapai hasil yang diinginkan ini.
- Metode lain yang saya gunakan "perintah Vim" (bukan perintah ed atau sed) untuk mengedit dokumen teks dari skrip shell.
invocation
Jason Basanese
sumber
sumber
|
pipa karakter output dari satu perintah yang lain.wea-this
bukan perintah. Perpipaan tidak dapat digunakan untuk mencapai apa yang Anda inginkan; itu akan menyebabkan stdin Vim menjadi aplikasi sebelah kiri, bukan keyboard. Jika Anda ingin mendapatkan stdin ke dalam buffer di vim, mulai dengan minus untuk nama file:echo Hello, world! | vim -
.Jawaban:
Untuk memasukkan string
"hello"
pada baris pertama filej
, Anda bisa mengetikkan shell Anda perintah berikut:vim +"1 | put! ='hello'" j
:1
memindahkan kursor ke baris pertama buffer:put! ='hello'
menempelkan string "halo" di atas garis saat iniUntuk memasukkan string
"hello"
dan kemudian menyimpan dan keluar dari file:vim +"1 | put! ='hello' | x" j
Sama seperti sebelumnya, kami baru saja menambahkan perintah Ex
:x
yang menyimpan dan keluar.Secara umum, Anda dapat menjalankan urutan perintah Ex pada file, dari shell interaktif atau dari skrip bash, seperti ini:
vim +'Ex command1 | Ex command2 | ...' file
Jika Anda memiliki banyak perintah Ex, Anda dapat menuliskan semuanya di dalam file khusus (disebut misalnya
myExCommands.vim
), satu perintah per baris, dan kemudian dari shell atau skrip yang Anda dapat sumbernya (dengan perintah Ex:source
atau versi singkatnya):so
) seperti ini:Edit
Saya melihat Anda telah mengedit pertanyaan Anda.
Saya pikir jawaban sebelumnya masih berlaku, karena Anda dapat menjalankan perintah normal dari mode Ex dengan perintah Ex
:normal
dan:execute
.Misalnya, katakanlah Anda ingin:
1G
)_
)w
)e
)a
)hello
:x
)Untuk melakukan ini pada file
j
, ketik dari shell:Untuk informasi lebih lanjut, lihat:
sumber
:normal
dan:execute
melakukan apa yang Anda inginkan?Berikut adalah cara Anda dapat menggunakan perintah mode normal, bukan hanya perintah ex, untuk mengedit aliran yang disajikan ke Vim dari stdin. Ini bukan contoh yang sangat berguna, tetapi menggambarkan teknik yang terlibat. Diasumsikan bahwa shell Anda bash.
The
-
pada akhirnya memberitahu Vim untuk membaca teks (bukan perintah) dari stdin. The-s
memberitahu Vim untuk mengeksekusi penekanan tombol dari file yang ditentukan. Dalam hal ini, file tersebut adalah output dari substitusi proses bash. The<(...)
diganti dengan nama pipa bernama. Output dari pipa adalah output dari perintah di dalam tanda kurung. Thewcwred\e
bergerak kursor dengan satu kata dan perubahan kata sebelahred
. The:wq! foo\n
menyimpan hasil ke filefoo
bahkan jika file yang sudah ada. Hasil akhirnya adalah file bernamafoo
mengandung teksThe red fox jumped.
Untuk lebih lanjut tentang beberapa topik tersebut, lihat
Lihat juga
Process Substitution
bagianbash(1)
halaman manual.sumber
vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }
. Sekarang saya bisavimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo
. Rapi!Saya telah menemukan metode untuk mengambil output dari sebuah program yang dialihkan dari sub-shell menjadi sangat mudah:
Contoh:
sumber
Saya memiliki keinginan yang sama persis seperti Anda: Saya ingin menulis perintah vim normal dan meminta mereka mengedit aliran pipa. Saya kecewa dengan kesulitan menggunakan vim normal dengan cara ini (begitu banyak flag!), Seperti yang disediakan oleh opsi vim default.
Oleh karena itu, saya menulis pembungkus kecil di vim untuk melakukannya: https://github.com/MilesCranmer/vim-stream/ . Itu disebut
vims
.Inti bungkusnya adalah perintah berikut:
Dengan menggunakan ini, dengan generasi perintah yang saya lakukan, hasilnya cukup ringkas, dan karena vim adalah editor modal, saya membuat
vims
editor aliran modal. Ada tiga mode utama yang berguna untuk mentalitas penyuntingan pipa:Menonton ini:
Jadi,
e
lanjutkan ke akhirHello
, lalua
mulai menambahkan.Sesuatu yang lebih menarik, dalam mode exe, untuk mengomentari baris yang berisi
my_bad_var
, dan menghapus baris sebelumnya.Yang diterjemahkan menjadi
vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'
-I
perintah untuk mulai memasukkan di awal baris, dan//
menjadi urutan komentar.\<esc>kdd
menekan tombol escape, bergerak ke atas garis, lalu menghapus garis.Saya punya 11 contoh total pada repo itu, saya mendorong Anda untuk memeriksanya. Sekali lagi, ini berjalan di atas vim, itu hanya cara untuk membuat vim lebih seperti sed untuk input stream (tetapi menjaga semua makro vim kesayangan Anda!)
sumber
Ini adalah pertanyaan yang cukup lama, tetapi saya merasa layak untuk berkontribusi bahwa jika distro / OS Anda memiliki akses
moreutils
, maka Anda dapat menginstalnya dan hanya menggunakanvipe
sebagai tambahan standar untukvim
:moreutils
sangat berguna untuk alat-alat lainnya, dan saya akan sangat merekomendasikan mereka jika Anda adalah pengguna baris perintah yang serius! :) Lihatlah pengantar penulis (tautan sebelumnya) untuk lebih jelasnya.moreutils
seharusnya tersedia secara umum untuk kebanyakan distro * nix-like melalui manajer paket dan melalui Homebrew pada Mac . Sebagai contoh...moreutils
juga merupakan bagian dari repositori paket MSYS2 , sehingga Anda secara teknis dapat menggunakannya pada Windows juga. :)sumber