Nhớ một lệnh nửa gõ trong khi tôi kiểm tra một cái gì đó


97

Tôi thường thấy mình ở vị trí sau: Tôi đã bắt đầu gõ một lệnh dài tại dấu nhắc bash, nhưng khi đi được nửa đường tôi phát hiện ra mình cần kiểm tra thứ gì đó bằng một lệnh khác. Đây là một vấn đề khi tôi ở bàn điều khiển (không có X), thường là như vậy, bởi vì sau đó tôi chỉ có những cách không thỏa đáng sau đây để làm điều đó, mà tôi biết:

  • Nhấn ctrl+ alt+ F2và đăng nhập vào bảng điều khiển ảo khác và tìm hiểu những gì tôi muốn, sau đó quay lại và tiếp tục
  • ctrl+ a, gõ echo + space+ enter, tìm hiểu những gì tôi muốn, nhấn cho đến khi tôi tìm thấy lệnh của mình, ctrl+ a, delx 5, ctrl+ evà tiếp tục
  • Làm nổi bật những gì tôi đã nhập từ xa bằng chuột của tôi (nếu gpm đang chạy, thường là vậy), nhấn ctrl+ cđể ngắt, tìm hiểu những gì tôi muốn trong khi cẩn thận không sử dụng chuột để làm nổi bật công cụ, sau đó nhấn nút chuột giữa trên một dấu nhắc mới và tiếp tục
  • Xin cầu nguyện với các vị thần dòng lệnh rằng lệnh nửa viết sẽ không có tác dụng phụ nhưng chỉ đơn giản là thất bại, và nhấn nhẹ vào enter, sau đó tìm hiểu những gì tôi muốn, nhấn uparrow cho đến khi tôi lấy lại lệnh và tiếp tục
  • Nhảy vào cỗ máy thời gian của tôi, du hành ngược thời gian và nhắc nhở bản thân bắt đầu màn hình trước khi bắt đầu nhập lệnh, quay trở lại hiện tại, nhấn ctrl+ a c, tìm hiểu những gì tôi muốn, nhấn ctrl+ a ctrl+avà tiếp tục

Vì vậy, những gì tôi muốn biết là, có một số cách thanh lịch hơn để làm điều này? Một loại lệnh con hoặc tương tự?

Tôi quan tâm nhất đến các phương pháp không yêu cầu bất kỳ sự chuẩn bị hay thiết lập nào để hoạt động.

Câu trả lời:


68

Một phiên bản nhanh hơn của alex Ctrl + A Ctrl+ K(di chuyển về phía trước của dòng và sau đó cắt mọi thứ về phía trước) là chỉ sử dụng Ctrl+ U, cắt ngược về bash và toàn bộ dòng (bất kể vị trí hiện tại của bạn) trên zsh. Sau đó, bạn sử dụng Ctrl+ Yđể dán lại


1
Kiểm tra điều này, tôi kết luận rằng Ctrl + U không di chuyển trở lại và cắt về phía trước, mà là cắt ngược lại. Có con trỏ ở giữa lệnh để lại bất cứ thứ gì phía sau nó trên dòng lệnh. Vẫn là một cải tiến 33% so với giải pháp của @ alex, vì nó tiết kiệm một tổ hợp phím.
Lauritz V. Thaulow

2
@lazyr ơi, hoàn toàn đúng; trên zshnó cắt toàn bộ dòng, nhưng trên bashnó cắt ngược. Tôi chưa bao giờ nhận thấy sự khác biệt đó trước đây
Michael Mrozek

2
Ồ, tôi không biết Ctrl + U cũng đặt văn bản để giết bộ đệm. Rất vui được biết! :)
alex

1
^U ^Ksẽ có tác dụng tương tự ^A ^Knhưng tiện lợi hơn một chút và thuận tiện hơn đáng kể screen.
trực giác

53

Thực hiện ctrl-A để bắt đầu dòng, thêm một hàm băm và nhấn return - theo cách này nó sẽ nằm trong lịch sử lệnh dưới dạng một nhận xét và bạn có thể quay lại với nó bằng con trỏ lên

EDIT: chỉ nhận thấy đây là một biến thể thanh lịch hơn một chút trên # 2 của bạn;)


1
Vâng, và tại sao tôi không nghĩ về điều đó? Cảm ơn bạn!
Lauritz V. Thaulow

