diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 9343d55d4..ecbad1e4e 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -581,31 +581,55 @@ impl EditorView { let mut x = viewport.x; let current_doc = view!(editor).doc; + let mut current_doc_idx = None; + let mut needed_width = 0; - for doc in editor.documents() { - let fname = doc - .path() - .unwrap_or(&scratch) - .file_name() - .unwrap_or_default() - .to_str() - .unwrap_or_default(); + let entries: Vec = editor + .documents() + .enumerate() + .map(|(idx, doc)| { + let fname = doc + .path() + .unwrap_or(&scratch) + .file_name() + .unwrap_or_default() + .to_str() + .unwrap_or_default(); - let style = if current_doc == doc.id() { + let text = format!(" {}{} ", fname, if doc.is_modified() { "[+]" } else { "" }); + + if doc.id() == current_doc { + current_doc_idx = Some(idx); + needed_width += text.len(); + } else if current_doc_idx.is_none() { + needed_width += text.len(); + } + text + }) + .collect(); + + let mut to_trim = needed_width.saturating_sub(viewport.width as usize); + for (idx, filename) in entries.iter().enumerate() { + let mut text = filename.as_str(); + if to_trim > 0 && to_trim < text.len() { + text = &filename[to_trim..]; + to_trim = 0; + } else if to_trim > 0 { + to_trim -= text.len(); + continue; + } + let style = if idx == current_doc_idx.unwrap() { bufferline_active } else { bufferline_inactive }; - let text = format!(" {}{} ", fname, if doc.is_modified() { "[+]" } else { "" }); - let used_width = viewport.x.saturating_sub(x); - let rem_width = surface.area.width.saturating_sub(used_width); - + let rem_width = viewport.right().saturating_sub(x); x = surface .set_stringn(x, viewport.y, text, rem_width as usize, style) .0; - if x >= surface.area.right() { + if x >= viewport.right() { break; } }