วิธีที่เร็วที่สุดในการย้ายเคอร์เซอร์บนบรรทัดคำสั่งปลายทาง?


156

เป็นวิธีที่ดีที่สุดในการย้ายไปรอบ ๆ ในบรรทัดคำสั่งยาวมากใน terminal คืออะไร?

ว่าฉันใช้ปุ่มลูกศรหรือCtrl- Rเพื่อรับบรรทัดคำสั่งยาวนี้:

./cmd --option1 --option2 --option3 --option4 --option5 --option6 --option7 --option8 --option9 --option10 --option11 --option12 --option13 --option14 --option15 --option16 --option17 --option18 --option19 --option20 --option21 --option22 --option23 --option24 --option25 --option26 --option27 --option28 --option29 --option30 --option31 --option32 --option33 --option34 --option35 --option36 --option37 --option38 --option39 --option40 --option41 --option42 --option43 --option44 --option45 --option46 --option47 --option48 --option49 --option50 

ตอนนี้ฉันต้องย้าย (เริ่มจากจุดเริ่มต้นหรือจุดสิ้นสุดของบรรทัด) เคอร์เซอร์ไปที่--option25เพื่อปรับเปลี่ยนบางสิ่งที่นั่น

วิธีที่เร็วที่สุดที่จะไปที่นั่นคืออะไร? สิ่งที่ฉันมักจะทำคือCtrl- Aไปที่จุดเริ่มต้นและจากนั้นซ้ำ ๆAlt- Fเพื่อก้าวไปข้างหน้าคำต่อคำ (หรือCtrl- Eเพื่อไปยังจุดสิ้นสุดและAlt- Bจากนั้นย้อนกลับไป) แต่ในสายยาวที่ใช้เวลามากเกินไป ต้องมีวิธีในการค้นหาและข้ามไปยังส่วนที่ฉันต้องการแก้ไขเช่นoption25?

คำตอบ:


107

เนื่องจากสิ่งนี้ยังไม่ถูกปิดนี่เป็นอีกตัวเลือกเพิ่มเติม

  • ใช้Ctrl+ xตามด้วยCtrl+ eเพื่อเปิดบรรทัดปัจจุบันในตัวแก้ไขที่ระบุโดย$FCEDITหรือ$EDITORหรือemacs(ลองตามลำดับนั้น)
  • หากคุณรันคำสั่งก่อนหน้านี้กดCtrl+ rเพื่อค้นหาประวัติการย้อนกลับและพิมพ์option25(ในกรณีนี้) เส้นจะปรากฏขึ้น กดTabเพื่อเริ่มแก้ไข ณ จุดนี้
  • ใช้การขยายประวัติด้วยs///ตัวแก้ไข เช่น!-2:s/--option25/--newoption/จะเรียกใช้คำสั่งที่สองถึงครั้งสุดท้ายอีกครั้ง แต่แทนที่ option25 หากต้องการแก้ไข./cmdคำสั่งสุดท้ายให้ใช้!stringไวยากรณ์: !./cmd:s/--option25/--newoption/
    ตัวคั่นใด ๆ อาจใช้แทน / ในการทดแทน
  • หากแก้ไขบรรทัดก่อนหน้าคุณสามารถใช้การทดแทนด่วน: ^--option25^--newoption
  • ค้นหาตัวละคร สิ่งนี้ถูกกล่าวถึงโดย Pax และสามารถทำได้ในโหมด emacs ปกติด้วยCtrl+ ]สำหรับการค้นหาไปข้างหน้าและCtrl+ Alt+ ]สำหรับการค้นหาย้อนหลัง

ฉันแนะนำตัวเลือกที่สอง Ctrl+ rมีประโยชน์จริง ๆ และรวดเร็วไม่มีการล้อเล่นกับบรรณาธิการและคุณเห็นผลลัพธ์ก่อนที่คำสั่งจะทำงาน (ไม่เหมือนกับการขยายประวัติ)


203

เพื่อความชัดเจนคุณไม่ต้องการ "วิธีที่รวดเร็วในการเลื่อนเคอร์เซอร์ไปที่บรรทัดคำสั่งเทอร์มินัล " สิ่งที่คุณต้องการจริงๆคือวิธีที่รวดเร็วในการเลื่อนดูบรรทัดคำสั่งในโปรแกรมเชลล์

