首页 > 解决方案 > fzf、stdin 和从 rust 调用程序的问题:

问题描述

当我尝试调用时fzf | myprogram,我会发生这种非常奇怪的行为。到启动时,设置出现了问题。我能够在 zsh & bash、config & no config、linux & macOS 上重现这一点。最小复制:myprogramvimvimstty

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但这个问题似乎仍然存在。

到底是怎么回事?

标签: shellvimruststdinfzf

解决方案


@Masklinn 启发我创建了一个我刚刚使用的示例,catxargs我惊讶的是,它也不起作用!

然后我遇到了这篇文章,它解释了 vim 在启动时会修改当前终端,当它关闭时,它会尝试恢复它启动时的配置。除非以非标准方式调用它,否则它不会恢复到正确的状态。

我的所有问题都通过告诉 rust 启动 vim 得到解决,例如:

bash -c '</dev/tty vim "$@"'

而不是喜欢:

bash -c 'vim "$@"'

推荐阅读