Вставка новой строки в многострочную команду 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
Звучит как подходящее место для использования файла сценария оболочки вместо?
#!/bin/zsh
my
commands
here
I can even add a new line at a later time.