1
Tôi cần đọc trước khi đăng câu trả lời của riêng tôi. James có nó ngay trên.
Sean C.

4
Lưu ý rằng điều này sẽ không hoạt động trong cshhoặc zshbởi vì họ không cho phép nhận xét trong vỏ tương tác. Trong zshbạn cần kích hoạt tùy chọn thích hợp : setopt interactive_comments.
sam hocevar

1
@Sam Có, nhưng ": lệnh" có tác dụng tương tự (":" = lệnh null)
barrycarter

6
@barrycarter: không, :nên được coi là có hại cho mục đích này và không bao giờ, được đề xuất. Nó sẽ thực thi mọi thứ sau dấu chấm phẩy, bên trong backticks, v.v. với tất cả các tác dụng phụ liên quan.
sam hocevar

29

Đánh Ctrl+A , Ctrl+Kđể di chuyển đến đầu dòng và xóa (giết) đến cuối dòng. Sau đó thực hiện nghiên cứu của bạn, và khi sẵn sàng tiếp tục đánh Ctrl+Y(yank) để đưa dòng (đã chết) của bạn trở lại.


3
Ah, bây giờ nó giống như những gì tôi đã nghĩ trong đầu. Và tôi làm điều đó mọi lúc trong Emacs, nên nghĩ về việc làm tương tự trên dòng lệnh.
Lauritz V. Thaulow

13

Trong zsh, tôi gõ Ctrl+ Zđến Đình chỉ đình chỉ lệnh Tôi đang gõ và gõ một lệnh khác. Sau khi tôi chạy lệnh đó (hoặc hủy bỏ nó bằng Ctrl+ C), lệnh bị treo sẽ quay lại phiên bản (thậm chí ghi nhớ vị trí con trỏ). Để thuận tiện hơn, nếu dòng lệnh trống khi tôi gõ Ctrl+ Z, phím sẽ gọi hàm tích bghợp thay thế (vì vậy, gấp đôiCtrl + Zsẽ gửi lệnh chạy trực tiếp đến nền).

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

Tôi không biết làm thế nào để làm một cái gì đó tương tự trong bash.

Trong bất kỳ shell nào, bạn có thể sử dụng phương pháp công nghệ thấp để thêm một #ở đầu dòng hiện tại .


2
chức năng của bạn thật đáng ngưỡng mộ, nhưng bạn có biết rằng zshđã có chức năng cho chức năng đó chưa ? Nó được gọi push-linevà tất cả những gì bạn cần làm là sử dụng bindkeyđể đi đến đó.
Caleb

@Caleb: Tôi không biết tại sao tôi sử dụng push-inputchứ không phải push-lineở đây, push-linecó vẻ phù hợp hơn (có thể phiên bản cũ của zsh chỉ có push-input?). Nhưng đó không phải là sự thay thế cho phần còn lại của chức năng.
Gilles

Theo như tôi có thể nói sự khác biệt duy nhất là hiệu ứng ràng buộc tương tự để làm nền cho một công việc đang chạy. Tui bỏ lỡ điều gì vậy?
Caleb

1
@Caleb: Không, nó chỉ mà tôi tìm thấy sự kết hợp của hai cả hai thuận tiện ( push-linelà vô dụng trên một dòng trống, có bgtrên Ctrl+Zchỉ hữu ích khi tôi vừa bị đình chỉ quá trình với Ctrl+Z) và ghi nhớ (tôi hoặc backgrounding quá trình hoặc dòng lệnh một phần).
Gilles

3
@Caleb push-inputtạm dừng toàn bộ bộ đệm đầu vào, trong khi push-linechỉ tạm dừng dòng hiện tại. Nếu tôi đang gõ một lệnh đa dòng, tôi muốn tạm dừng toàn bộ lệnh, thì đó push-inputlà một lệnh đúng. Tôi thấy push-inputthường hữu ích hơn push-line(nếu tôi muốn trì hoãn một dòng trong bộ đệm đầu vào đa dòng, tôi có thể chỉ cần điều hướng đến đầu dòng và chèn một dòng mới), vì vậy tôi thực sự tự hỏi tại sao lại push-linecó khóa phím mặc định và không push-input.
Gilles

13

Trong bash, chỉ cần gõ Alt + #.

