หลายคำสั่งในบรรทัดเดียวกัน


188

ฉันพยายามค้นหาบางสิ่งที่จะให้ฉันเรียกใช้หลายคำสั่งในบรรทัดเดียวกันใน Vim คล้ายกับการใช้เครื่องหมายอัฒภาคเพื่อแยกคำสั่งในระบบ * nix หรือ&ใน Windows มีวิธีทำเช่นนี้หรือไม่?


2
ว้าวฉันพยายามที่จะเรียนรู้เกี่ยวกับเสียงเรียกเข้าจากคำถามของคุณ (ซึ่งฉันทำ) และพบว่าฉันสามารถใช้;แทนที่จะ&&แยกคำสั่ง Unix shell ด้วย!

8
@ebyrob ผมรู้สึกว่ามันเป็นสิ่งสำคัญที่จะทราบว่า&&คือ 'บูลและในคำสั่งเชลล์ดังนั้นหากคุณมีcommand1 && command2, command2จะดำเนินการถ้าcommand1ดำเนินการประสบความสำเร็จ ด้วย;คุณเพียงแค่ระบุจุดสิ้นสุดของบรรทัดนั้นและเริ่มต้นใหม่ด้วยตนเอง มันเหมือนกับการเขียนแต่ละคำสั่งบนบรรทัดที่แตกต่างในเชลล์สคริปต์
จะ

... และ command1 || command2, command2 จะดำเนินการก็ต่อเมื่อ command1 ล้มเหลว นั่นเป็นเพราะในตรรกะคอมพิวเตอร์ | | และ && เป็นบิตและแม้ว่า "&&" หมายความว่าทั้ง command1 และ command2 จะถูกยกเลิก แต่ command2 ไม่จำเป็นต้องถูกประเมินถ้า command1 ล้มเหลวเพราะไม่ว่า cmd2 จะกลับมาอย่างไรมันจะล้มเหลวเสมอตั้งแต่อันแรกส่งคืนเท็จ ( 0) และ 0 && 1 จะยังคงเป็นศูนย์หากคำสั่ง 1 = จริงไม่มีเหตุผลสำหรับคำสั่ง 2 ในการประเมิน OR เพราะ ณ จุดนั้นมันเป็นจริงแล้ว (1) เพราะ 1 || 0 คือ 1 และเฉพาะเมื่อมันเป็น 0, ต้องมี 0 || 1 (ซึ่งยังคงเป็น 1)
osirisgothra

@osirisgothra ที่รู้จักกันในชื่อการประเมินการลัดวงจร / การลัดวงจร
speakingcode

คำตอบ:


241

แถบ|จะอนุญาตให้คุณทำเช่นนี้ จาก:help :bar

'|'สามารถใช้เพื่อแยกคำสั่งดังนั้นคุณสามารถให้หลายคำสั่งในหนึ่งบรรทัด หากคุณต้องการที่จะใช้ในการโต้แย้งนำหน้ามันด้วย'|''\'

ตัวอย่าง:

:echo "hello" | echo "goodbye"

เอาท์พุท:

hello
goodbye

หมายเหตุ: คุณอาจพบว่าคุณ~/.vimrcไม่สนับสนุนการทำแผนที่หรือ| \|ในกรณีเหล่านี้ให้ลองใช้<bar>แทน


8
เพียงระวังคำสั่งที่ไม่สามารถใช้ได้|!
php มากเกินไป

31
เมื่อคุณพบว่าตัวเองอยากจะใช้คำสั่งในหลายmapคำสั่ง (และฉันเชื่อว่าคุณจะ) :help map_barให้ตรวจสอบ
Bill Odom

9
นั่นเป็นเรื่องจริง ฉันถามคำถามเกี่ยวกับ superuser ไม่กี่เดือนที่ผ่านมา ฉัน.vimrcไม่สนับสนุนการใช้แถบหลบหนี ( \|) สำหรับการจับคู่ ฉันเรียนรู้ว่าฉันต้องพิมพ์ออกมา<bar>จริงๆ
michaelmichael

ขอบคุณสำหรับการแก้ปัญหาการทำงาน! :help barแสดงให้เห็นถึง motion.txt แม้ว่าและไม่มีอะไรเกี่ยวกับหลายคำสั่ง
geekQ

1
@geekQ ควรเป็น:help <bar>
Sri Kadimisetty

92

ใส่<CR>(Carriage Return / Enter) ระหว่างและหลังคำสั่ง ตัวอย่างเช่น:

map <F5> :w<CR>:!make && ./run<CR>

อย่าใช้|เพราะ:

  • บางคำสั่งมีปัญหาหากคุณใช้|หลังจากนั้น

  • | ไม่ทำงานอย่างสม่ำเสมอในไฟล์กำหนดค่าดู :help map_bar


42

คุณสามารถกำหนดฟังก์ชั่นที่รันคำสั่งของคุณ

function Func()
     :command
     :command2 
endfunction

และวางสิ่งนี้ไว้ใน vimrc ของคุณ เรียกใช้ฟังก์ชันด้วย

exec Func()

1
น้ำยาทำความสะอาด จะเป็นประโยชน์อย่างแน่นอนสำหรับคำสั่งที่ยาวเกินสองคำหรือนานกว่านั้น
elimirks

1
มีประโยชน์มากสำหรับความสามารถในการส่งข้อผิดพลาดด้วยลอง / จับ
Immanuel Weihnachten

2
มันใช้กันทั่วไปมากกว่า:call Func()เพราะมีความ:execute Func()หมายมากกว่า มันหมายถึงการดำเนินการคืนค่าของฟังก์ชั่นเป็นคำสั่ง ฟังก์ชั่นที่อธิบายไว้ที่นี่มักจะไม่มีคำสั่งที่ขึ้นต้นด้วย:returnดังนั้นค่าที่ส่งคืนจะเป็นเลขศูนย์ การทำเช่นนั้นในฐานะคำสั่งจะย้ายเคอร์เซอร์ไปที่บรรทัดแรกของบัฟเฟอร์ปัจจุบันซึ่งไม่ได้เป็นอย่างที่คุณคิด
minopret


16

ผมเคยใช้เสมอ^Jที่จะแยกคำสั่งหลายโดยการกดCtrl+ v, +Ctrlj


นี่น่าจะเป็นทางออกเดียวที่ใช้งานได้จริง ฉันจะระบุใครถ้าฉันต้องการใช้ในสตริง?
DerWeh

คุณไม่สามารถใช้^Jเป็นตัวคั่นคำสั่งในสตริงได้เนื่องจากมีการแทรกอักขระ NULL เพื่อยกเลิกสตริง อย่างไรก็ตามคุณสามารถใช้ <CR> = "\ n"
Tinmarino

exe "echo 'foo' \n echo 'bar'"
Tinmarino

exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
Tinmarino

map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Tinmarino

12

คิดว่าสิ่งนี้อาจช่วยให้ใครบางคนพยายามที่จะทดแทนในห่วงโซ่และล้มเหลว

จากความคิดเห็น

% s/word/newword/ge | % s/word2/newword2/ge

คุณสามารถใช้การeตั้งค่าสถานะเพื่อละเว้นข้อผิดพลาดเมื่อไม่พบสายอักขระ


2

คุณสามารถสร้างไฟล์ใหม่และเขียนคำสั่งของคุณได้ จากนั้น:so %ซึ่งหมายถึงซอร์สไฟล์ปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.