Cách nhanh nhất để di chuyển con trỏ trên dòng lệnh đầu cuối?


155

Cách tốt nhất để di chuyển trên một dòng lệnh rất dài trong thiết bị đầu cuối là gì?

Nói rằng tôi đã sử dụng phím mũi tên hoặc Ctrl- Rđể có được dòng lệnh dài này:

./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 

Bây giờ tôi cần di chuyển (bắt đầu từ đầu hoặc cuối dòng) con trỏ --option25để sửa đổi một cái gì đó ở đó.

Cách nhanh nhất để đến đó là gì? Những gì tôi thường làm là Ctrl- Ađể bắt đầu và sau đó lặp đi lặp lại Alt- Fđể tiến về phía trước, từng chữ (hoặc Ctrl- Eđể đi đến cuối và Alt- Bđể sau đó đi lùi). Nhưng trên một dòng dài mà mất quá nhiều thời gian. Phải có một cách để tìm kiếm và nhảy trực tiếp đến phần tôi cần sửa đổi, vd option25?

Câu trả lời:


107

Vì điều này chưa được đóng lại, đây là một vài lựa chọn khác.

  • Sử dụng Ctrl+ xtheo sau Ctrl+ eđể mở dòng hiện tại trong trình chỉnh sửa được chỉ định bởi $FCEDIThoặc $EDITORhoặc emacs(đã thử theo thứ tự đó).
  • Nếu bạn đã chạy lệnh trước đó, nhấn Ctrl+ rđể tìm kiếm và nhập lịch sử ngược lại option25(trong trường hợp này). Dòng này sẽ được hiển thị. Nhấn Tabđể bắt đầu chỉnh sửa tại thời điểm này.
  • Sử dụng mở rộng lịch sử với công cụ s///sửa đổi. Ví dụ, !-2:s/--option25/--newoption/sẽ chạy lại lệnh thứ hai đến cuối cùng, nhưng thay thế tùy chọn25. Để sửa đổi ./cmdlệnh cuối cùng , sử dụng !stringcú pháp: !./cmd:s/--option25/--newoption/
    Bất kỳ dấu phân cách nào cũng có thể được sử dụng thay thế / thay thế.
  • Nếu chỉnh sửa dòng trước, bạn có thể sử dụng thay thế nhanh chóng: ^--option25^--newoption
  • Tìm kiếm nhân vật. Điều này đã được Pax đề cập và có thể được thực hiện trong chế độ emacs thông thường với Ctrl+ ]cho tìm kiếm chuyển tiếp và Ctrl+ Alt+ ]cho tìm kiếm ngược.

Tôi đề nghị lựa chọn thứ hai. Ctrl+ rthực sự tiện dụng và nhanh chóng, không cần chỉnh sửa với các biên tập viên và bạn sẽ thấy kết quả trước khi lệnh được chạy (không giống như mở rộng lịch sử).


203

Để rõ ràng, bạn không muốn "cách nhanh để di chuyển con trỏ trên dòng lệnh đầu cuối ". Những gì bạn thực sự muốn là một cách nhanh chóng để điều hướng qua dòng lệnh trong chương trình shell của bạn .

Bash là vỏ rất phổ biến, ví dụ. Nó sử dụng thư viện Readline để thực hiện đầu vào dòng lệnh. Và có thể nói, rất thuận tiện khi biết các ràng buộc Readline vì nó không chỉ được sử dụng trong bash. Ví dụ, gdb cũng sử dụng Readline để xử lý đầu vào.

Trong tài liệu Readline, bạn có thể tìm thấy tất cả các ràng buộc liên quan đến điều hướng (và hơn thế nữa): http://www.gnu.org/software/bash/manual/bash.html#Readline-Interaction

Sao chép-dán ngắn nếu liên kết ở trên đi xuống:

