จะแสดงโหมด Vi ปัจจุบันได้อย่างไรเมื่อใช้การทำคีย์เวิร์ด Vi ในเชลล์?


15

ฉันใช้ปุ่มลัด vi ในเปลือก tcsh ของฉัน

ตอนนี้ฉันไม่ทราบว่าโหมด vi ใดที่ฉันอยู่ ( insertโหมดหรือcommandโหมด) ซึ่งนำไปสู่ความยุ่งยากมากมาย

ไม่มีใครรู้วิธีแสดงโหมด vi ปัจจุบันในเปลือกหรือไม่ (โดยรวมไว้ในข้อความแจ้งหรือบางสิ่ง)

คำตอบ:


4

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

หากคุณต้องการอยู่ในโหมดคำสั่งให้กด ESC ก่อนพิมพ์คำสั่ง

หากคุณต้องการอยู่ในโหมดแทรกให้กด ESC และ i ก่อนพิมพ์เนื้อหา

คุณจะจบลงด้วยการกดปุ่ม ESC มาก แต่ผู้ใช้ vi ทุกคนที่ฉันเคยพบเจอก็ทำเช่นนั้นอยู่ดี


1
ปัญหาคือว่าในเชลล์, ESC พิเศษไม่ได้ถูกเพิกเฉย - เมื่อฉันให้ ESC พิเศษ, จากนั้นพิมพ์คำสั่ง (พูด h เพื่อเลื่อนไปทางซ้าย), มันแค่ส่งเสียงบี๊บและไม่ทำอะไรเลย
sundar - Reinstate Monica

2
โดย "Extra ESC" ฉันหมายถึงการกด ESC เมื่อฉันอยู่ในโหมดคำสั่ง - ซึ่งฉันทำ
บ่อย

คุณถูก. ฉันใช้มันมานานจนฉันไม่สังเกตเห็นพฤติกรรมนั้นอีกต่อไป อีกครั้งคำตอบที่ง่ายที่สุด หากคุณกดปุ่ม ESC และ h และไม่มีอะไรเกิดขึ้นให้กดปุ่ม h อีกครั้ง ฉันคิดว่านั่นเปิดขึ้นคำถามอื่น เหตุใดการกด ESC ขณะอยู่ในโหมด 'คำสั่ง' ของปุ่มลัด vi ทำให้อักขระตัวถัดไปตีความไม่ถูกต้อง? vi เองไม่ได้ทำสิ่งนี้ ฉันสามารถพิมพ์ ESC 10 ครั้งและคำสั่งถัดไปยังคงทำงานตามที่คาดไว้
Bob Weber

เคล็ดลับอีกประการหนึ่งปิดกระดิ่ง มันน่ารำคาญอย่างไม่น่าเชื่อเพียงเพราะเหตุผลที่คุณอธิบาย - และเพราะมันส่งเสียงบี๊บเมื่อเสร็จสิ้นแท็บ การทำเช่นนี้มีหลายวิธีขึ้นอยู่กับสภาพแวดล้อมของคุณ
Bob Weber

1
ตกลงฉันกำลังลองใช้วิธีแก้ปัญหานี้ การทำแผนที่ Caps Lock to Escape ทำให้การใช้งานนี้ง่ายขึ้น แต่ฉันยังไม่คุ้นเคยกับ ESC-i สำหรับโหมดแทรก ฉันหวังว่าฉันจะเร็ว ๆ นี้ > ถ้าคุณกดปุ่ม ESC และ h และไม่มีอะไรเกิดขึ้นให้กดปุ่ม h อีกครั้งปัญหาที่เกิดขึ้นกับมันคือมันค่อนข้างหงุดหงิดและหยุดไหลเป็นจำนวนมาก มันเป็นสิ่งพิเศษที่ฉันต้องคิดนอกเหนือจากคำสั่งที่ฉันกำลังก่อตัว ฉันชอบคำสั่ง vi keybindings สำหรับเหตุผลที่พวกเขาอยู่ในความทรงจำกล้ามเนื้อของฉันและให้สิ่งหนึ่งที่น้อยกว่าที่จะคิดเกี่ยวกับ - การแบ่งประเภทนี้มีวัตถุประสงค์เพื่อตัวเอง ...
sundar - Reinstate Monica

3

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

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

