vim
使用 Bash 在 $EDITOR (就我而言)中输入复杂的命令非常方便。Ctrl XE
但是,我认为如果命令不是立即执行而是粘贴到命令行中,这样我就可以根据之前的命令/输出进行最终调整,那就更好了。有没有简单的方法可以实现这一点?
答案1
我不知道你是否认为它很简单。这是一个快速而粗略的概念证明:
# in Bash
_edit_wo_executing() {
local editor="${EDITOR:-nano}"
tmpf="$(mktemp)"
printf '%s\n' "$READLINE_LINE" > "$tmpf"
"$editor" "$tmpf"
READLINE_LINE="$(<"$tmpf")"
READLINE_POINT="${#READLINE_LINE}"
rm -f "$tmpf" # -f for those who have alias rm='rm -i'
}
bind -x '"\C-x\C-e":_edit_wo_executing'
现在应该做你想做的事。Ctrl xe
笔记:
我仅使用基本逻辑来设置
editor
;根据您的需要进行调整。READLINE_POINT="${#READLINE_LINE}"
应该将光标放在最后。Bash 5 需要字符长度,上述代码可以正常工作;但 Bash 4 需要字节。要在 Bash 4 中处理非 ASCII 文本,请使用READLINE_POINT="$(printf '%s' "$READLINE_LINE" | wc -c)"
(我从这个答案)。
击键后,该函数将在当前 shell 中执行,因此(与脚本不同)您的别名将起作用。使用 的用户建议
-f
使用 in 。一般来说,您可能希望rm -f
alias rm='rm -i'
运行无别名rm
。
答案2
虽然这不能直接回答您的问题,但在zsh
和fish
shell(以及可能的其他 shell)中,您请求的行为是默认的。
关闭编辑器将会把命令粘贴到当前 shell 中而不执行它。