Sau đó, khi bạn đã sẵn sàng, nhấn Upsau đóAlt + #.

Đầu tiên đặt một #ở đầu dòng để biến nó thành một nhận xét, sau đó chấp nhận dòng đó, như thể bạn đã nhấn Enter.

Sau đó, khi bạn thực hiện nó lần thứ hai, nó sẽ thấy dòng đã có #lúc bắt đầu, vì vậy nó sẽ xóa nó và chấp nhận nó, một lần nữa giúp bạn tiết kiệmEnter khóa.

Nếu lần thứ hai chỉ chèn một lần khác #, thì bạn phải gõ Alt+- Alt + #thay thế.

Bạn có thể làm zsh làm tương tự bằng cách đặt

bindkey -M emacs '\e#' pound-insert

trong ~ / .zshrc của bạn.

Hoặc, nếu bạn đang sử dụng vi ràng buộc, bạn có thể nhập #từ chế độ lệnh trong cả bash và zsh.


2
Không hoạt động đối với tôi, lệnh thứ hai có nghĩa là loại bỏ # chỉ thêm nhiều # ở phía trước.
Lauritz V. Thaulow

1
Cái đầu tiên có hoạt động không? Bạn đang sử dụng phiên bản bash nào?
Mikel

3
Alt + # hoạt động như bạn mô tả trong đoạn thứ ba của bạn, nhưng không phải như trong phần thứ tư của bạn, nó chỉ đơn giản là thêm một số khác vào phía trước và chấp nhận dòng. Tôi sử dụng bash 4.1.5 (1) -tải trên Ubuntu 10.10.
Lauritz V. Thaulow

1
Ôi trời, trong bash nó yêu cầu một đối số số, ví dụ Esc+1sau đó Alt+ #để chuyển đổi.
Mikel

Điều đó hoạt động, nhưng cồng kềnh hơn rất nhiều so với chỉ Ctrl + A Del Ctrl + E, đặc biệt là trên bố trí bàn phím của tôi trong đó thực tế Alt + # là Alt + Shift + 3.
Lauritz V. Thaulow

10

Một trong những tính năng yêu thích của tôi zshlà chức năng đẩy dòng tích hợp, đảm nhiệm việc này mà không có bất kỳ tin tặc nào trong các câu trả lời khác ở đây. Tôi có nó bị ràng buộc với Ctrl+ ltrong .zshrctệp của tôi như thế này:

bindkey '^L' push-line

Sau đó, khi tôi gõ một số lệnh và cần thực hiện một thao tác khác thật nhanh, tôi có thể gọi nó bằng một phím và nhận được một dấu nhắc trống. Sau khi chạy lệnh khác, lời nhắc sẽ tự động điền vào những gì tôi đã gõ trước đó.

Bạn thậm chí có thể xâu chuỗi nhiều lớp này và các lệnh sẽ quay lại với bạn theo thứ tự ngược lại mà bạn đã đẩy chúng vào hàng đợi.


5
Giới hạn Ctrl+QESC qtheo mặc định (trong chế độ emacs).
Gilles

Có một cái gì đó tương tự cho bash?
Magnus

@Magnus: Vui lòng xem lại phần còn lại của câu trả lời cho câu hỏi này. Có giải pháp cho bash, chỉ là không thanh lịch như thế này.
Caleb

@Caleb, đáng lẽ tôi phải cụ thể hơn, có một tổ hợp phím đơn tương tự cho bash không?
Magnus

1
Đây rõ ràng là câu trả lời đúng của người Viking, cho Zsh nào! Tôi chỉ muốn đề cập đến các push-line-or-editwidget, không bị ràng buộc trong bất kỳ sơ đồ bàn phím theo mặc định. Tại dấu nhắc cấp cao nhất, nó thực hiện tương tự push-line, nhưng ở bất kỳ cấp độ nhắc nào thấp hơn, nó chuyển đổi toàn bộ lệnh được nhập vào bộ đệm nhiều dòng. Hai chức năng tuyệt vời trên một keybinding! Tôi có thể đề nghị ràng buộc push-line-or-editthay vì đơn giản push-line. Bạn không mất gì, và có được chức năng hữu ích.
wjv

5

Ngoài việc ctrl- a ctrl- kBí quyết, nếu bạn đang ở màn hình, chỉ cần ctrl- a dđể tách sau đó lắp lại vớiscreen -r

