โหมด Ex มีการใช้งานจริงหรือไม่?


115

Vim มีโหมด Ex ที่สามารถป้อนได้โดยการป้อนQและโหมดบรรทัดคำสั่งที่สามารถป้อนq:ได้ ร้องเรียนทั่วไปในหมู่ผู้ใช้กลุ่มใหม่คือพวกเขาเข้าสู่โหมดเหล่านี้โดยไม่ได้ตั้งใจเมื่อพยายามที่จะออกเป็นกลุ่ม ดังนั้นฉันจึงปิดใช้งานคีย์เหล่านี้~/.vimrcเพื่อหยุดตัวเองโดยไม่ได้ตั้งใจ (โดยเฉพาะq:):

map q: <Nop>
nnoremap Q <nop>

แม้ว่าฉันจะอ่านเอกสาร vim บน Exเป็นผู้ใช้ Vim ที่มีประสบการณ์ปานกลางและเข้าใจแนวคิดพื้นฐานที่อยู่เบื้องหลัง แต่ฉันก็ยังต้องดิ้นรนเพื่อหาประโยชน์ในการใช้ vim ทุกวัน โดยทั่วไปดูเหมือนว่ามีประโยชน์น้อยกว่าเพียงแค่ป้อนคำสั่งบรรทัดคำสั่ง vim มาตรฐานที่นำหน้าด้วย:เนื่องจากการเปลี่ยนแปลงไม่ได้สะท้อนในทันที

Ex มีการใช้งานจริงทุกวันใน Vim สมัยใหม่หรือไม่? มีอะไรที่ทำได้ง่ายกว่าในโหมด Ex กว่าคำสั่งมาตรฐานหรือไม่ ความแตกต่างระหว่างโหมดบรรทัดคำสั่งและโหมด ex คืออะไร?


13
Qและq:ค่อนข้างแตกต่าง คุณหมายถึงเท่านั้นQใช่มั้ย
jamessan

@jamessan จริง ๆ แล้วมันกลับกลายเป็นว่าฉันไม่แน่ใจ ... คุณพูดถูกพวกเขาดูเหมือนจะทำสิ่งต่าง ๆ แม้ว่าฉันจะคิดว่าพวกเขาเหมือนกัน หากคุณตอบคำถามนี้มันอาจช่วยอธิบายได้อย่างชัดเจนเนื่องจากฉันสับสน
Andrew Ferrier

คำถามนี้จะถูกกล่าวถึงใน Meta
200_success

1
@AndrewFerrier คุณถามถึงq:เฉพาะเจาะจงและพูดถึงมันว่าในลำดับที่สำคัญสองประการที่คุณมีปัญหามากที่สุด และคำตอบสองข้อในที่นี้อาจเป็นประโยชน์กับผู้ที่กำลังค้นหาด้วยคำที่ถูกต้อง
Random832

4
เมื่อคุณเรียนรู้สิ่งที่q/และq:ทำคุณอาจจะคิดว่าพวกเขาบางส่วนของคำสั่งที่มีประโยชน์มากที่สุดในกลุ่ม และใช่คุณแล้วรู้วิธีการใช้พวกคุณก็ไม่ทราบเลยว่าเขาทำอะไร ดูหน้าจอ screencast นี้เพื่อหา
Sato Katsura

คำตอบ:


81

Qคือตามที่คุณพบโหมด ex มันไม่ได้มีประโยชน์อะไรเลยหากใช้แบบโต้ตอบ แต่มีอยู่เพราะ Vim สามารถใช้เพื่อจำลองexไบนารีเก่าได้ ในความเป็นจริงหลายระบบให้exคำสั่งโดยเพียงแค่ symlinking vimมัน

q:หรือ:<C-f>ให้วิธีเรียกดูประวัติบรรทัดคำสั่งของคุณและแก้ไขเช่นเดียวกับบัฟเฟอร์ปกติ สิ่งนี้ทำให้ง่ายต่อการค้นหาคำสั่งก่อนหน้าที่คุณรันแก้ไขด้วยคำสั่ง Vim ปกติแล้วเรียกใช้คำสั่งที่แก้ไข q/และq?คำสั่งที่มีอยู่เพื่อให้ฟังก์ชันการทำงานเหมือนกันสำหรับประวัติการค้นหา


64

