Commenti nella riga di comando Zsh


115

Sono passato abbastanza recentemente da Bash a Zsh su Ubuntu e ne sono abbastanza soddisfatto. Tuttavia, c'è qualcosa che mi manca davvero e non ho trovato come ottenere la stessa cosa.

In Bash, ogni volta che digitavo un comando lungo e notavo che dovevo eseguire qualcos'altro prima, dovevo semplicemente commentarlo come nel seguente:

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!

Tuttavia, questa situazione abbastanza ricorrente non è così facile come con l'indirizzo zsh, data #mysuperlongcommandverrà eseguito in quanto tale (e conseguente: zsh: command not found: #mysuperlongcommand.

Risposte:


172

Avendo appena iniziato a provare zsh, mi sono imbattuto anche in questo problema. Puoi farlo setopt interactivecommentsper attivare i commenti in stile bash.


3
Puoi anche farlo set -kse è solo una tantum. Ma setoptuserei la linea da questa risposta nel mio zshrc
Hamish Downer il

12
C'è una ragione per cui questo non è il comportamento predefinito?
nought101

1
@ naught101 molti dei migliori bit di zsh sono disattivati ​​per impostazione predefinita. non so perché
zzapper

@ naught101 perché è nuovo e innovativo. molto progresso, molto miglioramento
Ярослав Рахматуллин

40

Io uso

bindkey "^Q" push-input

Dal manuale zsh:

Spingere l'intero costrutto multilinea corrente sullo stack del buffer e tornare al prompt di livello superiore (PS1). Se l'attuale costrutto del parser è solo una singola riga, questo è esattamente come push-line. La prossima volta che l'editor si avvia o viene estratto con get-line, il costrutto verrà estratto dalla parte superiore dello stack del buffer e caricato nel buffer di modifica.

Quindi sembra così:

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

Inoltre, se imposti l' INTERACTIVE_COMMENTSopzione ( setopt INTERACTIVE_COMMENTS), sarai in grado di usare i commenti nelle shell interattive come sei abituato.


Mi piace la tua opzione, ma non riesco a farla funzionare :( C'è un modo in cui dovrei scrivere l'associazione nel file, o sono solo due caratteri, ^ e Q? Il mio comando è stato cancellato, ma non lo so come farlo apparire di nuovo in input
Mihnea Simian

2
@Mihnea se il comando scompare sembra che il push-input funzioni. Dovrebbe apparire di nuovo quando esegui il comando successivo o premi semplicemente invio. Non lo fa?
Michał Politowski

1
@barbaz lo stack può essere manipolato con read -ze print -z, quindi con alcuni script e file temporanei potresti. Ma poi un widget zle personalizzato per salvare la riga di comando in un file temporaneo potrebbe essere più semplice e la cronologia condivisa sarà ancora più semplice.
Michał Politowski

1
Mentre la risposta attualmente accettata affronta la domanda dell'interrogante , questa risposta affronta l' intenzione dell'interrogante . Cioè zsh ha un modo migliore per ottenere il risultato desiderato, e questo è tutto.
wjv

1
Questa dovrebbe essere la risposta accettata. Se usi oh-my-zsh puoi usare Ctrl-Q per questo fuori dalla scatola.
Gecko

18

Anch'io mi trovo a farlo spesso. Quello che faccio è tagliare il comando lungo, eseguire il comando che deve andare prima e poi incollare nuovamente il comando lungo. Questo è facile: CTRL + U taglia il comando corrente in un buffer, CTRL + Y lo incolla. Funziona in zsh e bash.


beh, in realtà, il mio modo è una soluzione alternativa mentre la tua soluzione è la soluzione migliore;)
Rolf

4
Questa non dovrebbe essere la risposta accettata. La soluzione sotto che dice di usare "setopt interactivecomments" dovrebbe essere. La ragione di ciò è che se hai appena tagliato il comando corrente, allora non è nella tua cronologia zsh, e inoltre non puoi usare facilmente taglia e incolla mentre digiti il ​​tuo nuovo comando senza sovrascrivere il comando che stavi cercando di Salva.
Douglas

1
L'utilizzo di commenti e la soluzione in queste risposte sono entrambi soluzioni alternative; il metodo di inserimento push pubblicato da Michał Politowski è più corretto.
Fredrik Möllerstrand

0

Oltre a setopt interactivecomments, suggerito da @Lajnold, potresti anche voler aggiungere qualcosa di simile al seguente per evitare che determinati commenti vengano scritti nella cronologia (da /superuser/352788/how-to-prevent-a- command-in-the-zshell-from-being-saved-into-history ):

Questo sovrascrive la funzione incorporata ZSH zshaddhistory ():

  • Registra i commenti che iniziano nella colonna 1 non seguiti da uno o più spazi (cioè #somecommand a cui voglio tornare)
  • Non registrerà i commenti che iniziano nella colonna 1 seguiti da uno o più spazi
  • Non registra i commenti rientrati, riempiti da spazi dalla colonna 1
  • Non registrerà i comandi con uno spazio nella colonna 1 (comoda scorciatoia per eseguire i comandi che non vuoi vengano registrati
setopt interactivecomments

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

Per riferimento, questo è il valore predefinito zshaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.