Коментарі в командному рядку Zsh


115

Я перейшов зовсім недавно з Bash на Zsh на Ubuntu і дуже задоволений цим. Однак є щось, що мені дуже не вистачає, і я не знайшов, як досягти того самого.

У Bash, коли я набирав довгу команду і помічав, що раніше я повинен був запустити щось інше, я просто повинен був прокоментувати це, як у наступному:

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!

Тим НЕ менше, це досить рецидивний ситуація не так легко , як адресу з zshурахуванням #mysuperlongcommandпрацюватиме як такої (і в результаті: zsh: command not found: #mysuperlongcommand.

Відповіді:


172

Щойно розпочавши спробувати zsh, я також натрапив на цю проблему. Ви можете зробити, setopt interactivecommentsщоб активувати коментарі в стилі баш.


3
Ви також можете зробити, set -kякщо це лише разовий вихід. Але я б використав setoptрядок з цієї відповіді в моєму zshrc
Hamish Downer,

12
Чи є причина, що це не поведінка за замовчуванням?
naught101

1
@ naught101 багато кращих біт zsh за замовчуванням вимкнено. не знаю чому
zzapper

@ naught101, тому що це нове та інноваційне. дуже прогресую, значно покращуюсь
Ярослав Рахматуллін

40

я використовую

bindkey "^Q" push-input

З посібника zsh:

Натисніть всю поточну багаторядкову конструкцію на буферний стек і поверніться до підказки верхнього рівня (PS1). Якщо конструкція поточного аналізатора є лише однією лінією, це точно як push-line. Наступного разу, коли редактор запускається або вискакує get-line, конструкція буде вискакуватися з верхньої частини стека буфера і завантажується в буфер редагування.

Так це виглядає приблизно так:

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

Крім того, якщо встановити INTERACTIVE_COMMENTSпараметр ( setopt INTERACTIVE_COMMENTS), ви зможете використовувати коментарі в інтерактивних оболонках, як ви звикли.


Мені подобається ваш варіант, але я не можу змусити його працювати: (Чи є спосіб я записати прив'язку у файл, або це лише два символи, ^ і Q? Моя команда стерта, але я не знаю як змусити його знову з’являтися у введенні
Mihnea Simian

2
@Mihnea якщо команда зникає, здається, що push-input працює. Він повинен з’явитися знову, коли ви запустите наступну команду або просто натисніть клавішу Enter. Хіба це не робить?
Michał Politowski

1
@barbaz стеком можна маніпулювати, read -zі print -z, таким чином, за допомогою деяких сценаріїв та тимчасових файлів ви можете. Але тоді користувацький віджет zle для збереження командного рядка у тимчасовому файлі може бути простішим, а спільна історія ще буде простішою.
Michał Politowski

1
Хоча прийнята в даний час відповідь стосується питання запитувача , ця відповідь стосується наміру запитувача . Тобто zsh має кращий спосіб досягти наміченого результату, і це все.
wjv

1
Це має бути прийнятою відповіддю. Якщо ви використовуєте oh-my-zsh, ви можете використовувати Ctrl-Q для цього поза коробкою.
Гекко

18

Мені теж здається, що це часто роблю. Що я роблю, це скоротити довгу команду, виконати команду, яку потрібно перейти спочатку, а потім вставити довгу команду назад. Це легко: CTRL + U вирізає поточну команду в буфер, CTRL + Y вставляє її. Працює в zsh і bash.


ну, власне, мій шлях - це подолання, тоді як ваше рішення найкраще підходить;)
Рольф

4
Це не повинно бути прийнятою відповіддю. Рішення, нижче якого говориться про використання "setopt interactivecomments", має бути. Причиною цього є те, що якщо ви просто вирізали поточну команду, вона не входить у вашу історію zsh, а також ви не зможете легко використовувати cut і paste, вводячи нову команду, не перезаписуючи команду, яку ви намагалися зберегти.
Дуглас

1
Використання коментарів та рішення у цих відповідях є обома способами; метод правильного введення, опублікований Міхалом Політовським, є більш правильним.
Fredrik Möllerstrand

0

Крім setopt interactivecommentsзапропонованого @Lajnold, ви можете також додати щось подібне, щоб запобігти написанню певних коментарів до історії (з /superuser/352788/how-to-prevent-a- команда-в-zshell-з-будується-збережена-в історію ):

Це переосмислює вбудовану функцію ZSH zshaddhistory ():

  • Запишіть коментарі, що починаються у колонці 1, а не за одним чи кількома пробілами (тобто #somecommand, до якого я хочу повернутися)
  • Не заносяться коментарі, які починаються у стовпці 1, за яким слід одне або кілька пробілів
  • Не ввійде в коментарі з відступом, пробілами з стовпця 1
  • Не вдасться ввести команди з пробілом у стовпці 1 (зручна ярлика для запуску команд, які ви не бажаєте ввійти
setopt interactivecomments

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

Для довідки, це стандартна zshaddhistory () http://zsh.sourceforge.net/Doc/Release/Functions.html

zshaddhistory() {
  print -sr -- ${1%%$'\n'}
  fc -p .zsh_local_history
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.