เสียงเรียกเข้าในโหมด Ex มีประโยชน์เมื่อ:

  • คุณต้องการแก้ไขไฟล์หลายไฟล์แบบไม่โต้ตอบ (เป็นส่วนหนึ่งของสคริปต์)
  • การเชื่อมต่อของคุณช้ามากหรือหน้าจอไม่ได้รับการอัพเดตหลังจากการกระทำของคุณ
  • การแมปและตัวย่อถูกปิดใช้งาน
  • ปุ่มทั่วไปเช่นEscapeหรือControlทำงานไม่ถูกต้อง

โดยทั่วไปviคือโหมดภาพสำหรับโหมดexVim Ex จึงเป็นเพียงการเลียนแบบex(พวกเขายังคงใช้รหัสเดียวกัน) ดังนั้นจึงเป็นไปได้ที่จะเข้าสู่โหมดคำสั่งexจากภายใน vi และในทางกลับกัน จริงๆแล้วมีสองโหมด: โหมด Ex ( vim -e) และโหมด Ex ที่ได้รับการปรับปรุงซึ่งอนุญาตให้ใช้คำสั่งขั้นสูงมากกว่าโหมด Ex ( vim -E) ที่รองรับ ดู: ความแตกต่างระหว่างโหมด Ex และโหมด Ex ที่ปรับปรุงแล้วคืออะไร

อดีตเป็นรากของครอบครัวของบรรณาธิการที่: edit, และex viEx เป็นชุดedพิเศษที่มีส่วนขยายที่โดดเด่นที่สุดคือเป็นเครื่องมือแก้ไขการแสดงผล อดีต (1)

การแก้ไขไฟล์แบบไม่โต้ตอบเป็นการใช้งานที่พบบ่อยที่สุดและผู้คนใช้งานในลักษณะที่คล้ายกันsedและawkอย่างไรก็ตามพวกเขาเป็นแบบสตรีมมากกว่า - พวกเขาอ่านไฟล์ไปข้างหน้าตั้งแต่ต้นจนจบ (ไม่ได้ออกแบบมาเพื่อทำงานกับหลายบรรทัด ) ในขณะที่vimเป็นบัฟเฟอร์ - คุณสามารถเลื่อนไปข้างหน้าและข้างหลังในไฟล์ได้ตามที่คุณต้องการซึ่งทำให้มีประสิทธิภาพ

โดยทั่วไป:

sedเป็นS tream ED itor ไม่ใช่ตัวแก้ไขไฟล์

อย่างไรก็ตามผู้คนดูเหมือนจะใช้มันในการแก้ไขไฟล์และความจริงก็คือว่ามันไม่ได้แก้ไขไฟล์ ตัวเลือกที่สองเช่น in-place ( -i) เป็นส่วนเสริม FreeBSD ที่ไม่ได้มาตรฐานและอาจไม่มีในระบบปฏิบัติการอื่น ดังนั้นหากคุณต้องการที่จะหลีกเลี่ยงรหัส unportable, I / O ค่าใช้จ่ายและผลข้างเคียงที่ไม่ดี (เช่นทำลาย symlinks) คุณควรใช้exซึ่งเป็นมาตรฐาน UNIX แก้ไขคำสั่งตาม (พร้อมด้วยed) BashFAQ


สิ่งอื่น ๆ ที่ฉันพบว่ามีประโยชน์ในโหมด Ex คือใช้เป็นสนามเด็กเล่น (คล้ายกับpythonคอนโซล) ที่คุณสามารถรันคำสั่งมากมายในหนึ่งแถวทำงาน / แก้ไขจุดบกพร่องของนิพจน์ปกติตรวจสอบการกำหนดค่า vim เรียกใช้คำสั่งภายนอกหรือทำงานกับ .

ตัวอย่างเช่น:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

ซึ่งจะง่ายกว่าในโหมด Ex กว่าในโหมดปกติ (ซึ่งคุณสามารถเห็นได้เฉพาะคำสั่งสุดท้ายของคุณ)


ประเพณีปฏิบัติ

ฉันเป็นชื่อแทนต่อไปนี้ในของฉัน.bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

หมายเหตุ: การใช้bufdoไม่ใช่exวิธีที่สอดคล้องกับ POSIX (ตามคู่มือ ) ดังนั้นคุณสามารถลองใช้กับfindแทนได้ !จะใช้ในการบังคับให้เปลี่ยนบัฟเฟอร์โดยไม่บันทึก (มิฉะนั้นเตือนจะถูกสร้างขึ้น)

