shell - fzf、stdin 和从 rust 调用程序的问题:
问题描述
当我尝试调用时fzf | myprogram
,我会发生这种非常奇怪的行为。到启动时,设置出现了问题。我能够在 zsh & bash、config & no config、linux & macOS 上重现这一点。最小复制:myprogram
vim
vim
stty
cargo new myprogram
src/main.rs
use std::io;
fn main() {
let mut file_name = String::new();
io::stdin()
.read_line(&mut file_name)
.expect("Failed to read from stdin");
file_name.retain(|c| !c.is_whitespace());
println!("{}", file_name);
std::process::Command::new("/bin/bash")
.arg("-c")
.arg(format!("vim {}", file_name))
.spawn()
.expect("Error: Failed to run editor")
.wait()
.unwrap()
.success();
}
为方便起见,我通常:cargo install --path .
当我fzf | myprogram
能够选择一个文件并且它确实vim
按预期打开时。但是在insert
模式下,当我退格时,我看到:^?
. 当我退出 vim 并且^C
它不起作用时,它只是插入^C
字符。每个换行符的格式不正确,通常很难读取任何输出。
经过一番研究,我遇到了这个reset
命令。当我调用reset
它时,在每种测试情况下都会输出相同的内容:
重置
Erase set to delete.
Kill set to control-U (^U).
Interrupt set to control-C (^C).
我尝试了几种读取stdin
和调用的方法,vim
但这个问题似乎仍然存在。
到底是怎么回事?
解决方案
@Masklinn 启发我创建了一个我刚刚使用的示例,cat
令xargs
我惊讶的是,它也不起作用!
然后我遇到了这篇文章,它解释了 vim 在启动时会修改当前终端,当它关闭时,它会尝试恢复它启动时的配置。除非以非标准方式调用它,否则它不会恢复到正确的状态。
我的所有问题都通过告诉 rust 启动 vim 得到解决,例如:
bash -c '</dev/tty vim "$@"'
而不是喜欢:
bash -c 'vim "$@"'