![运行 cat 后在子进程中调用 vim](https://linux22.com/image/222932/%E8%BF%90%E8%A1%8C%20cat%20%E5%90%8E%E5%9C%A8%E5%AD%90%E8%BF%9B%E7%A8%8B%E4%B8%AD%E8%B0%83%E7%94%A8%20vim.png)
我正在尝试创建一个 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 的标准输入。