Как мне отредактировать предыдущие строки в многострочной команде в Bash?

24

Как ввести предыдущие строки при вводе команды, которая занимает несколько строк в Bash? Я пользователь Linux Mint (Lisa), использующий терминал GNOME.

Например, скажем, я печатаю:

$ echo "foo bar
> baz
>

А потом, когда я собираюсь набрать третью строку команды, вдруг понимаю, что я хочу, чтобы «foo» и «bar» были в отдельных строках. Как бы мне переместить курсор между «foo» и «bar» так, чтобы я мог нажать ввод и поместить их в отдельные строки?

(Это не так просто, как вы думаете. Стрелка вверх не работает, как и Ctrl-P. Поэтому, пожалуйста, попробуйте это перед публикацией! Спасибо!)

Ашер Вальтер
источник
Принятый ответ говорит, что нет решения, но есть. Смотрите ниже
cdosborn

Ответы:

16

Это, к сожалению, до bashтерминала, а не до. Ваши варианты:

  1. Используйте точку с запятой вместо новой строки, хотя даже тогда вы не можете одновременно перемещаться вверх по экранной строке, но должны использовать команды перемещения символов или слов. (Как ни странно, zshпо крайней мере, вы можете перемещаться внутри составной команды при редактировании истории, но не внутри текущей команды.) Иногда fc(которая бросает вас в ваш редактор с помощью предыдущей команды) это самый простой способ обработки составных команд.

  2. Если вы используете Bash, используйте следующую комбинацию клавиш:

    ctrl x e

    Откроется команда, над которой вы работаете, используя ваш текстовый редактор. Сохраните файл и выйдите. (Я нашел команду в презентации Shell Hater .) У пользователей Zsh есть такая альтернатива .

geekosaur
источник
1
Страница руководства bash объясняет, как изменить используемый редактор: edit-and-execute-command (C-xC-e) - вызвать редактор в текущей командной строке и выполнить результат как команды оболочки. Bash пытается вызвать $ VISUAL, $ EDITOR и emacs в качестве редактора в указанном порядке.
Матфея
Есть решение, не открывая редактор.
cdosborn
Технически дело не в bash, а в библиотеке readline, которую использует bash для получения входных данных.
Кристиан Херенц
11

Решение состоит в том, чтобы никогда не вводить команду до тех пор, пока многострочная строка не будет правильной, просто введите:, CtrlvCtrlj когда вы хотите перейти к следующей строке. Metabвернуться на слово.

решение

кредит на ответ @ rici

cdosborn
источник
4

Как ни странно, Ctrl+Cэто то , что вы ищете.

когда ты на

$ echo "foo bar
> baz
>

просто нажмите Ctrl+C(отредактированная командная строка будет приостановлена) и нажмите Up(предыдущая история). Ваша подсказка будет: (обратите внимание на отсутствие>)

$ echo "foo bar
baz

Теперь вы можете перемещаться Left Rightдаже с помощью прыжков с линии.

Есть только одна особенность, вы должны быть на последнем символе, чтобы добавить еще одну строку, поэтому перемещайтесь, чтобы редактировать существующие строки (переходите к началу Ctrl+A), нажмите, Enter если этого достаточно, или перейдите к концу ( Ctrl+E), чтобы добавить больше строк Enter. Еще одним недостатком является то, что Ctrl+_(отменить) восстанавливает только изменения с последнегоCtrl+C

albfan
источник
-2

Скопируйте команды и вставьте их в блокнот, затем отформатируйте их оттуда. После этого вы можете скопировать свои команды обратно в терминал.

Pacheko
источник