Shell với khả năng chỉnh sửa tốt hơn


11

Shell (ít nhất là những gì tôi biết) có khả năng chỉnh sửa lệnh thực sự tồi.

Ví dụ:

  • Tôi không thể trỏ con trỏ đến bất kỳ điểm nào của lệnh.
  • Tôi không thể chọn và xóa / xóa / thay thế văn bản trong lệnh.

Hiện tại những thứ này rất mất tập trung, tôi sử dụng gedit để chỉnh sửa các lệnh trước khi dán chúng vào thiết bị đầu cuối.

Có giải pháp nào tốt cho việc này không?


2
Bạn đang kết nối một thiết bị đầu cuối với một vỏ.
JdeBP

Câu trả lời:


13

Bash thực sự khá giỏi trong việc này. Bạn chỉ cần học các phím tắt của nó. Ví dụ: (ở chế độ emacs mặc định):

  • Ctrl+ A: di chuyển đến đầu dòng.
  • Ctrl+ E: di chuyển đến cuối dòng.
  • Ctrl+ B: di chuyển một ký tự ngược.
  • Ctrl+ F: di chuyển một ký tự về phía trước.
  • Alt+ B: di chuyển ngược một từ.
  • Alt+ F: di chuyển một từ về phía trước.
  • Ctrl+ K: xóa (cắt) mọi thứ cho đến hết dòng.
  • Alt+ D: xóa (cắt) từ sau con trỏ.
  • Ctrl+ W: xóa (cắt) từ trước con trỏ.
  • Ctrl+ Y: yank (dán) những gì trong bộ đệm ( ví dụ bạn cắt bằng Ctrl+ Khoặc Alt+ D)

Và còn nhiều hơn thế nữa. Đọc man readlineđể xem những gì khác có sẵn. Bạn có thể chỉ định các phím tắt khác nhau bằng cách đặt chúng vào ~/.inputrc. Ví dụ: để tạo Ctrl+ Leftquay lại một từ và Ctrl+ Rightchuyển tiếp một từ, hãy thêm từ này vào ~/.inputrc:

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

