Ctrl XE 不立即执行命令

zea*_*oas 10 linux bash command-line

vim您可以在 Bash 中的 $EDITOR (在我的例子中)中键入复杂的命令,这非常方便。Ctrl XE

但是,在我看来,如果不立即执行该命令而是将其粘贴到命令行,以便我可以根据以前的命令/输出进行最终调整,那就更好了。有没有一种简单的方法可以实现这一目标?

Kam*_*ski 13

我不知道你是否会认为这很简单。这是一个快速而肮脏的概念证明:

# 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'
Run Code Online (Sandbox Code Playgroud)

现在应该做你想做的事。Ctrl xe

笔记:

  • 我只使用基本逻辑来设置editor;根据您的需要进行调整。

  • READLINE_POINT="${#READLINE_LINE}"应该将光标放在最后。Bash 5 想要字符长度,上面的代码可以工作;但 Bash 4 需要字节。要在 Bash 4 中处理非 ASCII 文本,请使用

    READLINE_POINT="$(printf '%s' "$READLINE_LINE" | wc -c)"
    
    Run Code Online (Sandbox Code Playgroud)

    (我从这个答案中了解到)。

  • 按下按键后,该函数将在您当前的 shell 中执行,因此(与脚本中不同)您的别名将起作用。该-finrm -f是由一位使用 的用户建议的alias rm='rm -i'。一般来说,您可能希望运行 unaliasedrm

  • 我的编辑器设置为“emacs -nw”,但出现错误:“bash:emacs -nw:找不到命令”。要修复此错误,我必须删除引号,即将 `"$editor" "$tmpf"` 更改为 `$editor "$tmpf"` (2认同)