Bạn cũng có thể chỉ cần mở một cửa sổ khác với ctrl+a c


8
Nếu bạn đang ở trong màn hình, chỉ cần mở một cửa sổ khác với Ctrl+A c.
Gilles

1
@Gilles .. trừ khi bạn cần sử dụng một số khía cạnh của trạng thái shell (biến, hàm, bí danh, v.v.).
trực giác

4

Một cách khác, mặc dù không hoàn hảo, nhấn Ctrl-X Ctrl-E. Điều này sẽ mở trình soạn thảo mặc định của bạn có chứa một nửa lệnh gõ của bạn. Sau đó, bạn có thể lưu lệnh của mình vào một tệp hoặc mở một vỏ mới từ bên trong trình chỉnh sửa của bạn. Khi bạn thoát khỏi shell mới, nó sẽ đưa bạn trở lại trình chỉnh sửa và lưu nội dung sẽ tự động thực thi chúng.

Điều này không hoàn hảo bởi vì nó không đưa bạn trở lại vỏ ban đầu của bạn, nhưng buộc phải thực thi lệnh hoặc loại bỏ hoàn toàn nó. Nhưng không có lựa chọn tạm thời hoặc tiêu diệt bộ đệm để lo lắng, và cũng có một số điều chỉnh hay, ví dụ: nếu trình soạn thảo = vi

:wq            # execute the command
:cq            # cancel and abort
:! command     # execute command
:shell         # open a new shell
:r filename    # insert the contents of a file for editing
:r ! command   # insert the output of a command for editing

Rất đẹp thay thế. Tôi là vi-emacs-bất khả tri, vì vậy tôi sẽ rất vui khi sử dụng ngao khi sử dụng bộ truyền động thực sự cần thiết. (Nói về vi, tôi đã thử trình giả lập N64 linux Mupen64Plus cách đây một thời gian. Esc thoát khỏi trình giả lập mà không lưu. Tôi sớm từ bỏ chơi bất cứ thứ gì.)
Lauritz V. Thaulow

1
@lazyr, để debian / ubfox chạy sudo update-alternatives --config editorvà chọn trình soạn thảo yêu thích của bạn. Đối với các hệ thống khác, đặt các biến môi trường EDITOR hoặc VISUAL cho trình soạn thảo yêu thích của bạn, ví dụ: thêm export EDITOR=/usr/bin/nanovào .bashrc của bạn.
Forcefsck

3

Tương tự như phương pháp thêm #vào đầu dòng, có một phương pháp đơn giản hơn mà tôi sử dụng mà không yêu cầu quay lại đầu dòng:

Chỉ cần thêm một trích dẫn mở và không đóng nó, dù đơn hay đôi.

Sau đó nhấn Enter .

Sau đó nhấn CtrlC .

Lệnh một phần được lưu trong lịch sử lệnh (có sẵn thông qua mũi tên lên) nhưng không thực sự được thực thi.


2

Sử dụng zsh, nếu bạn gõ <ESC> q (thoát, sau đó Q), dòng nhắc của bạn sẽ bị cắt, để bạn có thể gõ một lệnh khác. Bạn sẽ tự động lấy lại văn bản cắt của bạn trong lời nhắc tiếp theo.

Nó có thể nhớ một vài dòng cùng một lúc, vì vậy bạn có thể sử dụng nó trong khi một dòng đang chờ bạn. Bạn thậm chí có thể sử dụng nó trên dòng trống để trì hoãn tiếp tục dòng cắt của bạn.

Đây không phải là cách hiệu quả nhất nếu bạn phải sử dụng một số lệnh để kiểm tra / chuẩn bị (bạn sẽ phải gõ lại <ESC> qtrước mỗi lệnh). Nhưng tôi nghĩ rằng có thể liên kết nó với một phím tắt ngắn hơn.


Nếu bạn chỉ muốn kiểm tra hướng dẫn, gõ <ESC> h(thoát, sau đó H). Điều đó sẽ chạy tích run-helphợp, với từ đầu tiên của dòng lệnh làm đối số. Bạn sẽ tìm lại dòng của bạn nguyên vẹn sau khi thực hiện.


Hầu hết các thiết bị đầu cuối sẽ cho phép bạn làm M-qthay vì<ESC> q
sleblanc
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.