Вставка новой строки в многострочную команду zsh, извлеченную из истории

Иногда я использую многострочные команды в zsh:

❯ echo \
> a \
> multiline \
> command

При редактировании команды после извлечения ее из истории поиска, я могу изменить содержание отдельных строк. Однако я не могу понять, как вставить еще одну строку:

# I want to insert another line after "multiline"...
❯ echo \
> a \
> multiline \  # but hitting <return> here just runs the command, even though there's a backslash at the end of the line
> command

Как вставить новую строку в середине многострочной команды, извлеченной из истории?

7 ответов

Решение

Ты можешь использовать self-insert-unmeta связать Alt+Return, чтобы вставить буквальный перевод строки без принятия команды:

bindkey '^[^M' self-insert-unmeta

Чтобы использовать ваш пример: нажмите Alt+Return в позиции курсора (#)

% echo \
a \
multiline \#
command

Вы получите это:

% echo \
a \
multiline \
#
command

Это работает не только при редактировании истории, но и при наборе команд. Таким образом, вы можете подготовить несколько команд в виде сценария, например, моды и принять их с помощью одного Return

Например, нажав Alt+Return вместо # в этом примере:

% echo command 1#
echo command 2#
echo command 3

будет делать то же самое, что и команда echo command 1; echo command 2; echo command 3 и произвести этот вывод:

command 1
command 2
command 3

Вы можете использовать ESC-Return.

FWIW, я тестировал его на Debian Jessie, zsh 5.0.7, и он там работает.

(Сводка ответов с https://unix.stackexchange.com/questions/6620/how-to-edit-command-line-in-full-screen-editor-in-zsh)

zsh поставляется с функцией, которую можно использовать для открытия текущей командной строки в вашем любимом редакторе. Добавьте следующие строки в ваш .zshrc:

autoload -z edit-command-line
zle -N edit-command-line
bindkey "^X^E" edit-command-line

Первая строка загружает функцию. Вторая строка создает новый виджет для редактора Z shell line (zle) из функции с тем же именем. Третья строка связывает виджет с Control-X Control-E. Если вы используете vi привязки, а не emacs привязки клавиш, используйте что-то вроде

bindkey -M vicmd v edit-command-line

вместо этого (который связывает виджет с v в vicmd Режим).

При использовании bindkey -v режим, вы также можете использовать команды O/O по умолчанию из vicmd Режим добавления новой строки и ввода insert режим в нем соответственно выше или ниже текущей строки.

Просто отметим, что если вы хотите комментировать в многострочной команде, вы можете использовать:

❯ echo `#first comment` \
> a `#second comment` \
> multiline \
> command

CTRL + Enter (возврат) для непрофессионалов.

Звучит как подходящее место для использования файла сценария оболочки вместо?

#!/bin/zsh
my
commands
here
I can even add a new line at a later time.
Другие вопросы по тегам