ฉันมีความต้องการเช่นเดียวกับคุณ: ฉันต้องการเขียนคำสั่ง 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 -
.