运行 cat 后在子进程中调用 vim

运行 cat 后在子进程中调用 vim

我正在尝试创建一个 bash 函数vim_run,其操作如下:

  • 用户将命令输出传输到vim_run
  • 用户可以编辑输出
  • 用户退出 vim 并且该缓冲区的内容现在通过source file

此流程对于编辑要删除的文件列表非常有用。我目前将其实施为

function vrun() {
    local tmpfile=$(mktemp)
    cat > "$tmpfile"
    vim "$tmpfile" --not-a-term
    source "$tmpfile"
    rm "$tmpfile"
}

但是,我不知道如何使 vim 在标准输入和终端方面正确运行。每当我通过管道输出到这个函数时,例如

echo 'echo foo' | vim_run

编辑内容并退出 vim 后,它破坏了我的终端:当我键入时它不显示字符。只有当我隐形打字时,stty sane它才会恢复正常。我隐约明白vim需要访问stdin才能正常工作;然而,完成后cat > $tmpfile,剩余的标准输入不应该可供vim使用吗?

答案1

这为我解决了这个问题:

function vrun() {
    local tmpfile=$(mktemp)
    cat > "$tmpfile"
    vim "$tmpfile" < /dev/tty
    source "$tmpfile"
    rm "$tmpfile"
}

我们必须将会话的控制 TTY 重定向为 Vim 的标准输入。

相关内容