Tinh chất trần

  • Ctrl-b Di chuyển trở lại một ký tự.
  • Ctrl-f Di chuyển về phía trước một ký tự.
  • [DEL] hoặc [Backspace] Xóa ký tự bên trái con trỏ.
  • Ctrl-d Xóa ký tự bên dưới con trỏ.
  • Ctrl-_ hoặc Cx Cu Hoàn tác lệnh chỉnh sửa cuối cùng. Bạn có thể hoàn tác tất cả các cách trở về một dòng trống.

Phong trào

  • Ctrl-a Di chuyển đến đầu dòng.
  • Ctrl-e Di chuyển đến cuối dòng.
  • Meta-f Di chuyển về phía trước một từ, trong đó một từ bao gồm các chữ cái và chữ số.
  • Meta-b Di chuyển ngược một từ.
  • Ctrl-l Xóa màn hình, in lại dòng hiện tại ở trên cùng.

Giết và đánh

  • Ctrl-k Giết văn bản từ vị trí con trỏ hiện tại đến cuối dòng.
  • Md Giết từ con trỏ đến cuối từ hiện tại, hoặc, nếu giữa các từ, đến cuối từ tiếp theo. Ranh giới từ giống như ranh giới được sử dụng bởi Mf.
  • M- [DEL] Giết từ con trỏ bắt đầu từ hiện tại hoặc, nếu giữa các từ, bắt đầu từ trước đó. Ranh giới từ giống như ranh giới được sử dụng bởi Mb.
  • Ctrl-w Giết từ con trỏ đến khoảng trắng trước đó. Điều này khác với M- vì ranh giới từ khác nhau.
  • Ctrl-y Yank văn bản bị giết gần đây nhất trở lại bộ đệm tại con trỏ.
  • My Xoay vòng tiêu diệt và kéo đỉnh mới. Bạn chỉ có thể làm điều này nếu lệnh trước là Cy hoặc My.

M là khóa Meta. Đối với Terminal OS Max, bạn có thể bật "Sử dụng tùy chọn làm khóa meta" trong Cài đặt / Bàn phím cho điều đó. Đối với Linux thì phức tạp hơn.

Cập nhật

Cũng lưu ý rằng Readline có thể hoạt động ở hai chế độ:

Để chuyển Bash sang sử dụng chế độ vi:

$ set -o vi

Cá nhân tôi thích chế độ vi hơn vì tôi sử dụng vim để chỉnh sửa văn bản.

Tặng kem

Trong ứng dụng macOS Terminal (và trong iTerm cũng vậy), bạn có thể Tùy chọn-Nhấp để di chuyển con trỏ (con trỏ sẽ di chuyển đến vị trí được nhấp). Điều này thậm chí hoạt động bên trong vim.


3
Tôi thích câu trả lời này bởi vì nó đi xuống [bản chất / gốc / lý do đằng sau] cách thức hoạt động của bàn phím bash (xuất phát từ đâu), tức là Readline.
eugenevd

6
Trong thiết bị đầu cuối Ubuntu tiêu chuẩn, Meta (M) là Alt + Shift, trừ khi bạn vô hiệu hóa các phím tắt truy cập menu trong trường hợp đó chỉ là Alt.
brianpeiris

2
Trong Kde in Konsole, Meta (M) là phím alt
Pipo

Vấn đề là Meta + F không hoạt động nếu Meta là ALT do ALT cấp quyền truy cập vào menu của chương trình đang chạy (trong trường hợp này là terminal). Có một sự thay thế?
Pithikos

1
Mf là gì, vì vậy bạn không sử dụng điều khiển ở đây vậy nó là gì?
Tích cực,

33

Giữ phím Tùy chọn và nhấp vào nơi bạn muốn con trỏ di chuyển và Terminal đưa con trỏ đến vị trí chính xác.


2
Bạn chỉ cần nhân đôi hiệu quả của tôi
Lay González

Trong môi trường nào hoạt động này? Tôi đoán chỉ trong Mac OS?
Abdull

Hoạt động trên linux ssh từ xa, thậm chí thông qua một máy chủ nhảy.
John Jiang

10

