การใช้ปุ่ม VI เพื่อแก้ไขคำสั่งเชลล์ใน UNIX


28

ฉันเคยมีเพื่อนร่วมงานซึ่งเก่งเรื่องยูนิกซ์จริงๆ

เขาแสดงให้ฉันเห็นวิธีใช้การเชื่อมโยงคีย์ Vi เพื่อแก้ไขคำสั่งเชลล์ของฉัน

เขาวางคำสั่งไว้ในไฟล์ที่รันทุกครั้งที่ฉันเข้าสู่ระบบ

ตั้งแต่นั้นมาฉันย้ายไปที่โครงการอื่น

น่าเสียดายที่ฉันจำวิธีตั้งค่านี้ไม่ได้

มีใครบ้างที่รู้วิธีใช้การเชื่อมโยงคีย์ Vi เพื่อแก้ไขคำสั่งในเทอร์มินัลหรือไม่

ฉันจะทำให้การตั้งค่านั้นเป็นแบบถาวรได้อย่างไร

คำตอบ:


31

คุณกำลังพูดถึงคุณสมบัติที่ยอดเยี่ยมที่สุด!

คุณสามารถใช้คำสั่ง vi เพื่อแก้ไขคำสั่งเชลล์ (และประวัติคำสั่ง) โดยเพิ่มลงใน.bashrcไฟล์ของคุณ:

set -o vi

คุณยังสามารถเรียกใช้คำสั่งนั้นจากบรรทัดคำสั่งเพื่อให้มีผลเฉพาะเซสชันปัจจุบันของคุณ

หากคุณไม่ใช้ bash ให้แทนที่ไฟล์ rc ที่เหมาะสมสำหรับเชลล์ของคุณ


สิ่งนี้อนุญาตให้คุณใช้คำสั่ง vi เพื่อแก้ไขคำสั่งใด ๆ ...

คุณสามารถใช้jและkเพื่อเลื่อนดูประวัติของคุณ (หลังจากกดESC)

คุณยังสามารถใช้/(หลังจากกดปุ่มESC) เพื่อค้นหาคำสั่งเก่าได้

ในคำอื่น ๆ เพื่อค้นหาcpคำสั่งที่ยาวมากคุณทำเมื่อสิบนาทีก่อน:

ESC/ซีพีENTER

แล้วคุณจะสามารถผ่านรอบทุกคำสั่งที่ตรงกันในประวัติศาสตร์ของคุณด้วยและnN

ทั้งหมดนี้ทำให้ฉันมีประสิทธิภาพมากขึ้นที่บรรทัดคำสั่ง 10 ล้านล้านเท่า!


4
มันไม่ได้ใช้ vi จริงๆมันใช้คำสั่งคีย์บอร์ดแบบ vi สำหรับการแก้ไขบรรทัด

4
แน่นอน ... ฉันเดาว่าคำศัพท์ที่เหมาะสมคือvi bindings in the shellคุณลักษณะที่ยิ่งใหญ่ที่สุดที่เคยประดิษฐ์!
jahroy

ฉันจะเปลี่ยนจากการผูก emacs เป็น vi การเชื่อมโยงหากมีวิธีการแสดงโหมด คุณรู้วิธีที่จะทำเช่นนั้น?
iconoclast

พวกเขามีวิธีที่จะผูกjjกับESCที่เรามักจะเป็นกลุ่ม?
steveyang

@yangchenyun - บางทีคำถามนี้อาจช่วยได้: stackoverflow.com/questions/844862/… ฉันไม่ได้ผูก / แก้ไขคำสั่งใด ๆ โดยส่วนตัวดังนั้นฉันไม่แน่ใจว่าสิ่งที่คุณถาม
jahroy

12

หากคุณใช้ทุบตีเนื่องจาก jahroy และ otto ชั่วร้ายได้ตอบแล้วคุณสามารถใช้

set -o vi

เพื่อทำให้ bash ใช้คำสั่งการแก้ไขแบบ vi

เมื่อคุณทำสิ่งนี้แล้วคุณสามารถพิมพ์Esc vเพื่อเปิดตัวแก้ไข vi ด้วยไฟล์ชั่วคราวที่มีสำเนาของบรรทัดคำสั่งปัจจุบัน คุณสามารถแก้ไขคำสั่งแม้จะแทนที่ด้วยหลายบรรทัด เมื่อคุณบันทึกไฟล์ ( :wq) เชลล์จะดำเนินการตามคำสั่งที่แก้ไข

หากคุณต้องการ

set -o emacs

คุณสามารถใช้Ctl-XCtl-Eเพื่อทำสิ่งเดียวกัน มันจะใช้โปรแกรมแก้ไขที่คุณต้องการ$EDITORไม่จำเป็นต้องเป็น emacs

(โดยส่วนตัวแล้วฉันใช้ vi (จริง ๆ เป็นกลุ่ม) สำหรับการแก้ไขส่วนใหญ่ของฉัน แต่ฉันชอบset -o emacsในเชลล์การสลับเข้าและออกจากโหมดแทรกเหมาะสำหรับการแก้ไขไฟล์ แต่น่าแปลกใจสำหรับคำสั่งแบบโต้ตอบ YMMV)


