Added non-interactive mode for --list-languages

This makes scripting it a lot easier and less hacky.
This commit is contained in:
Ethan P authored and David Peter committed 2019-05-14 22:50:42 +02:00
1 parent 27e0ca98d9
commit 493a4e719e
1 file changed
+38 -32
+38 -32
View File
@@ -108,48 +108,54 @@ pub fn list_languages(config: &Config) -> Result<()> {
.collect::<Vec<_>>(); .collect::<Vec<_>>();
languages.sort_by_key(|lang| lang.name.to_uppercase()); languages.sort_by_key(|lang| lang.name.to_uppercase());
let longest = languages
.iter()
.map(|syntax| syntax.name.len())
.max()
.unwrap_or(32); // Fallback width if they have no language definitions.
let comma_separator = ", ";
let separator = " ";
// Line-wrapping for the possible file extension overflow.
let desired_width = config.term_width - longest - separator.len();
let stdout = io::stdout(); let stdout = io::stdout();
let mut stdout = stdout.lock(); let mut stdout = stdout.lock();
let style = if config.colored_output { if config.loop_through {
Green.normal() for lang in languages {
write!(stdout, "{}:{}\n", lang.name, lang.file_extensions.join(","));
}
} else { } else {
Style::default() let longest = languages
}; .iter()
.map(|syntax| syntax.name.len())
.max()
.unwrap_or(32); // Fallback width if they have no language definitions.
for lang in languages { let comma_separator = ", ";
write!(stdout, "{:width$}{}", lang.name, separator, width = longest)?; let separator = " ";
// Line-wrapping for the possible file extension overflow.
let desired_width = config.term_width - longest - separator.len();
// Number of characters on this line so far, wrap before `desired_width` let style = if config.colored_output {
let mut num_chars = 0; Green.normal()
} else {
Style::default()
};
let mut extension = lang.file_extensions.iter().peekable(); for lang in languages {
while let Some(word) = extension.next() { write!(stdout, "{:width$}{}", lang.name, separator, width = longest)?;
// If we can't fit this word in, then create a line break and align it in.
let new_chars = word.len() + comma_separator.len(); // Number of characters on this line so far, wrap before `desired_width`
if num_chars + new_chars >= desired_width { let mut num_chars = 0;
num_chars = 0;
write!(stdout, "\n{:width$}{}", "", separator, width = longest)?; let mut extension = lang.file_extensions.iter().peekable();
} while let Some(word) = extension.next() {
// If we can't fit this word in, then create a line break and align it in.
let new_chars = word.len() + comma_separator.len();
if num_chars + new_chars >= desired_width {
num_chars = 0;
write!(stdout, "\n{:width$}{}", "", separator, width = longest)?;
}
num_chars += new_chars; num_chars += new_chars;
write!(stdout, "{}", style.paint(&word[..]))?; write!(stdout, "{}", style.paint(&word[..]))?;
if extension.peek().is_some() { if extension.peek().is_some() {
write!(stdout, "{}", comma_separator)?; write!(stdout, "{}", comma_separator)?;
}
} }
writeln!(stdout)?;
} }
writeln!(stdout)?;
} }
Ok(()) Ok(())