Để tìm hiểu những mã lạ đó có nghĩa là gì, nhấn Ctrl+ Vvà sau đó nhấn phím bạn muốn sử dụng. Nếu bạn thử với Ctrl+ Right, bạn sẽ thấy ^[[1;5C. Thay thế ^[bằng \etrong ~/.inputrc.


Bạn cũng có thể muốn nhìn vào các vỏ khác. Các loại vỏ giàu tính năng, "hiện đại" phổ biến bao gồm:


Với gnome-terminalbạn phải sử dụng ESCnút thay vì ALT điều hướng một từ tiến và lùi. . .. hoặc chuyển sang thiết bị đầu cuối không sử dụng Alt cho menu ứng dụng. . . như xterm hoặc sakura
Sergiy Kolodyazhnyy 7/12/2015

@Serg không có trên hệ thống của tôi, cảm ơn. Tôi không biết liệu bạn đã thiết lập nó theo cách đó hay nếu đó là một số mặc định được điều chỉnh bởi Ubuntu. Esc thường được sử dụng như một từ đồng nghĩa của Alt.
terdon 7/12/2015

Không chia sẻ bộ đệm cắt giữa các thiết bị đầu cuối mặc dù.
Craig Hicks

7

Bạn có thể chỉnh sửa một lệnh trống hoặc gõ một phần vào trình soạn thảo bạn chọn bằng cách đặt EDITORthành trình soạn thảo bạn chọn và nhấn CTRL+ X+ Ehoặc CTRL+ X/ CTRL+ E, mở dòng hiện đang được chỉnh sửa EDITOR;

Ví dụ, đặt EDITORđể geditsẽ làm CTRL+ X+ ECTRL+ X/ CTRL+ Emở dòng hiện tại trong Gedit.

Để thực hiện một giải pháp lâu dài này, bạn có thể thiết lập EDITORtrong ~/.bashrc.

Điều này cho phép sử dụng ngay cả một trình soạn thảo văn bản đồ họa được trang bị đầy đủ để chỉnh sửa lệnh; để chạy lệnh đã chỉnh sửa, chỉ cần lưu và đóng tài liệu.


Tính năng tương tự có thể được kích hoạt trong Zsh bằng cách thêm các mục sau vào ~/.zshrc:

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

2
Điều này cũng có thể được gọi bằng fclệnh nếu biến FCEDIT được đặt. Câu trả lời tốt !
Sergiy Kolodyazhnyy

1
@Serg Cảm ơn, tuy nhiên fcsẽ mở lệnh trước đó (thậm chí còn gọn gàng hơn theo một cách nhất định). Tôi không biết về điều đó, cảm ơn!
kos

6

Thiết bị đầu cuối không có khả năng chỉnh sửa văn bản. Thiết bị đầu cuối cung cấp một khu vực văn bản và kết nối bàn phím với một cái gì đó. Nhưng cái gì đó mà bạn chạy bên trong thiết bị đầu cuối sẽ xác định những gì nó có thể làm.

Các vỏ như bashthường là thứ đầu tiên mà bạn sẽ tìm thấy để chạy bên trong một thiết bị đầu cuối. Bởi vì shell hoạt động dựa trên các lệnh, bạn chỉ có thể chỉnh sửa lệnh hiện tại. cung cấp xuất sắc lệnh chỉnh sửa so với vỏ Bourne hay cshhay kshnhưng nó là hầu như không một cái gì đó bạn muốn chỉnh sửa ngay cả một câu chuyện ngắn với.

Trình soạn thảo văn bản là một trong những lệnh bạn có thể gọi trong trình bao. Các ví dụ hàng đầu là . vimhoặc emacssẽ cung cấp cho bạn khả năng chỉnh sửa hầu hết mọi thứ. Cả hai đều bao gồm các môi trường lập trình tích hợp để mở rộng khả năng của họ cho bất kỳ vấn đề nào bạn gặp phải.

Vì vậy, giải pháp là để hiểu rõ hơn những gì các công cụ này đang làm và có nghĩa là làm và chọn một công cụ phù hợp cho công việc .


Tôi biết sự khác biệt, nhưng có thể làm gì đó để cải thiện việc chỉnh sửa lệnh của bash không?
Đại

1
Đặt nó trong một kịch bản?
gà con

0

Thông thường các thiết bị đầu cuối cho phép lựa chọn văn bản bằng chuột, nhưng vỏ không được biết điều này. Vì vậy, không may không bash, zsh, fishcũng không esthể hỗ trợ chỉnh sửa chuột dựa trên. Tôi nghĩ để làm như vậy, họ sẽ cần kiểm soát nhiều hơn đối với thiết bị đầu cuối.

Tuy nhiên (và đây một chút kéo dài) nếu bạn mở Vim hoặc GVim, sau đó nhập lệnh shell bằng cách sử dụng:

:!...

sau đó bạn có thể nhấp chuột để nhảy đến bất cứ nơi nào trong dòng . ( :set mouse=aTrước tiên, bạn cần phải bật nếu chưa bật.) Có thể thấy các phím chỉnh sửa trong chế độ này với:help cmdline-editing

Vim cũng có một chế độ lịch sử lệnh khá mạnh mẽ, có thể đạt được bằng cách nhấn q:. Từ đó, bạn có thể kéo, xóa và dán bằng các lệnh chế độ thông thường của Vim. Trong chế độ này, bạn có thể lấy chuột chọn và sau đó xóa tính năng bạn muốn (bằng cách nhấn d).

Một cảnh báo quan trọng ở đây là Vim không thực sự duy trì phiên chạy vỏ trực tiếp. Mỗi lệnh bạn thực hiện sẽ được chạy trong một tiến trình con. Vì vậy, bất kỳ thay đổi được thực hiện cho các biến môi trường hoặc tùy chọn shell theo quy trình con sẽ bị mất.

Điều đó nói rằng, bạn có thể sửa đổi các biến môi trường từ bên trong quy trình Vim và sử dụng các biến này từ dòng lệnh của Vim và thậm chí chúng sẽ được xuất sang các quy trình con:

: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

Vì vậy, nếu bạn sẵn sàng giả vờ rằng Vim thực sự là một loại vỏ kỳ lạ, thì bạn có thể thưởng thức các tính năng chỉnh sửa nâng cao của nó! Có lẽ nhược điểm lớn nhất là bạn sẽ phải bắt đầu mọi lệnh bằng cách gõ một trong hai :!hoặcq:

Ồ và nhân tiện, nếu bạn muốn nhận đầu ra của lệnh shell vào bộ đệm Vim hiện tại của mình, bạn có thể làm như vậy (nhưng hãy cẩn thận, nó sẽ ghi đè dòng hiện tại của bạn):

:,!ls
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.