คุณรู้วิธีที่จะกลับไปที่โหมดแก้ไขปกติหลีกเลี่ยงสไตล์ vi หรือไม่? ฉันจำได้ว่าประสบความสำเร็จกับ Bl Num แต่ตอนนี้ไม่มาก ฉันหายไปอะไร
Piertoni

@piertoni: คุณไม่set -o emacsได้ทำสิ่งที่คุณต้องการ?
Keith Thompson

ใช่มันใช้งานได้ฉันพลาดประเด็นขอบคุณ
Piertoni

10

คุณสามารถใช้set -o viเพื่อเปลี่ยนคำสั่งแก้ไขบรรทัดของคุณเป็น @jahroy โพสต์ แต่คุณอาจจะคิดว่าfcคำสั่ง (มีอยู่ในทุบตีและฉันคิดว่า ksh แต่อาจไม่ใช่ tcsh) ซึ่งจะทำให้คำสั่งก่อนหน้าเป็นบรรณาธิการ (FCEDIT หรือบรรณาธิการ ซึ่งคุณอาจตั้งค่าเป็น vi) จากนั้นเรียกใช้งานคำสั่งเมื่อคุณออกจากโปรแกรมแก้ไข ดู manpage หรือhelp fcเพื่อดูรายละเอียดหรือลองดู


5
alias r='fc -e -'เป็นชื่อแทนที่มีค่าสำหรับรันคำสั่งก่อนหน้านี้อีกครั้ง fcฉันเชื่อว่าด้วยตัวของมันเองใน Korn Shell คุณสามารถระบุคำสั่งด้วยหมายเลข ( fc 123 129เพื่อแก้ไขหมายเลขคำสั่ง 123 ถึง 129 ในประวัติ) คุณสามารถระบุหมายเลขสัมพัทธ์ ( fc -10 -1เพื่อแก้ไข 10 คำสั่งล่าสุดที่ป้อน) fc -lคุณสามารถแสดงรายการคำสั่งก่อนหน้านี้ด้วย คุณสามารถระบุคำสั่งด้วยคำนำหน้าด้วยrนามแฝง ( r makeเรียกใช้การขอร้องครั้งสุดท้ายของmake; ดังนั้นr mถ้าคุณไม่ได้เรียกใช้mvคำสั่งตั้งแต่คุณวิ่งครั้งล่าสุดmakeเป็นต้น)
Jonathan Leffler

6

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

  1. สร้างไฟล์ชั่วคราว/tmpและเติมด้วยคำสั่งที่พิมพ์ล่าสุด
  2. หลังจากตัวแก้ไขออกตามปกติ (ด้วยรหัสการออก 0) จะดำเนินการคำสั่งที่พบในไฟล์ชั่วคราวนั้นและลบไฟล์นี้ เวอร์ชันที่แก้ไขจะถูกบันทึกในประวัติเป็นคำสั่งปกติ (อย่างน้อยเป็น zsh) มันรันอะไรถ้าบรรณาธิการออกด้วยรหัสอื่นแล้วเป็นศูนย์ (ในเสียงนี้สามารถทำได้โดยการฆ่ามันหรือใช้:cquit)

คำสั่งทำงานได้ทั้งใน bash และ zsh


5

อันที่จริงนี่เป็นคุณลักษณะที่ยิ่งใหญ่ที่สุดที่เคยมีมา ยังมีอีก:

สร้างไฟล์ชื่อ

.editrc

มีเส้น

bind -v

Editline เป็นไลบรารี่รุ่นลิขสิทธิ์ BSD ที่ให้บริการคล้ายกับ readline . editrc จะตั้งค่าการโยงคีย์ของคุณเป็นโหมด vi ในเชลล์บรรทัดคำสั่งของ MySQL หรือแอปพลิเคชันใด ๆ ที่ไม่ได้ใช้ readline

ฉันหลงลืมไปหลายปีแล้วดังนั้น. zshrc ของฉันจึงรวบรวมwrappersสำหรับโหมด vi เพื่อแสดงโหมดที่ฉันใช้ในบรรทัดคำสั่ง มันดีนะ.

ฉันรู้ใน zsh คุณสามารถพิมพ์

bindkey -L

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


หวังว่าฉันจะสามารถลงคะแนน 5 ครั้งนี้สำหรับการผูก vi ใน MySQL!
jahroy

1

export EDITOR=viของคุณในขั้วประเภท

เพื่อบันทึกการตั้งค่านี้ ใส่บรรทัดนี้ในไฟล์ ~ / .profile


5
ที่กำหนดบรรณาธิการเริ่มต้นของคุณ (คำสั่งที่ให้ความสนใจที่จะ$EDITOR) viไป มันไม่อนุญาตให้คุณแก้ไขคำสั่งเชลล์ด้วยvi(อย่างน้อยก็ไม่โดยตรง)
Keith Thompson

2
ค่าเริ่มต้น @KeithThompson zsh เพื่อ vi โหมดการแก้ไขถ้ามี$EDITOR viฉันคิดว่ามันเป็นเปลือกหอยตัวเดียวที่ทำสิ่งนี้
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.