似乎有很多关于如何使用编辑器使用“edit-and-execute-command (Cx Ce)”编辑和执行命令的信息,但我想要实现的是获取当前的 shell 命令,应用某些过滤(使用脚本),然后在执行前返回它以提示进一步批准/手动更改。这可以用 bash 吗?
Enr*_*lis 10
0"+y$dd以下映射中的部分确实是您应该仔细考虑并根据您的品味/工作流程/经验进行调整的内容。
例如,我经常发现缓冲区中有多行,我只想执行光标所在的那一行;在这种情况下,我可以使用0"+y$dd:%d<CR>代替0"+y$dd.
而这只是可能的场景之一。
vimvim为您的EDITOR/ VISUAL,以便在编辑命令行时,您将用于vim编辑它。au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>您的~/.vimrc文件以映射Leaderd(在编辑命令时很少使用)到“将当前行删除到+寄存器中而没有尾随 EOL”的操作。
vim器中完成编辑命令后,点击EscapeLeaderd。我经常需要这样做,我这样做如下。(我通常使用set -o viin bash,所以如果您使用set -o emacs默认值,那么下面的第 1 点和第 2 点是不同的;根据您的问题,看起来第 1 点和第 2 点统一在Ctrl+x后跟Ctrl+ e,这更难输入,恕我直言.)
(这是你问问题的地方。)
URxvt。显然,这只是一种解决方法,包括在删除整个命令之前将编辑过的命令复制到剪贴板中,以便在退出编辑器时不会执行任何操作;然而,这是我自己能得到的最好的。
由于我的EDITOR(和VISUAL) 等于vim,所以当我编辑命令时,我在vim.
在这方面,我注意到缓冲区名为/tmp/bash-fc.random,其中random是 6 个字符的字母数字随机字符串。
这为很多可能性提供了空间,如果您将其vim用作编辑器,因为您可以在其中定义一些映射.vimrc来执行整个序列Escape0"+y$dd:wq。例如,您在编辑命令行时很少使用的一个命令是Leaderd; 因此您可以将以下mapping 放入您的.vimrc文件中
au BufEnter /tmp/bash-fc.* nn <Leader>d 0"+y$dd:wq<CR>
Run Code Online (Sandbox Code Playgroud)
使上述配方中的第 4 步变为
l0b*_*0b0 -1
使用键盘快捷键似乎不可能,至少:
$ bind -P | grep -e command -e edit
complete-command can be found on "\e!".
edit-and-execute-command can be found on "\C-x\C-e".
emacs-editing-mode is not bound to any keys
possible-command-completions can be found on "\C-x!".
vi-editing-mode is not bound to any keys
Run Code Online (Sandbox Code Playgroud)