Komentar di baris perintah Zsh

115

Saya baru-baru ini beralih dari Bash ke Zsh di Ubuntu dan saya cukup senang tentang itu. Namun, ada sesuatu yang sangat saya rindukan dan saya tidak menemukan cara untuk mencapai hal yang sama.

Di Bash, setiap kali saya mengetik perintah yang panjang dan menyadari bahwa saya harus menjalankan sesuatu yang lain sebelumnya, saya hanya perlu mengomentarinya seperti berikut:

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!

Namun, situasi cukup berulang ini tidak semudah ke alamat seperti zsh, mengingat #mysuperlongcommandakan dijalankan seperti itu (dan mengakibatkan: zsh: command not found: #mysuperlongcommand.

Rolf
sumber

Jawaban:

172

Baru saja mulai mencoba zsh, saya mengalami masalah ini juga. Anda bisa melakukannya setopt interactivecommentsuntuk mengaktifkan komentar ala bash.

Lajnold
sumber
3
Anda juga bisa melakukannya set -kjika hanya satu kali. Tapi saya akan menggunakan setoptbaris dari jawaban ini di zshrc saya
Hamish Downer
12
Apakah ada alasan mengapa ini bukan perilaku default?
n nothing101
1
@ naught101 banyak bit terbaik dari zsh default nonaktif. tidak tahu mengapa
zzapper
@ naught101 karena ini baru dan inovatif. sangat maju, jauh lebih baik
Ярослав Рахматуллин
40

saya menggunakan

bindkey "^Q" push-input

Dari manual zsh:

Dorong seluruh konstruksi multiline saat ini ke tumpukan buffer dan kembali ke prompt level atas (PS1). Jika konstruksi parser saat ini hanya berupa satu baris, ini persis seperti baris dorong. Lain kali editor memulai atau dimunculkan dengan get-line, konstruksi akan dikeluarkan dari atas tumpukan buffer dan dimuat ke buffer pengeditan.

Jadi terlihat seperti ini:

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

Selain itu, jika Anda menyetel INTERACTIVE_COMMENTSopsi ( setopt INTERACTIVE_COMMENTS), Anda akan dapat menggunakan komentar di shell interaktif seperti yang biasa Anda lakukan.

Michał Politowski
sumber
Saya suka pilihan Anda, tetapi saya tidak dapat membuatnya berfungsi :( Apakah ada cara saya harus menulis pengikatan di file, atau hanya dua karakter, ^ dan Q? Perintah saya dihapus, tetapi saya tidak tahu bagaimana membuatnya muncul lagi di masukan.
Mihnea Simian
2
@ Mihnea jika perintah menghilang tampaknya push-input berfungsi. Ini akan muncul kembali ketika Anda menjalankan perintah berikutnya atau cukup tekan enter. Bukankah itu melakukan itu?
Michał Politowski
1
@barbaz tumpukan dapat dimanipulasi dengan read -zdan print -z, jadi dengan beberapa skrip dan file sementara Anda bisa. Tapi kemudian widget zle kustom untuk menyimpan baris perintah ke file temp mungkin lebih sederhana, dan riwayat bersama akan lebih sederhana.
Michał Politowski
1
Sementara jawaban yang diterima saat ini menjawab pertanyaan penanya , jawaban ini menjawab maksud penanya . Yaitu zsh memiliki cara yang lebih baik untuk mencapai hasil yang diinginkan, dan ini dia.
wjv
1
Ini harus menjadi jawaban yang diterima. Jika Anda menggunakan oh-my-zsh, Anda dapat menggunakan Ctrl-Q untuk ini di luar kotak.
Tokek
18

Saya menemukan diri saya sering melakukan ini juga. Apa yang saya lakukan adalah memotong perintah panjang, menjalankan perintah yang harus dilakukan terlebih dahulu dan kemudian menempelkan kembali perintah panjang. Ini mudah: CTRL + U memotong perintah saat ini ke buffer, CTRL + Y menempelkannya. Bekerja di zsh dan bash.

Fredrik Möllerstrand
sumber
sebenarnya, cara saya adalah solusi sementara solusi Anda paling sesuai;)
Rolf
4
Ini seharusnya bukan jawaban yang diterima. Solusi di bawah ini yang mengatakan untuk menggunakan "interaksi setopt" harus. Alasan untuk ini adalah bahwa jika Anda hanya memotong perintah saat ini, maka itu tidak ada dalam riwayat zsh Anda, dan Anda juga tidak dapat dengan mudah menggunakan potong dan tempel saat mengetik di perintah baru Anda tanpa menimpa perintah yang Anda coba. menyimpan.
Douglas
1
Menggunakan komentar dan solusi dalam jawaban ini merupakan solusi; metode push-input yang diposting oleh Michał Politowski lebih tepat.
Fredrik Möllerstrand
0

Selain itu setopt interactivecomments, disarankan oleh @Lajnold, Anda mungkin juga ingin menambahkan sesuatu seperti berikut untuk mencegah komentar tertentu ditulis ke riwayat (dari /superuser/352788/how-to-prevent-a- command-in-the-zshell-from-being-stored-into-history ):

Ini menggantikan fungsi built-in ZSH zshaddhistory ():

  • Akan mencatat komentar yang dimulai di kolom 1 tidak diikuti oleh satu atau lebih spasi (yaitu #somcommand yang saya ingin kembali ke)
  • Tidak akan mencatat komentar yang dimulai di kolom 1 diikuti dengan satu atau lebih spasi
  • Tidak akan mencatat komentar yang menjorok ke dalam, diberi spasi dari kolom 1
  • Tidak akan mencatat perintah dengan spasi di kolom 1 (pintasan praktis untuk menjalankan perintah yang tidak ingin Anda catat
setopt interactivecomments

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

Sebagai referensi, ini adalah zshaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html default

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
FlakRat
sumber