Nhận xét trong dòng lệnh Zsh


115

Gần đây tôi đã chuyển từ Bash sang Zsh trên Ubuntu và tôi khá hài lòng về điều đó. Tuy nhiên, có một điều tôi thực sự nhớ và tôi đã không tìm ra cách để đạt được điều tương tự.

Trong Bash, bất cứ khi nào tôi đang gõ một lệnh dài và nhận thấy rằng tôi phải chạy một cái gì đó khác trước đó, tôi chỉ cần nhận xét nó như sau:

me@home> #mysuperlongcommand with some arguments
me@home> thecommandIhavetorunfirst #and then: then up up
me@home> #mysuperlongcommand with some arguments #I just need to uncomment it!

Tuy nhiên, tình hình khá tái phát này không phải là dễ dàng để địa chỉ như với zsh, được đưa ra #mysuperlongcommandsẽ được chạy như vậy (và kết quả là: zsh: command not found: #mysuperlongcommand.

Câu trả lời:


172

Vừa mới bắt đầu dùng thử zsh, tôi cũng gặp phải vấn đề này. Bạn có thể làm setopt interactivecommentsđể kích hoạt các nhận xét kiểu bash.


3
Bạn cũng có thể làm set -knếu đó chỉ là một lần tắt. Nhưng tôi sẽ sử dụng setoptdòng từ câu trả lời này trong zshrc của tôi
Hamish Downer

12
Có lý do gì mà đây không phải là hành vi mặc định?
naught101

1
@ naught101 rất nhiều bit tốt nhất của zsh được mặc định tắt. không biết tại sao
zzapper

@ naught101 vì nó mới và sáng tạo. rất tiến bộ, cải thiện nhiều
Ярослав Рахматуллин

40

tôi sử dụng

bindkey "^Q" push-input

Từ hướng dẫn sử dụng zsh:

Đẩy toàn bộ cấu trúc đa dòng hiện tại lên ngăn xếp bộ đệm và quay lại lời nhắc cấp cao nhất (PS1). Nếu cấu trúc trình phân tích cú pháp hiện tại chỉ là một dòng duy nhất, điều này giống hệt như dòng đẩy. Lần tới khi trình chỉnh sửa khởi động hoặc được bật lên bằng dòng get-line, cấu trúc sẽ được bật ra khỏi đầu ngăn xếp bộ đệm và được tải vào bộ đệm chỉnh sửa.

Vì vậy, nó trông như thế này:

> long command
Ctrl+Q => long command disappears to the stack
> forgotten command
long command reappears from stack
> long command

Ngoài ra, nếu bạn đặt INTERACTIVE_COMMENTStùy chọn ( setopt INTERACTIVE_COMMENTS), bạn sẽ có thể sử dụng nhận xét trong các trình bao tương tác như bạn đã quen.


Tôi thích tùy chọn của bạn, nhưng tôi không thể làm cho nó hoạt động :( Có cách nào tôi nên viết ràng buộc trong tệp không, hay chỉ có hai ký tự ^ và Q? Lệnh của tôi bị xóa, nhưng tôi không biết làm thế nào để làm cho nó xuất hiện trở lại ở đầu vào.
Mihnea Simian

2
@Mihnea nếu lệnh biến mất thì có vẻ như push-input đang hoạt động. Nó sẽ xuất hiện trở lại khi bạn chạy lệnh tiếp theo hoặc chỉ cần nhấn enter. Nó không làm điều đó?
Michał Politowski

1
@barbaz ngăn xếp có thể được thao tác với read -zprint -z, vì vậy với một số tệp tập lệnh và tệp tạm thời, bạn có thể. Nhưng sau đó, một tiện ích zle tùy chỉnh để lưu dòng lệnh vào tệp tạm thời có thể đơn giản hơn và lịch sử được chia sẻ vẫn đơn giản hơn.
Michał Politowski

1
Trong khi câu trả lời được chấp nhận hiện tại giải quyết câu hỏi của người hỏi , câu trả lời này giải quyết ý định của người hỏi . Tức là zsh có một cách tốt hơn để đạt được kết quả dự kiến, và đây là nó.
wjv

1
Đây phải là câu trả lời được chấp nhận. Nếu bạn sử dụng oh-my-zsh, bạn có thể sử dụng Ctrl-Q cho điều này.
Gecko

18

Tôi thấy mình cũng làm điều này thường xuyên. Những gì tôi làm là cắt lệnh dài, thực hiện lệnh cần đi trước và sau đó dán lại lệnh dài vào. Điều này rất dễ dàng: CTRL + U cắt lệnh hiện tại thành bộ đệm, CTRL + Y sẽ dán nó. Hoạt động trong zsh và bash.


tốt, trên thực tế, cách của tôi là một workaround trong khi giải pháp của bạn là phù hợp nhất;)
Rolf

4
Đây không phải là câu trả lời được chấp nhận. Giải pháp bên dưới cho biết sử dụng "setopt tương tác" nên được. Lý do cho điều này là nếu bạn chỉ cắt lệnh hiện tại, thì lệnh đó không có trong lịch sử zsh của bạn và sau đó bạn cũng không thể dễ dàng sử dụng cắt và dán trong khi nhập lệnh mới của mình mà không ghi đè lệnh bạn đang cố gắng tiết kiệm.
Douglas

1
Sử dụng các nhận xét và giải pháp trong câu trả lời này đều là cách giải quyết; phương thức nhập đẩy được đăng bởi Michał Politowski là đúng hơn.
Fredrik Möllerstrand

0

Ngoài ra setopt interactivecomments, do @Lajnold đề xuất, bạn cũng có thể muốn thêm thứ gì đó như sau để ngăn một số nhận xét nhất định bị ghi vào lịch sử (từ /superuser/352788/how-to-prevent-a- command-in-the-zshell-from-being-save-into-history ):

Điều này sẽ ghi đè hàm tích hợp ZSH zshaddhistory ():

  • Sẽ ghi lại các nhận xét bắt đầu trong cột 1, không theo sau bởi một hoặc nhiều khoảng trắng (tức là # lệnh mà tôi muốn quay lại)
  • Sẽ không ghi nhận xét bắt đầu trong cột 1 theo sau bởi một hoặc nhiều khoảng trắng
  • Sẽ không ghi nhận xét thụt lề, được đệm bởi dấu cách từ cột 1
  • Sẽ không ghi nhật ký các lệnh có khoảng trắng trong cột 1 (phím tắt tiện dụng để chạy các lệnh mà bạn không muốn ghi nhật ký
setopt interactivecomments

function zshaddhistory() {
  emulate -L zsh
  if ! [[ "$1" =~ "(^#\s+|^\s+#|^ )" ]] ; then
      print -sr -- "${1%%$'\n'}"
      fc -p
  else
      return 1
  fi
}

Để tham khảo, đây là zshaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html mặc định

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
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.