เชลล์ที่มีความสามารถในการแก้ไขดีขึ้น


11

Shells (อย่างน้อยสิ่งที่ฉันรู้) มีความสามารถในการแก้ไขคำสั่งไม่ดีจริง

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

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

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

มีวิธีแก้ปัญหาที่ดีสำหรับสิ่งเหล่านี้หรือไม่?


3
คุณกำลังสร้างเทอร์มินัลด้วยเชลล์
JdeBP

คำตอบ:


13

จริง ๆ แล้ว Bash ค่อนข้างดีในเรื่องนี้ คุณเพียงแค่ต้องเรียนรู้ทางลัด ตัวอย่างเช่น (ในโหมด emacs เริ่มต้น):

  • Ctrl+ A: เลื่อนไปยังจุดเริ่มต้นของบรรทัด
  • Ctrl+ E: เลื่อนไปที่ท้ายบรรทัด
  • Ctrl+ B: เลื่อนหนึ่งตัวละครไปข้างหลัง
  • Ctrl+ F: เลื่อนไปข้างหน้าหนึ่งตัวอักษร
  • Alt+ B: เลื่อนหนึ่งคำไปข้างหลัง
  • Alt+ F: เลื่อนไปข้างหน้าหนึ่งคำ
  • Ctrl+ K: ลบ (ตัด) ทุกอย่างจนจบบรรทัด
  • Alt+ D: ลบ (ตัด) คำหลังเคอร์เซอร์
  • Ctrl+ W: ลบ (ตัด) คำก่อนเคอร์เซอร์
  • Ctrl+ Y: งัด (วาง) สิ่งที่อยู่ในบัฟเฟอร์ (สิ่งที่คุณตัดด้วยCtrl+ KหรือAlt+ Dตัวอย่าง)

และยังมีอีกมากมาย อ่านman readlineเพื่อดูว่ามีอะไรอีกบ้าง ~/.inputrcคุณสามารถกำหนดทางลัดที่แตกต่างกันโดยการวางไว้ใน ตัวอย่างเช่นหากต้องการให้Ctrl+ Leftย้อนกลับหนึ่งคำและCtrl+ Rightไปข้างหน้าหนึ่งคำให้เพิ่มสิ่งนี้ใน~/.inputrc:

"\e[1;5D": backward-word 
"\e[1;5C": forward-word