OTOH ถ้านี่เป็นสัตว์เลี้ยงที่ฉุนเฉียวของคุณและมันทำให้คุณคลั่งและคุณอยากจะตบปัญหานี้อย่างยิ่งนี่เป็นความคิดของฉันเกี่ยวกับเรื่องนี้:

  1. รับสำเนาของการเขียนโปรแกรมขั้นสูงในสภาพแวดล้อม UNIX (R)โดย W. Richard Stevens
  2. อ่านบทในStreamsและ Terminal I / O
  3. ดาวน์โหลดซอร์สโค้ดไปยังหนังสือข้างต้นซึ่งรวมถึงตัวอย่างของสตรีมที่สามารถเลเยอร์ลงบนเทอร์มินัล
  4. ใช้การจัดการของคุณสำหรับการรวมกันของปุ่ม Esc (หรือทั้งสองโหมดเปลี่ยนการกดปุ่มกด) และระบุผ่านการจัดการเสียงระฆังหรือพื้นหลังของบรรทัดปัจจุบัน

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

เมื่อป้อนตัวละครโมดูลแรกจะตรวจสอบและส่งต่อ (ถ้าต้องการ) เมื่อคำตอบมาถึงในทิศทางตรงกันข้ามมันจะมีโอกาสอีกครั้งในการตรวจสอบและส่งต่อ นี่คือวิธีที่ Ctrl-C ได้รับการจัดการในระดับที่สูงขึ้นไปยังคีย์อักขระปกติ

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

มีไพรเมอร์ที่ดีที่นี่แต่ฉันไม่สามารถหาได้มากในหัวข้อนี้อาจเป็นเพราะมันผ่านนายก


2

หน้านี้มีสคริปต์รายละเอียดอย่างเป็นธรรมซึ่งกำหนดขึ้นสิ่งที่คุณต้องการ (และอื่น ๆ ) ในzsh บางทีมันอาจถูกดัดแปลงให้ทำงานกับ tcsh (ฉันไม่คุ้นเคยกับเปลือกหอยมากนัก)


ฉันไม่คุ้นเคยกับ tcsh เช่นกัน แต่ฉันคิดว่าหน้าเว็บที่คุณแสดงใช้เครื่องมือ zsh (พร้อม zle) ฉันไม่คิดว่าหอยอื่นมี แต่ถ้าพวกมันทำนั่นจะเป็นการหลอกลวง
BrianH

1

ให้ทุกคนมีปัญหานี้แน่นอน (อย่างผม) ผมพบว่าวิธีการแก้ปัญหาที่StackOverflow เห็นได้ชัดว่ามีการสนับสนุนดั้งเดิมสำหรับเรื่องนี้ใน readline ดังนั้นคุณสามารถเพิ่มสิ่งต่อไปนี้ใน~/.inputrc:

set show-mode-in-prompt on

และเพื่อปรับแต่งการใช้อักขระจริง:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"

0

การแก้ไข Command-Line ด้วย tcsh

มีโหมดหลักสองโหมดสำหรับการแก้ไขบรรทัดคำสั่ง
ตามตัวแก้ไขข้อความที่ใช้บ่อยที่สุดสองตัวคือ Emacs และ vi

ด้วยการเชื่อมviคุณต้องสลับระหว่างโหมดแทรกและโหมดคำสั่ง
คำสั่งต่าง ๆ มีประโยชน์ในแต่ละโหมด

โหมด viมีโหมดย่อยสองโหมดคือโหมดแทรกและโหมด คำสั่ง

  • โหมดเริ่มต้นคือการแทรก
  • Escคุณสามารถสลับระหว่างโหมดโดยการกด
  • อีกทางเลือกหนึ่งในคำสั่งโหมด
    การพิมพ์ 'a' (ผนวก) หรือ 'ฉัน' (แทรก) จะกลับมาให้คุณใส่
    โหมด

หมายเหตุเพิ่มเติมเกี่ยวกับหน้าการtcshปรับแต่งที่เชื่อมโยงไว้ข้างต้นแล้ว


2
ลิงก์ของคุณไปยังหนังสือ O'Reilly ที่มีลิขสิทธิ์ ...
BrianH

0

ฉันมีปัญหาที่แน่นอนเหมือนกันและโดยบังเอิญได้พบวิธีแก้ปัญหา แม้ว่าเธรดนี้จะเก่า แต่ฉันไม่สามารถหาเว็บไซต์อื่นที่เสนอวิธีแก้ไขปัญหาได้ดังนั้นฉันจึงถือว่าการโพสต์ข้อความในกระทู้นี้ไม่เป็นไร

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

หวังว่านี่จะช่วยได้!


0

โปรดดูคำตอบของฉันในSO Bash 4.4 / Readline 7.0 จะเพิ่มการสนับสนุนสำหรับฟังก์ชันการทำงานนี้และในระหว่างนี้ฉันได้เผยแพร่ Bash 4.3 / Readline 6.3 ไปยังGithubรุ่นที่ได้รับการปรับปรุงแล้ว

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