Комментарии в командной строке 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чтобы активировать комментарии в стиле bash.

Лайнольд
источник
3
Вы также можете сделать это, set -kесли это всего лишь один раз. Но я бы использовал setoptстрочку из этого ответа в своем zshrc
Хэмиш Даунер
12
Есть ли причина, по которой это не поведение по умолчанию?
naught101
1
@ naught101 многие лучшие части zsh отключены по умолчанию. не знаю почему
zzapper 09
@ 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-ввод работает. Он должен появиться снова, когда вы запустите следующую команду или просто нажмете Enter. Разве это не так?
Michał Politowski
1
@barbaz стеком можно управлять с помощью read -zи print -z, поэтому с помощью некоторых сценариев и временных файлов вы могли. Но тогда пользовательский виджет zle для сохранения командной строки во временный файл может быть проще, а общая история будет еще проще.
Михал Политовский,
1
В то время как принятый в настоящее время ответ касается вопроса спрашивающего , этот ответ отражает намерение спрашивающего . Т.е. у zsh есть лучший способ достижения желаемого результата, и это он.
wjv
1
Это должен быть принятый ответ. Если вы используете oh-my-zsh, вы можете использовать Ctrl-Q для этого прямо из коробки.
Gecko
18

Я тоже часто делаю это. Что я делаю, так это вырезаю длинную команду, выполняю команду, которая должна быть первой, а затем вставляю длинную команду обратно. Это просто: CTRL + U вырезает текущую команду в буфер, CTRL + Y вставляет ее. Работает в zsh и bash.

Фредрик Мёллерстранд
источник
ну, на самом деле, мой способ - обходной путь, в то время как ваше решение лучше всего подходит;)
Рольф
4
Это не должен быть общепринятым ответом. Решение, приведенное ниже, в котором говорится об использовании "setopt interactivecomments", должно быть. Причина этого в том, что если вы просто вырезаете текущую команду, то ее нет в вашей истории zsh, а также вы не можете легко использовать вырезать и вставить при вводе новой команды, не перезаписывая команду, которую вы пытались спасти.
Дуглас
1
Использование комментариев и решения в этих ответах - это обходные пути; метод push-input, опубликованный Михалом Политовским, является более правильным.
Fredrik Möllerstrand
0

В дополнение к setopt interactivecommentsпредложению @Lajnold вы также можете добавить что-то вроде следующего, чтобы предотвратить запись определенных комментариев в историю (с /superuser/352788/how-to-prevent-a- command-in-the-zshell-from-being-saved-into-history ):

Это отменяет встроенную функцию 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
}
FlakRat
источник