คนแรกที่ฉันใช้เพื่อตัดช่องว่างต่อท้ายในไฟล์ต้นฉบับทั้งหมดของฉันเช่น:

trim **/*.php

แท็บที่สองจะแปลงแท็บทั้งหมดเป็นช่องว่าง (เรียกซ้ำ) เช่น:

retab **/*.php

สำหรับผมใช้retabเป็นพอ แต่มีข้อเสียบางอย่างที่อธิบายไว้ในที่นี่ เพิ่มพิเศษ-Vสำหรับเอาต์พุต verbosity ที่เพิ่มขึ้น

โปรดทราบว่าตัวอย่างข้างต้นโดยใช้ zsh / bash4 globbing ( **) ดังนั้นตรวจสอบให้แน่ใจว่าเชลล์ของคุณรองรับและเปิดใช้งานแล้ว

สำหรับตัวอย่างที่ใช้งานได้จริง (เช่นการแยกไฟล์ html) ให้ตรวจสอบ:

เรียนรู้เพิ่มเติมเกี่ยวกับโหมด Ex ได้ที่:


คุณสามารถกรุณาโพสต์ตัวอย่างของ "การแก้ไข (หลาย) ไฟล์ที่ไม่โต้ตอบ" การดำเนินการที่ง่ายเพื่อให้บรรลุที่มีexมากกว่าที่เป็นอยู่ด้วยed, sedหรือawk?
Sato Katsura

1
@SatoKatsura เพิ่มสองวิธีการปฏิบัติที่เกี่ยวข้องกับไฟล์หลายไฟล์
kenorb

ฉันขุดเอกสารเพื่อให้เข้าใจได้ดีขึ้นในexโหมด ฉันไม่เข้าใจว่าทำไมคุณถึงมีปัง ( !) ในคำสั่งtrimalias ของคุณ bufdoจะไม่ละทิ้งการเปลี่ยนแปลงทั้งหมดในไฟล์ทั้งหมดยกเว้นไฟล์ล่าสุด ถ้าไม่ทำไมไม่
ไวด์การ์ด

@Wildcard โดย!ทั่วไปแล้วจะไม่ทำงานเนื่องจากแต่ละครั้งที่มีการสลับบัฟเฟอร์exจะบ่นเกี่ยวกับการเปลี่ยนแปลงที่ไม่ได้บันทึกไว้ (และเรากำลังบันทึกการเปลี่ยนแปลงในตอนท้ายด้วยxa) คำเตือนสามารถใช้งาน !แต่มันง่ายมากที่จะเพิ่ม
kenorb

ฉันเห็น ... ฉันเดาว่าฉันอ่านเอกสารผิด มันระบุว่าโดยไม่ต้อง!คำสั่งจะล้มเหลวถ้าบัฟเฟอร์ไม่สามารถทอดทิ้ง แต่ก็ไม่ได้ระบุอย่างชัดเจนว่า!จะทำให้เกิดบัฟเฟอร์จะไม่ถูกยกเลิก .... ดังนั้นไม่ "ละทิ้ง" ในกรณีนี้หมายถึงการ "ลดลง เนื่องจากไม่มีสิ่งใดที่ไม่ได้เขียนลงดิสก์ " หรืออะไร? (ฉันกำลังดู:help bufdo)
ไวด์การ์ด

18

ฉันไม่ค่อยใช้โหมดอดีต แต่เมื่อฉันต้องการฉันก็ยินดีเป็นอย่างยิ่ง

บางครั้งฉันเข้าถึงระบบผ่าน ssh ผ่าน VPN และบางครั้งการเชื่อมต่อเหล่านี้อาจช้าลง ทำให้ปัญหาแย่ลงบางครั้งฉันต้องแก้ไขไฟล์ทางด้านระยะไกลซึ่งนอกเหนือจากการอยู่เบื้องหลัง ssh และ VPN เป็นการเชื่อมต่อแบบอนุกรมช้า (ดังนั้น 9600 baud บวกเวลาแฝงเครือข่ายจำนวนมาก)