ในการค้นหาความหมายของรหัสแปลก ๆ ให้กดCtrl+ Vแล้วกดปุ่มที่คุณต้องการใช้ หากคุณลองกับCtrl+ คุณจะเห็นRight ^[[1;5Cแทนที่^[ด้วยใน\e~/.inputrc


คุณอาจต้องการดูเปลือกอื่น ๆ เปลือกหอยที่มีคุณสมบัติ "ทันสมัย" ยอดนิยมประกอบด้วย:


ด้วยgnome-terminalคุณต้องใช้ESCปุ่มแทนALT การนำทางหนึ่งคำไปข้างหน้าและข้างหลัง . .. หรือเปลี่ยนเป็นเทอร์มินัลที่ไม่ใช้ Alt สำหรับเมนูแอปพลิเคชัน . . เช่น xterm หรือ sakura
Sergiy Kolodyazhnyy

@Serg ไม่ได้อยู่ในระบบของฉันขอบคุณ ฉันไม่รู้ว่าคุณตั้งค่าไว้เป็นอย่างนั้นหรือว่าเป็น Ubuntu เริ่มต้นที่ tweaked Esc มักใช้เป็นคำเหมือนของ Alt แม้ว่า
terdon

ไม่มีการแบ่งบัฟเฟอร์ระหว่าง terminal แม้ว่า
Craig Hicks

7

คุณสามารถแก้ไขคำสั่งว่างเปล่าหรือพิมพ์บางส่วนลงในโปรแกรมแก้ไขที่คุณเลือกโดยการตั้งค่าEDITORไปยังบรรณาธิการของทางเลือกของคุณและโดยการกดปุ่มCTRL+ X+ EหรือCTRL+ X/ CTRL+ Eซึ่งเปิดสายปัจจุบันได้รับการแก้ไขในEDITOR;

ตัวอย่างเช่นการตั้งค่าEDITORที่geditจะทำให้CTRL+ X+ EและCTRL+ X/ CTRL+ Eเปิดบรรทัดปัจจุบันใน Gedit

นี้เพื่อให้แก้ปัญหาอย่างถาวรคุณสามารถตั้งค่าในEDITOR~/.bashrc

สิ่งนี้อนุญาตให้ใช้แม้แต่ตัวแก้ไขข้อความกราฟิกแบบเต็มเพื่อแก้ไขคำสั่ง เพื่อเรียกใช้คำสั่งแก้ไขเพียงบันทึกและปิดเอกสาร


คุณลักษณะเดียวกันนี้สามารถเปิดใช้งานใน Zsh ได้โดยเพิ่มสิ่งต่อไปนี้ลงใน~/.zshrc:

autoload -U edit-command-line
zle -N edit-command-line
bindkey '^xe' edit-command-line
bindkey '^x^e' edit-command-line

2
สิ่งนี้ยังสามารถเรียกใช้ด้วยfcคำสั่งหากตั้งค่าตัวแปร FCEDIT คำตอบที่ดี !
Sergiy Kolodyazhnyy

1
@Serg ขอบคุณ แต่จะfcเปิดคำสั่งก่อนหน้า (ซึ่งเป็น neater ในบางวิธี) ฉันไม่รู้เกี่ยวกับเรื่องนั้นขอบคุณ!
kos

6

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

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

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

ดังนั้นวิธีการแก้ปัญหาคือการเข้าใจดีว่าเครื่องมือเหล่านี้กำลังทำและหมายถึงการทำและเลือกหนึ่งที่เหมาะสมสำหรับงาน


ฉันทราบความแตกต่าง แต่สามารถดำเนินการบางอย่างเพื่อปรับปรุงการแก้ไขคำสั่งของ bash ได้หรือไม่
UniversallyUniqueID

1
ใส่ไว้ในสคริปต์หรือไม่
ลูกไก่

0

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

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

:!...

แล้วคุณสามารถคลิกเมาส์ของคุณเพื่อข้ามไปยังทุกที่ในบรรทัด (คุณจะต้อง:set mouse=aก่อนถ้ายังไม่ได้เปิดใช้งาน) ปุ่มแก้ไขในโหมดนี้สามารถเห็นได้ด้วย:help cmdline-editing

q:กลุ่มนี้ยังมีค่อนข้างโหมดประวัติคำสั่งที่มีประสิทธิภาพซึ่งสามารถเข้าถึงได้โดยการกดปุ่ม จากตรงนั้นคุณสามารถดึงลบและวางโดยใช้คำสั่งโหมดปกติของ Vim ในโหมดนี้คุณสามารถเลือกด้วยเมาส์แล้วลบคุณสมบัติที่คุณต้องการ (โดยการกดปุ่มd)

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

ที่กล่าวว่าคุณสามารถปรับเปลี่ยนตัวแปรสภาพแวดล้อมจากภายในกระบวนการ Vim และใช้สิ่งเหล่านี้จากบรรทัดคำสั่งของ Vim และพวกเขาจะถูกส่งออกไปยังกระบวนการลูก:

:let $FOO="bar"        " the $ and the quotes are mandatory here

:echo $FOO             " Vim's own echo command
bar

:!echo "$FOO"          " Passing the variable to a shell command
bar

:!bash                 " Opening a child shell
$ echo "$FOO"
bar

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

โอ้และโดยวิธีถ้าคุณต้องการเอาท์พุทของคำสั่งเชลล์ในบัฟเฟอร์ Vim ปัจจุบันของคุณคุณสามารถทำเช่นนี้ (แต่ระวังว่ามันจะอุดตันบรรทัดปัจจุบันของคุณ):

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