我正在尝试创建一个 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 的标准输入。