อะไร: เปิดทำเป็นกลุ่ม?


18

เอกสารของ Vim มีไว้เพื่อกล่าวเกี่ยวกับ:openคำสั่ง:

This command is in Vi, but Vim only simulates it:

                                                        *:o* *:op* *:open*
:[range]o[pen]                      Works like |:visual|: end Ex mode.
                                {Vi: start editing in open mode}

:[range]o[pen] /pattern/    As above, additionally move the cursor to the
                                column where "pattern" matches in the cursor
                                line.

Vim does not support open mode, since it's not really useful.  For those
situations where ":open" would start open mode Vim will leave Ex mode, which
allows executing the same commands, but updates the whole screen instead of
only one line.

มันไม่ได้แสดงความคิดเห็นเกี่ยวกับธรรมชาติของ "การจำลอง" และทำไมสิ่งนี้จึงถือว่าเป็นการจำลองมากกว่าคำสั่งจริงที่มีพฤติกรรมแตกต่างกัน เมื่อทำงานจากโหมด ex (Q) มันจะทำงานตามที่อธิบายไว้

อย่างไรก็ตามดูเหมือนว่าจะมีคำสั่งเปิดที่แตกต่างกัน เมื่อเรียกใช้จากบรรทัดคำสั่งปกติหรือจากโหมดอดีตที่มีการขัดแย้งแตกต่างกันก็จะปรากฏขึ้น:editที่จะเป็นคำพ้องความหมายสำหรับ เมื่อเรียกใช้จากโหมดคำสั่งด้วย a /pattern/จะจัดตำแหน่งเคอร์เซอร์และเห็นได้ชัดว่าทำงาน:edit(โดยมีตำแหน่งเคอร์เซอร์เท่านั้นที่เห็นได้ชัดหาก: แก้ไขล้มเหลว) นอกจากนี้ยังสามารถเรียกใช้เป็น:open /pattern/ fileซึ่งวางตำแหน่งเคอร์เซอร์และทำงาน:edit file

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

คำตอบ:


13

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

"การจำลอง" ที่เป็นกลุ่มไม่เป็นเพียงการสนับสนุนคำสั่งทำให้มันทำหน้าที่ (ตามเอกสารกล่าวว่า) เหมือน:visualและตั้งแต่:visualเป็น "อย่างอื่นเช่นเดียวกับ:edit" :editนั่นอาจเป็นเหตุผลที่คุณเห็นมันทำหน้าที่เหมือน

จากมุมมองซอร์สโค้ด:openจะถูกนำไปใช้ในex_docmd.c( ex_open()) มันไม่สิ่งบางอย่างที่จะจัดการกับกรณีที่มีให้แสดงออกปกติ do_exedit()แต่มักจะจบลงด้วยการเรียกร้องให้

การดำเนินการ:edit, :baddและ:visualมีอยู่ในex_edit()ฟังก์ชั่นในแฟ้มเดียวกันและฟังก์ชั่นที่มีการเรียกร้องโดยตรงไปdo_exedit()(ไม่มีอะไรอื่น) ดังนั้นนอกเหนือจากเมื่อจัดการกับพารามิเตอร์การแสดงออกปกติรหัสเดียวกันได้รับการเรียก do_exedit()ค่อนข้างยุ่งเหยิงและพฤติกรรมของมันถูกแก้ไขอย่างหนักตามคำสั่งจริงที่ออก แต่ไม่เคยตรวจสอบโทเค็นคำสั่งเพื่อเปิด / แก้ไข / มองเห็นอย่างชัดเจน do_exedit()ดังนั้นคำสั่งสามส่งผลให้เกิดมากขึ้นหรือน้อยรหัสเดียวกันได้รับการทำงานใน


8

จากบทนำสู่การแก้ไขการแสดงด้วย Vi :

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

ข้อแตกต่างระหว่างโหมดภาพและโหมดเปิดคือวิธีการแสดงข้อความ

ในโหมดเปิดตัวแก้ไขใช้หน้าต่างบรรทัดเดียวลงในไฟล์และเลื่อนไปข้างหลังและไปข้างหน้าในไฟล์ทำให้บรรทัดใหม่ถูกแสดงเสมอใต้บรรทัดปัจจุบัน สองคำสั่งของ vi ทำงานต่างกันใน open: z และ ^ R คำสั่ง z ไม่ใช้พารามิเตอร์ แต่ดึงหน้าต่างบริบทรอบ ๆ บรรทัดปัจจุบันจากนั้นส่งคืนคุณไปที่บรรทัดปัจจุบัน

หากคุณอยู่บน terminal hardcopy คำสั่ง ^ R จะพิมพ์บรรทัดปัจจุบันอีกครั้ง บนเทอร์มินัลดังกล่าวโดยปกติแล้วเอดิเตอร์ใช้สองบรรทัดเพื่อแสดงบรรทัดปัจจุบัน บรรทัดแรกคือสำเนาของบรรทัดเมื่อคุณเริ่มแก้ไขและคุณทำงานในบรรทัดด้านล่างบรรทัดนี้ เมื่อคุณลบตัวอักษรตัวแก้ไขจะพิมพ์จำนวน \ เพื่อแสดงตัวอักษรที่ถูกลบ เครื่องมือแก้ไขจะพิมพ์บรรทัดปัจจุบันอีกไม่นานหลังจากการเปลี่ยนแปลงดังกล่าวเพื่อให้คุณสามารถดูว่าบรรทัดมีลักษณะอย่างไรอีกครั้ง

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

:openเป็นสิ่งประดิษฐ์ของต้นกำเนิดของ Vim ในฐานะที่เป็นโคลน Vi ที่ไร้ประโยชน์อย่างสมบูรณ์ในปัจจุบัน ฉันสามารถสันนิษฐานได้ว่ามันยังคงมีอยู่สำหรับ POSIX

แม้จะมีความคล้ายคลึงกันที่คลุมเครือ แต่:openก็ไม่ใช่ทางเลือกที่จะ:editจินตนาการได้

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