มันเป็นเช่นนี้ที่การแสดงความคิดเห็นด้วยภาพและการปรับปรุงหน้าจอกลายเป็นอุปสรรคมากกว่าเพราะสิ่งที่ฉันเห็นล่าช้า (เอฟเฟ็กต์เป็นเหมือนการพูดคุยกับไมค์ แต่มีลำโพงอยู่ไกลออกไปเหมือนในสนามกีฬา และบางครั้งสับสนเนื่องจากข้อเสนอแนะล่าช้า

ในกรณีนี้การเปลี่ยนแปลงที่ไม่ได้สะท้อนกลับเป็นข้อได้เปรียบที่มีประโยชน์เนื่องจากฉันสามารถทำงานได้มากขึ้นในเวลาน้อยลงเมื่อฉันไม่รอให้หน้าจออัปเดต

เมื่อฉันทำการแก้ไขเสร็จแล้วฉันกลับไปที่โหมดภาพเพื่ออัปเดตหน้าจอแบบครั้งเดียวเพื่อตรวจสอบงานของฉัน จากนั้นฉันสามารถกลับไปที่โหมดเก่าหรือบันทึกเพราะฉันเสร็จแล้ว


13

หน้าต่างบรรทัดคำสั่งมีประโยชน์สำหรับการเขียนคำสั่งที่ซับซ้อนยาว ๆ เนื่องจากประวัติคำสั่งเปิดเป็นหน้าต่างคุณสามารถใช้การนำทางเป็นกลุ่มหรือแก้ไขคำสั่ง / การแมป

สมมติว่าคุณต้องการแก้ไขคำสั่งการแทนที่แบบยาวที่คุณรันครั้งเดียว แต่ทำผิด:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

ในการเปลี่ยนสตริงการค้นหาคุณไม่สามารถใช้การเคลื่อนไหวที่เป็นกลุ่มเช่นbในบรรทัด Ex เพื่อนำทาง (แม้ว่าฉันเชื่อว่ามีการแมปคีย์สำหรับการนำทางนี้) คนส่วนใหญ่จะกดปุ่มลูกศรซ้ายหลายครั้งแทน

วิธีที่ดีกว่า: กดq:เพื่อเข้าสู่หน้าต่างบรรทัดคำสั่งkเพื่อเลื่อนไปยังคำสั่งสุดท้ายและเลื่อนไปตามการเคลื่อนไหวปกติไปยังส่วนของคำสั่งที่คุณต้องการเปลี่ยน ต้องการเปลี่ยนทั้งคำไม่มีปัญหา: ciw.


โอเคขอบคุณ. คุณแน่ใจหรือว่าq: เป็นบรรทัดคำสั่ง Ex ความช่วยเหลือนี้ใช้วลี "Ex" สำหรับโหมดที่เขานำขึ้นQเท่านั้น แต่นั่นไม่สนับสนุนการแก้ไขเสียงเรียกเข้ามาตรฐานที่คุณอ้างถึง - เพียงเท่านั้นq:ซึ่งช่วยได้ง่ายๆเพียงเรียก 'โหมดบรรทัดคำสั่ง' ฉันรู้ว่าฉันสับสนทั้งสองในตอนแรก แต่เราควรแน่ใจว่าเรามีความชัดเจนเกี่ยวกับความแตกต่างที่นี่
Andrew Ferrier

1
ฉันค้นหา:help q:ก่อนที่จะตัดสินใจใช้วลีนั้น แต่ฉันอาจสับสนกับคำศัพท์
bsmith89

1
ฉันสับสนเกี่ยวกับคำศัพท์นี้เช่นกัน ฉันมักจะพูดเกี่ยวกับการพิมพ์คำสั่ง Ex เป็นสิ่งต่อไปนี้:แต่ฉันสามารถใช้ผิดที่
bsmith89

3
เนื้อหาของคำตอบของคุณนั้นถูกต้องทั้งหมด แต่วิธีที่คุณใช้คำศัพท์นั้นทำให้ฉันสับสนเล็กน้อย ฉันคิดว่าคุณตีความเอกสารผิดเล็กน้อย q:ไม่เปิดบรรทัดคำสั่ง Ex มันเปิดหน้าต่างประวัติคำสั่งซึ่งคำสั่ง Ex ปัจจุบันและก่อนหน้านี้สามารถแก้ไขได้ บรรทัดคำสั่ง Ex คือสิ่งที่คุณจะได้รับเมื่อคุณกด:ในโหมดปกติ
Rich

3
FWIW ฉันคิดว่าเอกสาร Vim นั้นค่อนข้างสับสนเช่นเดียวกับที่กล่าวถึง:คำสั่งทั้งหมดว่าเป็นคำสั่ง 'Ex' IMHO จริง ๆ เท่านั้นคำสั่งที่มีจริงใน Ex ควรพิจารณาว่าเป็นคำสั่ง Ex
Rich

6

ฉันได้รับการบอกเล่าจากบุคคลที่มีสายตาบางส่วนที่กำลังตาบอดว่าเขาเปลี่ยนไปเป็นอดีต ฉันตัวเองมีอายุมากกว่า vi และฉันเปลี่ยนจาก ed มาเป็นเวลานานแล้ว (ใช่ฉันรู้ "ed คือบรรณาธิการมาตรฐาน") สิ่งเดียวที่ฉันทำในโหมด vi คือ% -bouncing เพื่อจับคู่ parens เมื่อเขียน Lisp code


เตือนฉันถึงการสัมภาษณ์นี้ ฉันจำไม่ได้ว่าexมีการพูดถึงโดยเฉพาะ
Martin Tournoij

ฉันไม่เคยคิดถึงเรื่องนี้เลย ขอบคุณมากคำตอบยอดเยี่ยม
Andrew Ferrier

2

นอกเหนือจากการใช้งานที่กล่าวถึงแล้วที่นี่อดีตยังเป็นวิธีการแก้ไขไฟล์บนคอนโซลลินุกซ์หากเกิดเหตุการณ์นี้ขึ้นบนแพลตฟอร์ม S / 390 และคอนโซลเกิดขึ้นในแนวเส้นแทนที่จะเป็นแบบหน้าจอ


0

โหมด Ex มีการใช้งานจริงหรือไม่?

อาจจะไม่. อย่างไรก็ตามในขณะที่เข้าสู่โหมด Ex ไม่มีประโยชน์จริง ๆ การเรียนรู้คำสั่ง Ex ยังคงมีประโยชน์โดยเฉพาะอย่างยิ่งเนื่องจากคุณใช้คำสั่งการแก้ไขอดีตพร้อมกับ:g/คำสั่งระดับโลกเพื่อทำงานบนบรรทัดที่ตรงกัน


-1

"ex" ดั้งเดิมเป็นเวอร์ชันอัพเกรดของ "ed" text editor ใน Unix ใน 2BSD โหมดภาพถูกเพิ่มและตัวแก้ไขใหม่ถูกเรียกว่า "vi"

หากต้องการใช้บรรทัดคำสั่ง ex เขาจะเปลี่ยนไปใช้โหมดคำสั่งด้วยปุ่ม ":" ดังนั้นในความเข้าใจที่ดีที่สุดของฉันอดีตไม่ได้มีสำหรับ nostalgy มันเป็นส่วนที่ให้โหมดคำสั่ง

คุณยังสามารถเข้าสู่โหมดแทรกได้ด้วย

 :i 

จากนั้นกด "Enter และพิมพ์ข้อความของคุณออกด้วย ^ c หรือพิมพ์ทั้งหมดในบรรทัดคำสั่งเดียวเช่น

 :i my multiline text \with a second line.^c

1
เมื่อพิจารณาว่าโหมด Exนั้นไม่เหมือนกันกับCommand-line-modeนี่ดูเหมือนจะไม่ตอบคำถาม และในฐานะที่เป็นหมายเหตุเพิ่มเติมเพิ่มเติม: โหมดคำสั่งเป็นคำพ้องที่โชคร้ายสำหรับโหมดปกติไม่ใช่โหมดบรรทัดคำสั่ง
8bittree

จุด "โหมดคำสั่ง" ข้อแก้ตัวเท่านั้นเมื่อเราเปลี่ยนเป็น vi การเพิ่มใหม่เราได้รับ intoruduced เป็น "visual" (ไม่ใช่โหมด visual vim ปัจจุบัน) ตรงข้ามกับ "command" - ตอนนี้ ex ในบรรทัดคำสั่งอื่น ๆ ดูเหมือนว่าจะเรียก do_cmdline () เช่นเดียวกับอดีต ไม่ว่ามันจะแนะนำ "การใช้งานจริง" ใด ๆ ที่ฉันยอมรับ
if2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.