ยกตัวอย่างเช่นBashเป็นเปลือกที่พบได้บ่อยมาก มันใช้ห้องสมุดReadlineเพื่อดำเนินการอินพุตบรรทัดคำสั่ง และเพื่อที่จะบอกว่ามันสะดวกมากที่จะรู้ว่าการผูก Readline เนื่องจากมันถูกใช้ไม่เพียง แต่ในการทุบตี ตัวอย่างเช่น gdb ยังใช้ Readline เพื่อประมวลผลอินพุต

ในเอกสารประกอบ Readline คุณสามารถค้นหาการเชื่อมโยงการนำทางที่เกี่ยวข้องทั้งหมด (และอื่น ๆ ): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

คัดลอกสั้น ๆ หากลิงค์ด้านบนดับลง:

Bare Essentials

  • Ctrl-b เลื่อนกลับไปหนึ่งอักขระ
  • Ctrl-f เลื่อนไปข้างหน้าหนึ่งอักขระ
  • [DEL] หรือ [Backspace] ลบอักขระทางด้านซ้ายของเคอร์เซอร์
  • Ctrl-d ลบอักขระที่อยู่ใต้เคอร์เซอร์
  • Ctrl-_ หรือ Cx Cu เลิกทำคำสั่งแก้ไขล่าสุด คุณสามารถเลิกทำย้อนกลับไปยังบรรทัดว่าง

การเคลื่อนไหว

  • Ctrl-a ย้ายไปที่จุดเริ่มต้นของบรรทัด
  • Ctrl-e เลื่อนไปที่ท้ายบรรทัด
  • Meta-f เลื่อนไปข้างหน้าคำที่คำประกอบด้วยตัวอักษรและตัวเลข
  • Meta-b เลื่อนไปข้างหลังหนึ่งคำ
  • Ctrl-l ล้างหน้าจอพิมพ์บรรทัดปัจจุบันที่ด้านบน

ฆ่าแล้วงัด

  • Ctrl-k ฆ่าข้อความจากตำแหน่งเคอร์เซอร์ปัจจุบันไปยังจุดสิ้นสุดของบรรทัด
  • Md ฆ่าจากเคอร์เซอร์ไปยังจุดสิ้นสุดของคำปัจจุบันหรือหากระหว่างคำถึงจุดสิ้นสุดของคำถัดไป ขอบเขตของคำเหมือนกับที่ใช้โดย Mf
  • M- [DEL] ฆ่าจากเคอร์เซอร์ตั้งแต่เริ่มต้นของคำปัจจุบันหรือหากระหว่างคำจนถึงจุดเริ่มต้นของคำก่อนหน้า ขอบเขตของ Word นั้นเหมือนกับขอบเขตที่ใช้โดย Mb
  • Ctrl-w ฆ่าจากเคอร์เซอร์ไปยังช่องว่างก่อนหน้า สิ่งนี้แตกต่างจาก M- เนื่องจากขอบเขตของคำต่างกัน
  • Ctrl-y ดึงข้อความที่ถูกฆ่าล่าสุดกลับเข้าไปในบัฟเฟอร์ที่เคอร์เซอร์
  • หมุนวงแหวนฆ่าของฉันและดึงยอดใหม่ คุณสามารถทำได้หากคำสั่งก่อนหน้านี้คือ Cy หรือ My

M คือเมตาคีย์ สำหรับ Max OS X Terminal คุณสามารถเปิดใช้งาน "ใช้ตัวเลือกเป็นคีย์เมตา" ในการตั้งค่า / คีย์บอร์ดสำหรับสิ่งนั้น สำหรับ Linux มันซับซ้อนกว่า

ปรับปรุง

โปรดทราบว่า Readline สามารถทำงานในสองโหมด:

  • โหมด emacs (ซึ่งเป็นค่าเริ่มต้น)
  • โหมดvi

หากต้องการสลับ Bash ให้ใช้โหมด vi:

$ set -o vi

ส่วนตัวฉันชอบโหมด vi เพราะฉันใช้เสียงเรียกเข้าสำหรับการแก้ไขข้อความ

