Кажется, есть довольно много информации о том, как отредактировать и выполнить команду, используя ваш редактор, используя «edit-and-execute-command (Cx Ce)», но чего я хотел бы добиться, так это взять текущую команду оболочки, apply определенную фильтрацию (используя сценарий) и затем верните ее, чтобы запросить дальнейшее утверждение / ручные изменения перед выполнением. Это возможно с Bash?
13
edit-and-execute-command
.Escape
+V
, но он все равно будет выполнять команду. Что касается обходного пути, я бы добавилecho
спереди, чтобы выполнить его, напечатав команду на консоль для просмотра.Ответы:
Последнее обновление на моем опыте
Часть
0"+y$dd
в следующем отображении - это действительно то, о чем вы должны тщательно подумать и адаптировать ее к своему вкусу / рабочему процессу / опыту.Например, очень часто я сталкивался с несколькими строками в буфере, где я хочу выполнить только ту, на которой находится курсор; в этом случае я могу использовать
0"+y$dd:%d<CR>
вместо0"+y$dd
.И это только один из возможных сценариев.
Окончательный ответ для тех, кто любит
vim
vim
как вашEDITOR
/VISUAL
, чтобы при редактировании командной строки вы использовали егоvim
для редактирования.au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
в свой~/.vimrc
файл карту Leaderd(которую вы редко будете использовать при редактировании команды) с действием «удалить текущую строку в+
регистр без завершающего EOL».+
или*
регистр в отображении выше; способы вставки в терминал, скорее всего, будут отличаться; вам нужно,+clipboard
чтобы эти регистры были доступны .vim
редакторе, нажмите EscapeLeaderd.Оригинальный ответ
Мне часто нужно делать то же самое, и я делаю это следующим образом. (Я обычно использую
set -o vi
inbash
, поэтому пункты 1 и 2 в следующем отличаются, если вы используетеset -o emacs
, по умолчанию; в зависимости от вашего вопроса, похоже, что точки 1 и 2 объединены в Ctrl+ с xпоследующим Ctrl+ e, что сложнее набрать, imho .)(Здесь вы задаете вопрос.)
URxvt
.Очевидно, что это всего лишь обходной путь, заключающийся в копировании отредактированной команды в буфер обмена перед удалением всей команды, чтобы при выходе из редактора ничего не выполнялось; однако это лучшее, что я могу получить для себя.
Обновить
Поскольку мои
EDITOR
(иVISUAL
) равныvim
, когда я редактирую команду, я редактирую ее вvim
.В этом отношении я заметил, что буфер имеет имя
/tmp/bash-fc.random
, гдеrandom
6-символьная буквенно-цифровая случайная строка.Это дает пространство множеству возможностей, если вы используете их в
vim
качестве редактора, так как вы можете определить некоторое отображение в вашем.vimrc
файле для выполнения всей последовательности Escape0"+y$dd:wq. Например, одна команда , которую вы редко используют при редактировании командной строки Leaderd; поэтому вы можете поместить следующийmap
пинг в ваш.vimrc
файлтак что шаг 4 в приведенном выше рецепте становится
источник
Это невозможно сделать в Bash / readline, но это возможно в zsh с помощью
edit-command-line
команды:Теперь нажмите Control- x Control- eчтобы открыть редактор, отредактировать строку, выйти из редактора - вы увидите обновленную командную строку, но она не будет выполнена автоматически.
источник
Теперь, когда я думаю об этом, возможно, вариант того, что @kenorb предложил в комментарии, - лучший обходной путь (поскольку кажется, что никакого решения не существует), если мы хотим придерживаться
bash
.Что вы можете сделать, это добавить
#
символ (комментарий вbash
) к команде, а неecho
. Затем, когда вы выйдете из программы Exitor, команда будет неэффективна, и вам останется только нажать arrow up(или k, если вы используетеset -o vi
), удалить#
и подтверждение.Обратите внимание, что эта стратегия добавляет всего несколько нажатий клавиш, поэтому она может быть довольно эффективной, в зависимости от вашего уровня набора текста.
источник
Эти кусочки могут приблизить вас:
а) заменить нормальную привязку для новой строки (ctrl-M)
bind -x '"\C-M":date"
б) взять текущую строку из истории, используя
!#
замените дату любым сценарием, который вы хотите.
в) редактировать вручную
d) если необходимо, каким-то образом связать,
!!:p
который печатает новую команду в командной строке, но не выполняет ее, что позволяет вам вручную редактировать ее.д) используя Ctrl-J отправьте отредактированную команду вместо новой строки
или они могут не ....
источник
В bash есть возможность изменить команду из истории, не выполняя ее. Я не уверен, что возможно использовать сценарий для этого, кажется маловероятным. Хотя вы можете вносить изменения, используя модификаторы истории.
Вот как это выглядит:
источник
Я хотел бы указать вам на структуру Composure для Bash (я не связан с ней): https://github.com/erichs/composure
Это обеспечивает
draft
иrevise
функции, которые звучат так, как будто они могут помочь с тем, что вы пытаетесь сделать. Вот (длинная) цитата из файла readme проекта:источник
Это не представляется возможным с помощью сочетания клавиш, по крайней мере:
источник