Tôi có xu hướng thích chế độ chỉnh sửa vi (vì các tổ hợp phím đó được nhúng vào tủy sống của tôi bây giờ (bộ não hoàn toàn không được sử dụng), cùng với CTRL-K, CTRL-X từ Wordstar 3.3 :-). Bạn có thể sử dụng dòng lệnhset -o vi để kích hoạt nó (và set -o emacsđể hoàn nguyên).

Trong Vi, tất nhiên là phải (ESC-K để có được đội hình đầu tiên) "f5;;B " (không có dấu ngoặc kép).

Tất nhiên, bạn phải hiểu những gì trên dòng để thoát khỏi điều này. Về cơ bản, nó

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.

Chúng ta hãy xem những người hâm mộ emacs có thể đưa ra một giải pháp tốt hơn, ít hơn 5 lần nhấn phím (mặc dù tôi không muốn bắt đầu một cuộc chiến tôn giáo).

Bạn đã nghĩ về việc bạn có thể muốn đưa lệnh dài khủng khiếp này vào một kịch bản không? :-)

Trên thực tế, tôi có thể đi tốt hơn thế: " 3f5B" để tìm lần xuất hiện thứ ba của "5" sau đó quay lại từ đầu của từ.


Không cần tập lệnh - chỉ cần nhấn "v" trong chế độ vi và mở dòng lệnh trong trình chỉnh sửa. Bạn có thể định dạng dòng lệnh, err, "script" độc đáo hơn với dòng mới và không cần tempfile. :) Vì vậy, "v / 25" sẽ đưa bạn đến đó trong 4 ký tự.
dannysauer

Nhưng sau đó, bạn cần nhiều hơn phím <Enter> để chạy nó. @dannysauer
CDR

9

Sử dụng Meta-b / Meta-f để di chuyển lùi / tiến theo một từ tương ứng.

Trong OSX, Meta dịch là ESC, rất tệ.

Nhưng thay vào đó, bạn có thể mở tùy chọn thiết bị đầu cuối -> cài đặt -> hồ sơ -> bàn phím và kiểm tra "tùy chọn sử dụng làm khóa meta"


8

Sau khi chạy lệnh một lần, hãy chạy fc

Nó sẽ ra mắt $EDITOR với lệnh trước đó, sau đó bạn có thể sử dụng trình soạn thảo thông thường của mình để sửa đổi lệnh. Khi bạn lưu và thoát, tệp sẽ được thực thi.

..nhưng, như Pax đã nói - dòng lệnh không đặc biệt tốt để chỉnh sửa các dòng dài vô lý - tại sao không biến lệnh thành tập lệnh?


4

Nếu bạn muốn chuyển tiếp một số lượng từ nhất định, hãy nhấn M-<n>( M-dành cho Meta và thường là phím thoát), sau đó nhấn một số. Điều này sẽ gửi một đối số lặp lại để đọc, vì vậy bạn có thể lặp lại bất kỳ lệnh nào bạn muốn - nếu bạn muốn đi tiếp thì nhấn M-<n> M-fvà con trỏ sẽ di chuyển về phía trước <n>số lượng từ.

Ví dụ

 $|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"

Vì vậy, ví dụ của bạn từ con trỏ ở đầu dòng bạn sẽ nhấn M-26 M-fvà con trỏ của bạn sẽ ở --option25|-hoặc - từ cuối dòng M-26 M-bsẽ đặt con trỏ của bạn vào--|option25


2

Tìm kiếm lịch sử gia tăng

trong thiết bị đầu cuối nhập:

gedit  ~/.inputrc

sau đó sao chép và lưu

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

tất cả những gì bạn cần làm để tìm một lệnh trước đó là nhập 2 hoặc 3 chữ cái đầu tiên và mũi tên hướng lên sẽ đưa bạn đến đó nhanh chóng nói rằng tôi muốn:

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

tất cả những gì tôi cần làm là nhập

fo

và nhấn lệnh mũi tên hướng lên sẽ sớm xuất hiện


1

Một lựa chọn là sử dụng M-x shelltrong emacs. Điều đó cung cấp tất cả các phương tiện chỉnh sửa và tổ hợp phím emacscó, do đó C-scó thể được sử dụng để tìm kiếm văn bảnoption25 , ví dụ.

