From 51d04f1a709172c7841c86973694c9d79ab66640 Mon Sep 17 00:00:00 2001 From: Ajeet D'Souza <98ajeet@gmail.com> Date: Fri, 16 Apr 2021 12:17:18 +0530 Subject: [PATCH] Buffer stdout in list queries --- src/cmd/query.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/cmd/query.rs b/src/cmd/query.rs index 1c324d7..d3d40e7 100644 --- a/src/cmd/query.rs +++ b/src/cmd/query.rs @@ -8,7 +8,7 @@ use crate::util; use anyhow::{Context, Result}; use clap::Clap; -use std::io::{self, Write}; +use std::io::{self, BufWriter, Write}; /// Search for a directory in the database #[derive(Clap, Debug)] @@ -52,6 +52,7 @@ impl Cmd for Query { for dir in matches { writeln!(handle, "{}", dir.display_score(now)).handle_err("fzf")?; } + let selection = fzf.wait_select()?; if self.score { print!("{}", selection); @@ -62,8 +63,13 @@ impl Cmd for Query { print!("{}", path) } } else if self.list { + // Rust does line-buffering by default, i.e. it flushes stdout + // after every newline. This is not ideal when printing a large + // number of lines, so we put stdout in a BufWriter. let stdout = io::stdout(); - let handle = &mut stdout.lock(); + let stdout = stdout.lock(); + let mut handle = BufWriter::new(stdout); + for dir in matches { if self.score { writeln!(handle, "{}", dir.display_score(now)) @@ -72,6 +78,7 @@ impl Cmd for Query { } .handle_err("stdout")?; } + handle.flush().handle_err("stdout")?; } else { let dir = matches.next().context("no match found")?; if self.score {