โบนัส

ในแอป Terminal ของ MacOS (และใน iTerm ด้วย) คุณสามารถคลิกตัวเลือกเพื่อเลื่อนเคอร์เซอร์ (เคอร์เซอร์จะเลื่อนไปยังตำแหน่งที่คลิก) vimนี้ยังทำงานอยู่ภายใน


3
ฉันชอบคำตอบนี้เพราะมันทำให้ [แก่นแท้ / รูท / เหตุผลอยู่เบื้องหลัง] ว่าคีย์บอร์ด bash ทำงานอย่างไร (มาจากไหน) เช่น Readline
eugenevd

6
ในเทอร์มินัล Ubuntu มาตรฐาน Meta (M) คือ Alt + Shift ยกเว้นว่าคุณปิดใช้งานแป้นพิมพ์ลัดการเข้าถึงเมนูซึ่งในกรณีนี้คือ Alt
brianpeiris

2
ใน Kde ใน Konsole Meta (M) เป็นปุ่ม alt
Pipo

ปัญหาคือ Meta + F ไม่ทำงานหาก Meta เป็น ALT เนื่องจาก ALT ให้การเข้าถึงเมนูของโปรแกรมที่กำลังทำงาน (ในกรณีนี้เทอร์มินัล) มีทางเลือกอื่นหรือไม่?
Pithikos

1
Mf คืออะไรดังนั้นคุณไม่ได้ใช้การควบคุมที่นี่เพื่ออะไร
PositiveGuy

33

กดปุ่มตัวเลือกค้างไว้แล้วคลิกตำแหน่งที่คุณต้องการให้เคอร์เซอร์เคลื่อนที่และเทอร์มินัลจะเร่งเคอร์เซอร์ไปยังตำแหน่งที่แม่นยำ


2
คุณเพิ่งทำซ้ำประสิทธิภาพของฉัน
Lay González

สิ่งนี้ทำงานในสภาพแวดล้อมใด ฉันเดาใน Mac OS เท่านั้น?
Abdull

ทำงานบน ssh linux จากระยะไกลแม้ผ่านเซิร์ฟเวอร์กระโดด
John Jiang

10

ฉันมักจะชอบโหมดแก้ไข vi (เนื่องจากการกดแป้นเหล่านั้นฝังอยู่ในไขสันหลังของฉันตอนนี้ (สมองไม่ได้ใช้เลย) พร้อมกับ CTRL-K, CTRL-X จาก WordStar 3.3 :-) คุณสามารถใช้บรรทัดคำสั่งset -o viเพื่อเปิดใช้งานมัน (และset -o emacsเพื่อย้อนกลับ)

ใน Vi มันจะเป็น (ESC-K เพื่อให้ได้แถวก่อน) " f5;;B" (โดยไม่ต้องใส่เครื่องหมายอัญประกาศ)

แน่นอนคุณต้องเข้าใจสิ่งที่อยู่ในสายเพื่อให้ได้สิ่งนี้ โดยทั่วไปมันเป็น

f5 to find the first occurrence of "5" (in --option5).
;  to find the next one (in --option15).
;  to find the next one (in --option25).
B  to back up to the start of the word.

เรามาดูกันว่าผู้สนใจรัก emacs สามารถหาวิธีแก้ปัญหาที่ดีกว่าได้หรือไม่การกดแป้นน้อยกว่า 5 ครั้ง (แม้ว่าฉันไม่ต้องการเริ่มสงครามศาสนา)

คุณเคยคิดบ้างไหมว่าคุณอาจต้องการที่จะใส่คำสั่งอันน่ากลัวนี้ลงในสคริปต์หรือไม่ :-)

ที่จริงแล้วฉันสามารถไปได้ดีกว่านั้น: " 3f5B" เพื่อค้นหาเหตุการณ์ที่เกิดขึ้นครั้งที่สามของ "5" จากนั้นกลับไปที่จุดเริ่มต้นของคำว่า


