Commentaires en ligne de commande Zsh

115

Je suis passé assez récemment de Bash à Zsh sur Ubuntu et j'en suis assez content. Cependant, il y a quelque chose qui me manque vraiment et je n'ai pas trouvé comment réaliser la même chose.

Dans Bash, chaque fois que je tapais une longue commande et que je remarquais que je devais exécuter autre chose avant, je devais juste le commenter comme dans ce qui suit:

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!

Cependant, cette situation assez récurrente est pas aussi facile à aborder comme avec zsh, étant donné #mysuperlongcommandsera exécuté en tant que telle (et entraînant: zsh: command not found: #mysuperlongcommand.

Rolf
la source

Réponses:

172

Ayant juste commencé à essayer zsh, j'ai aussi rencontré ce problème. Vous pouvez faire setopt interactivecommentspour activer les commentaires de style bash.

Lajnold
la source
3
Vous pouvez également le faire set -ks'il ne s'agit que d'un seul. Mais j'utiliserais la setoptligne de cette réponse dans mon zshrc
Hamish Downer
12
Y a-t-il une raison pour laquelle ce n'est pas le comportement par défaut?
naught101
1
@ naught101 beaucoup des meilleurs bits de zsh sont désactivés par défaut. je ne sais pas pourquoi
zzapper
@ naught101 parce que c'est nouveau et innovant. beaucoup de progrès, beaucoup d'améliorer
Ярослав Рахматуллин
40

j'utilise

bindkey "^Q" push-input

À partir du manuel zsh:

Poussez toute la construction multiligne actuelle sur la pile de tampons et revenez à l'invite de niveau supérieur (PS1). Si la construction de l'analyseur en cours n'est qu'une seule ligne, c'est exactement comme push-line. La prochaine fois que l'éditeur démarre ou apparaîtra avec get-line, la construction sera sautée du haut de la pile de tampons et chargée dans le tampon d'édition.

Donc ça ressemble à ça:

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

De plus, si vous définissez l' INTERACTIVE_COMMENTSoption ( setopt INTERACTIVE_COMMENTS), vous pourrez utiliser des commentaires dans des shells interactifs comme vous en avez l'habitude.

Michał Politowski
la source
J'aime votre option, mais je ne peux pas la faire fonctionner: (Y a-t-il un moyen d'écrire la liaison dans le fichier, ou est-ce juste deux caractères, ^ et Q? Ma commande est effacée, mais je ne sais pas comment le faire apparaître à nouveau dans l'entrée.
Mihnea Simian
2
@Mihnea si la commande disparaît, il semble que l'entrée push fonctionne. Il devrait réapparaître lorsque vous exécutez la commande suivante ou appuyez simplement sur Entrée. Ça ne fait pas ça?
Michał Politowski
1
@barbaz la pile peut être manipulée avec read -zet print -z, donc avec des scripts et des fichiers temporaires, vous pouvez. Mais alors, un widget zle personnalisé pour enregistrer la ligne de commande dans un fichier temporaire pourrait être plus simple, et l'historique partagé sera encore plus simple.
Michał Politowski
1
Alors que la réponse actuellement acceptée répond à la question de l' interrogateur , cette réponse répond à l' intention de l'interrogateur . Ie zsh a une meilleure façon d'atteindre le résultat escompté, et c'est tout.
wjv
1
Cela devrait être la réponse acceptée. Si vous utilisez oh-my-zsh, vous pouvez utiliser Ctrl-Q pour cela dès la sortie de la boîte.
Gecko
18

Je me retrouve à faire cela souvent aussi. Ce que je fais est de couper la commande longue, d'exécuter la commande qui doit commencer, puis de coller la commande longue. C'est facile: CTRL + U coupe la commande actuelle dans un tampon, CTRL + Y la colle. Fonctionne en zsh et bash.

Fredrik Möllerstrand
la source
eh bien, en fait, ma solution est une solution de contournement alors que votre solution est la meilleure solution;)
Rolf
4
Cela ne devrait pas être la réponse acceptée. La solution ci-dessous qui dit d'utiliser "setopt interactivecomments" devrait être. La raison en est que si vous venez de couper la commande actuelle, cela ne fait pas partie de votre historique zsh, et vous ne pouvez pas non plus facilement utiliser le copier-coller en tapant votre nouvelle commande sans écraser la commande que vous essayiez de enregistrer.
Douglas
1
L'utilisation des commentaires et de la solution dans ces réponses sont deux solutions de contournement; la méthode push-input publiée par Michał Politowski est plus correcte.
Fredrik Möllerstrand
0

En plus de setopt interactivecomments, suggéré par @Lajnold, vous pouvez également ajouter quelque chose comme ce qui suit pour éviter que certains commentaires ne soient écrits dans l'historique (depuis /superuser/352788/how-to-prevent-a- command-in-the-zshell-from-being-saved-into-history ):

Cela remplace la fonction intégrée ZSH zshaddhistory ():

  • Conservera les commentaires qui commencent dans la colonne 1 non suivis d'un ou plusieurs espaces (c.-à-d. #Somecommand auquel je veux revenir)
  • Ne consignera pas les commentaires commençant dans la colonne 1 suivis d'un ou plusieurs espaces
  • Ne consignera pas les commentaires en retrait, complétés par des espaces de la colonne 1
  • Ne consignera pas les commandes avec un espace dans la colonne 1 (raccourci pratique pour exécuter des commandes que vous ne voulez pas journaliser
setopt interactivecomments

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

Pour référence, il s'agit du zshaddhistory () par défaut http://zsh.sourceforge.net/Doc/Release/Functions.html

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