v0.2.10 : affichage ls/dir adapte a la largeur du terminal — detection de la largeur de la console (AM_TABLE_WIDTH pour tests), troncature de la colonne nom avec …, suppression des colonnes de fin si necessaire, une ligne par entree
This commit is contained in:
@@ -239,6 +239,42 @@ pub fn print_json<T: Serialize>(value: &T) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Width of the terminal attached to stdout, in columns. Returns None when
|
||||
/// stdout is not a terminal (e.g. piped). AM_TABLE_WIDTH overrides it, mostly
|
||||
/// for tests and scripts.
|
||||
pub fn terminal_width() -> Option<usize> {
|
||||
if let Ok(v) = std::env::var("AM_TABLE_WIDTH") {
|
||||
if let Ok(w) = v.trim().parse::<usize>() {
|
||||
return Some(w);
|
||||
}
|
||||
}
|
||||
#[cfg(windows)]
|
||||
{
|
||||
use std::os::windows::io::AsRawHandle;
|
||||
use windows_sys::Win32::System::Console::{
|
||||
GetConsoleScreenBufferInfo, CONSOLE_SCREEN_BUFFER_INFO,
|
||||
};
|
||||
let handle = std::io::stdout().as_raw_handle() as isize;
|
||||
let mut info: CONSOLE_SCREEN_BUFFER_INFO = unsafe { std::mem::zeroed() };
|
||||
if unsafe { GetConsoleScreenBufferInfo(handle, &mut info) } != 0 {
|
||||
let width = (info.srWindow.Right - info.srWindow.Left + 1) as usize;
|
||||
if width > 0 {
|
||||
return Some(width);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
#[cfg(not(windows))]
|
||||
{
|
||||
if let Ok(v) = std::env::var("COLUMNS") {
|
||||
if let Ok(w) = v.trim().parse::<usize>() {
|
||||
return Some(w);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn strip_ansi(s: &str) -> String {
|
||||
let mut out = String::new();
|
||||
let mut chars = s.chars();
|
||||
|
||||
Reference in New Issue
Block a user