ไม่จำเป็นต้องใช้สคริปต์เพียงกด "v" ในโหมด vi และเปิดบรรทัดคำสั่งในเครื่องมือแก้ไข คุณสามารถจัดรูปแบบ commandline, err, "script" ได้ดียิ่งขึ้นด้วย newlines และไม่จำเป็นต้องมี tempfile :) ดังนั้น "v / 25" พาคุณไปที่นั่นใน 4 ตัวอักษร
dannysauer

แต่คุณต้องใช้คีย์ <Enter> มากกว่าเพื่อเรียกใช้ @dannysauer
CDR

9

ใช้ Meta-b / Meta-f เพื่อเลื่อนไปข้างหลัง / ไปข้างหน้าด้วยคำตามลำดับ

ใน OSX Meta แปลว่า ESC ซึ่งแย่มาก

แต่คุณสามารถเปิดการตั้งค่าเทอร์มินัล -> การตั้งค่า -> โปรไฟล์ -> แป้นพิมพ์และเลือก "ใช้ตัวเลือกเป็นเมตาคีย์"


8

หลังจากรันคำสั่งหนึ่งครั้งให้รัน fc

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

.. แต่อย่างที่ Pax กล่าว - บรรทัดคำสั่งไม่ดีสำหรับการแก้ไขบรรทัดที่ยาวอย่างไร้เหตุผล - ทำไมไม่สร้างคำสั่งให้เป็นสคริปต์ล่ะ?


4

หากคุณต้องการเลื่อนไปข้างหน้าจำนวนคำให้กดM-<n>( M-สำหรับ Meta และโดยปกติแล้วจะเป็นปุ่ม Escape) จากนั้นกดตัวเลข สิ่งนี้จะส่งอาร์กิวเมนต์ซ้ำไปที่ readline เพื่อให้คุณสามารถทำซ้ำคำสั่งใดก็ได้ที่คุณต้องการ - ถ้าคุณต้องการที่จะไปข้างหน้าแล้วกดM-<n> M-fและเคอร์เซอร์จะเลื่อนไปข้างหน้า<n>จำนวนคำ

เช่น

 $|echo "two three four five six seven"
 $ M-4
 (arg: 4) echo "two three four five six seven"
 $ M-f
 $ echo "two three four| five six seven"

ดังนั้นสำหรับตัวอย่างของคุณจากเคอร์เซอร์ที่จุดเริ่มต้นของบรรทัดที่คุณจะตีM-26 M-fและเคอร์เซอร์ของคุณจะอยู่ที่--option25|- หรือ - จากจุดสิ้นสุดของบรรทัดM-26 M-bจะวางเคอร์เซอร์ของคุณที่--|option25


2

การค้นหาประวัติที่เพิ่มขึ้น

ใน terminal ป้อน:

gedit  ~/.inputrc

จากนั้นคัดลอกวางและบันทึก

"\e[A": history-search-backward
"\e[B": history-search-forward
"\e[C": forward-char
"\e[D": backward-char

สิ่งที่คุณต้องทำเพื่อค้นหาคำสั่งก่อนหน้าคือการป้อนตัวอักษร 2 หรือ 3 ตัวแรกและลูกศรขึ้นด้านบนจะพาคุณไปที่นั่นอย่างรวดเร็วว่าฉันต้องการ:

for f in *.mid ; do timidity "$f"; done

สิ่งที่ฉันต้องทำคือแค่ใส่

fo

และกดคำสั่งลูกศรชี้ขึ้น


1

เลือกหนึ่งคือการใช้งานในM-x shell emacsที่มีเครื่องมืออำนวยความสะดวกการแก้ไขและการกดแป้นพิมพ์ทั้งหมดที่emacsมีดังนั้นC-sสามารถใช้เพื่อค้นหาข้อความoption25ได้

(แต่ฉันยังต้องการอยู่ในเทอร์มินัลเชลล์จริงแทนหากมีคนสามารถชี้ให้ฉันค้นหาและแก้ไขสิ่งอำนวยความสะดวกได้ดี)


0

ใช้เมาส์

บางครั้งวิธีที่ง่ายที่สุดในการแก้ไข commandline คือการใช้เมาส์ คำตอบก่อนหน้านี้บางคำสั่งให้เปิดบรรทัดปัจจุบันใน $ EDITOR ของคุณ สำหรับฉัน (zhs กับ grml config) ชุดค่าผสมนั้นคือAlt+eว่าการรวมกันเป็น หากคุณเปิดใช้งานเมาส์ในโปรแกรมแก้ไขคุณสามารถใช้ประโยชน์ได้