(Nhưng tôi vẫn thích ở trong vỏ thiết bị đầu cuối thực sự thay vì nếu ai đó có thể chỉ cho tôi các cơ sở tìm kiếm và chỉnh sửa tốt.)


0

Sử dụng chuột

Đôi khi, cách dễ nhất để chỉnh sửa một dòng lệnh là sử dụng chuột. Một số câu trả lời trước đưa ra lệnh mở dòng hiện tại của bạn trong $ EDITOR. Đối với tôi (zhs với grml config) sự kết hợp đó là Alt+e. Nếu bạn bật chuột trong trình chỉnh sửa của mình, bạn có thể sử dụng nó.

Để bật chuột trong Vim, hãy thêm nó vào ~ / .vimrc của bạn

set mouse=a
set ttymouse=xterm2

Nếu sau đó bạn muốn thực hiện lựa chọn văn bản trong thiết bị đầu cuối (thay vì chuyển mouseclick sang vim), hãy giữ Shift khi bạn nhấp; đây là thiết bị đầu cuối cụ thể, tất nhiên.

Sysadmin không nên sợ chuột.


0

Trong Cygwin, bạn có thể kích hoạt tính năng đó bằng cách nhấp chuột phải vào cửa sổ. Trong cửa sổ bật lên, chọn Tùy chọn ... -> Chuột -> kích hoạt Nhấp vào vị trí con trỏ dòng lệnh -> Áp dụng.

Từ giờ trở đi, chỉ cần nhấp vào nút chuột trái ở một số vị trí trong dòng lệnh sẽ đặt con trỏ ở đó.


0

đầu tiên: xuất EDITOR = 'nano -m'

sau đó: CTRL + X CTRL + E theo thứ tự.

Dòng hiện tại của bạn sẽ mở trong trình chỉnh sửa nano với kích hoạt chuột. Bạn có thể nhấp vào bất kỳ phần nào của văn bản và chỉnh sửa

sau đó CTRL + X để thoát và y để xác nhận lưu.


0

Tôi đã tạo một kịch bản để làm cho con trỏ dòng lệnh di chuyển khi nhấp chuột :

  1. Cho phép báo cáo theo dõi chuột xterm
  2. Đặt các ràng buộc dòng để tiêu thụ chuỗi thoát được tạo bởi các nhấp chuột

Nó có thể được tìm thấy trên github

Thêm thông tin về bài viết khác

Sẽ hoạt động nếu echo -e "\e[?1000;1006;1015h" # Enable trackingin các chuỗi thoát trên thiết bị đầu cuối khi nhấp bằng chuột


0

Nó có thể không phải là nhanh nhất, nhưng điều này cần phải có ở đây, một số đọc về chuyển động con trỏ ANSI

Trình tự thoát ANSI cho phép bạn di chuyển con trỏ xung quanh màn hình theo ý muốn. Điều này hữu ích hơn cho các giao diện người dùng toàn màn hình được tạo bởi các kịch bản shell, nhưng cũng có thể được sử dụng trong các lời nhắc . Trình tự thoát chuyển động như sau:

- 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

(...)

Hãy thử đặt dòng mã sau vào dấu nhắc (sẽ rõ hơn một chút nếu lời nhắc là một vài dòng xuống thiết bị đầu cuối khi bạn đặt mã này vào): echo -en "\033[7A\033[1;35m BASH \033[7B\033[6D"Điều này sẽ di chuyển con trỏ lên bảy dòng trên màn hình, in từ "BASH ", Và sau đó quay trở lại nơi nó bắt đầu tạo ra một dấu nhắc bình thường.


Ví dụ :

Di chuyển con trỏ trở lại 7 dòng:

echo -e "\033[7A"

Di chuyển con trỏ đến dòng 10, cột 5:

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

Nhanh chóng lặp lại mã màu , để tô màu một chương trình:

echo -e "\033[35;42m" ; ifconfig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.