Zsh komut satırındaki yorumlar


115

Yakın zamanda Ubuntu'da Bash'den Zsh'a geçtim ve bundan oldukça memnunum. Ancak, gerçekten özlediğim bir şey var ve aynı şeyi nasıl başaracağımı bulamadım.

Bash'de ne zaman uzun bir komut yazsam ve daha önce başka bir şey çalıştırmam gerektiğini fark etsem, bunu aşağıdaki gibi yorumlamak zorunda kaldım:

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!

Olduğu gibi Ancak, bu oldukça tekrarlayan bir durum adrese kadar kolay değildir zsh, vermiş olduğu #mysuperlongcommandgibi çalıştırın (ve sonuçta edilecektir: zsh: command not found: #mysuperlongcommand.

Yanıtlar:


172

Zsh'yi denemeye yeni başladıktan sonra bu problemle de karşılaştım. setopt interactivecommentsBash tarzı yorumları etkinleştirmek için yapabilirsiniz .


3
Sadece bir defalıksa da yapabilirsiniz set -k. Ama setoptbu yanıttaki satırı zshrc'mde kullanırdım
Hamish Downer

12
Bunun varsayılan davranış olmamasının bir nedeni var mı?
naught101

1
@ naught101 zsh'nin en iyi bitlerinin çoğu varsayılan olarak kapalıdır. neden bilmiyorum
zzapper

@ naught101 çünkü yeni ve yenilikçi. çok ilerleme, çok gelişme
Ярослав Рахматуллин

40

kullanırım

bindkey "^Q" push-input

Zsh kılavuzundan:

Geçerli çok satırlı yapının tamamını arabellek yığınına itin ve en üst düzey (PS1) komut istemine geri dönün. Mevcut ayrıştırıcı yapısı yalnızca tek bir satırsa, bu tam olarak push-line gibidir. Editör bir sonraki sefer başladığında veya get-line ile açıldığında, yapı arabellek yığınının üstünden çıkarılacak ve düzenleme arabelleğine yüklenecektir.

Yani şuna benziyor:

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

Ayrıca, INTERACTIVE_COMMENTS( setopt INTERACTIVE_COMMENTS) seçeneğini ayarlarsanız, alıştığınız gibi etkileşimli kabuklarda yorumları kullanabilirsiniz.


Seçeneğini beğendim, ancak çalışmasını sağlayamıyorum :( Bağlamayı dosyaya yazmamın bir yolu var mı, yoksa bu sadece iki karakter mi, ^ ve Q? Komutum silindi, ama bilmiyorum girişte tekrar görünmesi nasıl sağlanır.
Mihnea Simian

2
@Mihnea eğer komut kaybolursa, push-giriş çalışıyor gibi görünür. Bir sonraki komutu çalıştırdığınızda veya sadece enter tuşuna bastığınızda görünmelidir. Bunu yapmıyor mu?
Michał Politowski

1
@barbaz, yığın read -zve ile değiştirilebilir print -z, bu nedenle bazı komut dosyaları ve geçici dosyalar ile yapabilirsiniz. Ancak komut satırını geçici bir dosyaya kaydetmek için özel bir zle widget'ı daha basit olabilir ve paylaşılan geçmiş daha da basit olacaktır.
Michał Politowski

1
Şu anda kabul cevap adresleri sorunu olanın ise soru , bu cevap sorunu olanın adresleri niyeti . Yani, amaçlanan sonuca ulaşmak için daha iyi bir yol var ve işte bu.
wjv

1
Kabul edilen cevap bu olmalıdır. Oh-my-zsh kullanırsanız, bunun için kutunun dışında Ctrl-Q kullanabilirsiniz.
Gecko

18

Ben de sık sık bunu yaparken buluyorum. Yaptığım şey, uzun komutu kesmek, önce gitmesi gereken komutu yürütmek ve sonra uzun komutu tekrar yapıştırmak. Bu kolay: CTRL + U geçerli komutu bir arabelleğe kesiyor, CTRL + Y yapıştırıyor. Zsh ve bash ile çalışır.


aslında, benim yöntemim bir geçici çözüm, çözümünüz en uygun olanıdır;)
Rolf

4
Kabul edilen cevap bu olmamalı. Aşağıdaki "setopt etkileşimli yorumlar" kullanmayı söyleyen çözüm olmalıdır. Bunun nedeni, mevcut komutu keserseniz, o zaman zsh geçmişinizde olmaz ve ayrıca yeni komutunuzu yazarken, denemekte olduğunuz komutun üzerine yazmadan kes ve yapıştır özelliğini kolayca kullanamazsınız. kayıt etmek.
Douglas

1
Bu yanıtlarda yorumları ve çözümü kullanmak geçici çözümlerdir; Michał Politowski tarafından yayınlanan push-input yöntemi daha doğrudur.
Fredrik Möllerstrand

0

setopt interactivecomments@Lajnold tarafından önerilene ek olarak , belirli yorumların tarihe yazılmasını önlemek için aşağıdakine benzer bir şey eklemek isteyebilirsiniz ( /superuser/352788/how-to-prevent-a- adresinden geçmişe kaydedilen z kabuğundaki komut ):

Bu, ZSH yerleşik işlevi zshaddhistory () 'yi geçersiz kılar:

  • Sütun 1'de başlayan ve ardından bir veya daha fazla boşluk gelmeyen yorumları günlüğe kaydeder (yani, geri dönmek istediğim # bazı komut)
  • Sütun 1'de başlayan ve ardından bir veya daha fazla boşluk gelen yorumları günlüğe kaydetmez
  • 1. sütundaki boşluklarla doldurulmuş girintili yorumları günlüğe kaydetmez
  • 1. sütunda boşluk olan komutları günlüğe kaydetmez (günlüğe kaydedilmesini istemediğiniz komutları çalıştırmak için kullanışlı kısayol
setopt interactivecomments

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

Referans için, bu varsayılan zshaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html'dir.

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.