หากต้องการเปิดใช้งานเมาส์ใน Vim ให้เพิ่มสิ่งนี้ใน ~ / .vimrc ของคุณ

set mouse=a
set ttymouse=xterm2

หากคุณต้องการเลือกข้อความในเทอร์มินัล (แทนที่จะส่ง mouseclick ไปเป็นกลุ่ม) ให้กด Shift ค้างไว้เมื่อคุณคลิก นี่เป็นเทอร์มินัลเฉพาะแน่นอน

Sysadmins ไม่ควรกลัวเมาส์


0

ใน Cygwin คุณสามารถเปิดใช้งานคุณสมบัติดังกล่าวได้โดยคลิกขวาที่หน้าต่าง ในหน้าต่างป๊อปอัปเลือกตัวเลือก ... -> Mouse -> เปิดใช้งานเคอร์เซอร์บรรทัดคำสั่ง Clicks place -> Apply

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


0

ที่หนึ่ง: ส่งออก EDITOR = 'nano -m'

ดังนั้น: CTRL + X CTRL + E ตามลำดับ

บรรทัดปัจจุบันของคุณจะเปิดขึ้นในโปรแกรมแก้ไขนาโนพร้อมเปิดใช้งานเมาส์ คุณสามารถคลิกในส่วนใดก็ได้ของข้อความและแก้ไข

จากนั้นกด CTRL + X เพื่อออกและ y เพื่อยืนยันการบันทึก


0

ฉันสร้างสคริปต์เพื่อให้เคอร์เซอร์บรรทัดคำสั่งเลื่อนเมื่อคลิกเมาส์ :

  1. เปิดใช้งานการรายงานการติดตามเมาส์ xterm
  2. ตั้งค่าการโยง readline เพื่อใช้ลำดับ escape ที่เกิดจากการคลิก

มันสามารถพบได้ในGitHub

ข้อมูลเพิ่มเติมเกี่ยวกับโพสต์อื่น

จะทำงานถ้าecho -e "\e[?1000;1006;1015h" # Enable trackingลำดับการพิมพ์ของการหลบหนีบนเครื่องเมื่อคลิกด้วยเมาส์


0

มันอาจจะไม่เร็วที่สุด แต่นี่จำเป็นต้องอยู่ที่นี่บางคนอ่านเกี่ยวกับการเคลื่อนไหวของเคอร์เซอร์ ANSI

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

- Position the Cursor:
  \033[<L>;<C>H
     Or
  \033[<L>;<C>f
  puts the cursor at line L and column C.
- Move the cursor up N lines:
  \033[<N>A
- Move the cursor down N lines:
  \033[<N>B
- Move the cursor forward N columns:
  \033[<N>C
- Move the cursor backward N columns:
  \033[<N>D

- Clear the screen, move to (0,0):
  \033[2J  or \033c
- Erase to end of line:
  \033[K

- Save cursor position:
  \033[s
- Restore cursor position:
  \033[u

( ... )

ลองใส่รหัสบรรทัดต่อไปนี้ที่พรอมต์ (มันชัดเจนกว่าเล็กน้อยว่าจะทำอย่างไรถ้าพรอมต์นั้นมีหลายบรรทัดที่เทอร์มินัลเมื่อคุณใส่สิ่งนี้ไว้): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"สิ่งนี้ควรเลื่อนเคอร์เซอร์หน้าจอเจ็ดบรรทัดขึ้นมาพิมพ์คำว่า "BASH "จากนั้นกลับไปที่จุดเริ่มต้นของพรอมต์ปกติ


ตัวอย่าง :

เลื่อนเคอร์เซอร์ไปด้านหลัง 7 บรรทัด:

echo -e "\033[7A"

เลื่อนเคอร์เซอร์ไปที่บรรทัด 10, คอลัมน์ 5:

echo -e "\033[10;5H"

แสดงรหัสสีอย่างรวดเร็วเพื่อทำให้โปรแกรมเป็นสี:

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