ในขณะที่ฉันไม่สามารถปฏิเสธได้ว่าฉันต่อสู้กับ vi ในตอนแรกฉันคิดว่าการโต้แย้งสามารถทำให้ vi นั้นง่ายมากที่จะเรียนรู้ (เมื่อฉันเริ่มใช้ Unix ตัวเลือกคือ vi หรือ emacs ดังนั้นในขณะที่ฉันเลือก ed, ed เป็นตัวแก้ไขเส้นเรียบง่ายมากซึ่งฉันได้เรียนรู้แล้วจากการอ่านตำรา Unix ยุคต้น) ฉันใช้ vi ทุกวัน แต่ฉันอาจ ใช้คุณลักษณะย่อย ๆ เพียงเล็กน้อยเท่านั้น
นี่คืออาร์กิวเมนต์แรกสำหรับการใช้ vi: vi ที่มีอยู่ในทุกระบบใช้ทรัพยากรน้อยมากและอาจใช้งานได้ผ่านการเชื่อมต่อที่ไม่เสถียรและช้าซึ่งตัวแก้ไขอื่นอาจล้มเหลวหรือช้าและใช้ไม่ได้ หรือในสถานการณ์ที่ระบบเสียดังนั้นปุ่มลูกศรจึงไม่ถูกตีความอย่างถูกต้อง (เช่นการตั้งค่า terminfo ที่ไม่ดี) ดังนั้น vi สามารถใช้เพื่อแก้ไขไฟล์การกำหนดค่าที่นำไปสู่ปัญหาโดยไม่ได้รับผลกระทบจากปัญหา
และนี่คือวิธีการเรียนรู้ชุดย่อยที่มีประโยชน์ของ vi: อันดับแรก: หยุดคิดถึง vi ในรูปแบบโต้ตอบ "แก้ไข" เทอร์มินัล - GUI และดูว่าเป็นภาษาการเขียนโปรแกรมสำหรับจัดการไฟล์ข้อความ ในการเริ่มต้น "vi" หมายถึงโหมด VIsual และ vi มีคู่ที่ไม่ได้มาซึ่งเป็นจุดเริ่มต้นที่ดี พิมพ์ ex ที่ shell prompt (ฉันจะใช้¬เพื่อแทน return):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
ตอนนี้กด Enter
:¬
E749: empty buffer
:
ดังนั้นให้ใส่อะไรลงไป พิมพ์ "a¬" และพิมพ์บรรทัดข้อความตามด้วยเครื่องหมายจุดบนบรรทัด:
:a¬
Hello World¬
.¬
:
นั่นคือคำสั่งผนวก ง่ายสั้นและช่วยในการจำ แต่มันจะดีถ้าได้เห็นสิ่งที่อยู่ในบัฟเฟอร์:
:%p¬
Hello World
:
นั่นคือคำสั่งพิมพ์, p, แน่นอน % เป็นชวเลขช่วงของช่วงบรรทัด แต่ละคำสั่งอาจนำหน้าด้วยหมายเลขบรรทัดหรือช่วงที่คำสั่งควรนำไปใช้ % หมายถึง "ทุกบรรทัด" $ หมายถึงบรรทัดสุดท้ายและจุดหมายถึงบรรทัดปัจจุบัน ตัวเลขหมายถึงบรรทัดนั้นโดยเฉพาะ ช่วงถูกเขียน n, m และสามารถเพิ่มหรือลบตัวเลขได้ดังนั้น + 1, $ - 1 ค่าเฉลี่ยจากบรรทัดถัดไปถึงบรรทัดที่สอง คำสั่งที่ประกอบด้วยเพียงหมายเลขบรรทัดไปที่บรรทัดนั้น นี่เป็นชุดคำสั่งย่อยที่เหลือที่ฉันใช้:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w เขียนบรรทัดทั้งหมด (หรือช่วงที่เลือก) ไปยังไฟล์
:1d¬
ลบบรรทัด 1
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s ใช้แทนนิพจน์ทั่วไป มันเป็นการดีที่จะรู้ว่าการแสดงออกปกติ!
:q¬
E37: No write since last change (add ! to override)
q ออกจาก wq เขียนและออก Q! เลิกโดยไม่ต้องเขียนและในหลอดเลือดดำที่คล้ายกัน w! บังคับให้เขียนไฟล์ถ้าเป็นไปได้
ตอนนี้เป็นคนที่ยอดเยี่ยม:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! เป็นคำสั่งกรองบรรทัดลงในคำสั่งเชลล์
และในที่สุดก็:
:vi¬
เข้าสู่โหมด VISUAL อย่าหลงกล ดูเหมือนว่าเป็นตัวแก้ไข แต่มันก็เป็นเพียงเปลือกโปรแกรมมิงแบบโต้ตอบ คุณเพิ่งจะดูบัฟเฟอร์ตลอดเวลาและอีกสองสามคำสั่ง ในโหมดภาพ a: แสดงพร้อมต์: จากโหมด ex ปุ่มลูกศร (ถ้าทำงาน) เลื่อนไปมาและถ้าไม่ทำ hjkl ก็ทำเช่นนั้น! h เหลือ, j ลง, k ขึ้นและขวา 0 ย้ายไปที่อักขระตัวแรกและ ^ (คิดว่า regex ที่นี่!) ไปยังอักขระที่ไม่ใช่ช่องว่างบรรทัดแรกบนบรรทัด $ (regex อีกครั้ง!) ย้ายไปยังจุดสิ้นสุดของบรรทัด การพิมพ์: 999¬ไปที่บรรทัด 999 โดยธรรมชาติเหมือนกับในโหมด ex
"i" เข้าสู่โหมดแทรกซึ่งตอนนี้แทรกตัวอักษรแทนที่จะเป็นบรรทัดและลงท้ายด้วยการกดปุ่มลัดแทน ".¬" "I" แทรกที่จุดเริ่มต้น "a" หลังอักขระภายใต้เคอร์เซอร์และ "A" หลังจากสิ้นสุดบรรทัดปัจจุบัน กดปุ่ม Escape เสมอเมื่อพิมพ์ข้อความเสร็จ "x" ลบอักขระใต้เคอร์เซอร์และ "D" จะลบจากเคอร์เซอร์จนถึงท้ายบรรทัด "Y" ดึง (คัดลอก) บรรทัดปัจจุบันและ "P" วางกลับ ": pu" ทำเช่นเดียวกัน แต่สามารถนำหน้าด้วยหมายเลขบรรทัด ": ya" เทียบเท่ากับ "Y" และอีกครั้งมีประโยชน์ในการใช้กับช่วงของเส้น ฉันคิดว่ามีคำสั่ง mark เช่นกัน แต่ฉันจะยอมรับว่าฉันจำไม่ได้ ฉันไม่ควรพลาด
ด้านบนคือสิ่งที่ฉันใช้และฉันรู้ว่าฉันอาจไม่ใช่ผู้ใช้ vi ที่ "มีประสิทธิภาพ" ในทางกลับกันฉันใช้ความเก่งกาจของอดีตตัวอย่างเช่นไฟล์การแก้ไขสคริปต์ ต้องการเปลี่ยนชื่อโฮสต์ของคุณ foo.bar.com เป็น www.foobar.com ในไฟล์ conf จำนวนหรือไม่
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
สิ่งที่ฉันพยายามจะพูดคือฉันคิดว่าปัญหาของ vi คือคนคิดว่ามันเป็นตัวแก้ไขที่ยาก ทั้งหมดก็คือการเปลี่ยนความคิดของคุณเพียงเล็กน้อยและมองว่าเป็นภาษาโปรแกรมเชิงโต้ตอบที่เรียบง่าย แต่ทรงพลังมาก ๆ แทน มีประสิทธิภาพมากถึงแม้จะมีชุดย่อยของคำสั่งที่มีอยู่คุณสามารถใช้มันเพื่อผลที่ยอดเยี่ยม - ไม่เพียง แต่เป็นเครื่องมือแก้ไข แต่โดยทั่วไปแล้วเป็นเครื่องมือที่ใช้สคริปต์ได้ดีรวมกับส่วนที่เหลือของ Unix ฉันสงสัยว่า nano จะทำทั้งหมดนี้ - emacs ... อาจจะ