ฉันมีความต้องการเช่นเดียวกับคุณ: ฉันต้องการเขียนคำสั่ง vim ปกติและมีการแก้ไขสตรีมไปป์ไลน์ ฉันรู้สึกผิดหวังกับความยากลำบากในการใช้เสียงเรียกเข้าแบบปกติในลักษณะนี้ (มีธงจำนวนมาก!) ตามที่ระบุไว้ในตัวเลือกเสียงเรียกเข้าเริ่มต้น
ดังนั้นผมเขียนกระดาษห่อเล็ก ๆ ในกลุ่มที่จะทำมัน: https://github.com/MilesCranmer/vim-stream/ vimsมันเรียกว่า
หัวใจของเสื้อคลุมเป็นคำสั่งต่อไปนี้:
vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2
การใช้สิ่งนี้กับการสร้างคำสั่งที่ฉันทำมันออกมาได้ค่อนข้างกระชับและเนื่องจาก vim เป็นตัวแก้ไขvimsโมดอล มีสามโหมดหลักที่มีประโยชน์สำหรับการใช้ความคิดในการแก้ไขไปป์ไลน์:
[-t|--turn-off-mode] - (Default mode)
Every string is a vim command line, e.g., '%g/foo/d' deletes
all lines with foo.
[-e|--exe-mode] - Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] - Like exe-mode, but runs on 1st line only
ดูนี้:
$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World
ดังนั้นeไปที่จุดสิ้นสุดHelloแล้วaเริ่มต่อท้าย
มีบางสิ่งที่นักเล่นในโหมด exe เพื่อคอมเม้นท์บรรทัดที่มีmy_bad_varและลบบรรทัดก่อนหน้า
cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'
ซึ่งแปลเป็นvims '%g/my_bad_var/exe "norm I//\<esc>kdd"'- Iเป็นคำสั่งให้เริ่มแทรกที่จุดเริ่มต้นของบรรทัดและ//ลำดับความคิดเห็น
\<esc>kddดันแป้น Escape เลื่อนขึ้นบรรทัดหนึ่งแล้วลบบรรทัด
ฉันมีตัวอย่างทั้งหมด 11 รายการใน repo ฉันขอแนะนำให้คุณลองดู นี่เป็นอีกวิธีที่ทำให้ vim เป็นเหมือน sed สำหรับการป้อนข้อมูลสตรีม (แต่ยังคงรักษาแมโคร vim ที่คุณรักเอาไว้!)
|ท่อตัวอักษรผลลัพธ์ของคำสั่งหนึ่งไปยังอีกwea-thisไม่ใช่คำสั่ง ไม่สามารถใช้การวางท่อเพื่อให้ได้สิ่งที่คุณต้องการ มันจะทำให้ stdin ของ Vim เป็นแอปพลิเคชันมือซ้ายไม่ใช่แป้นพิมพ์ หากคุณต้องการให้ stdin เป็นบัฟเฟอร์ในกลุ่มให้เริ่มด้วยเครื่องหมายลบสำหรับชื่อไฟล์:echo Hello, world! | vim -.