Ctrl XE 不立即执行命令

Ctrl XE 不立即执行命令

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 -falias rm='rm -i'运行无别名rm

答案2

虽然这不能直接回答您的问题,但在zshfishshell(以及可能的其他 shell)中,您请求的行为是默认的。

关闭编辑器将会把命令粘贴到当前 shell 中而不执行它。

相关内容