diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index f7541fe25..2e6da7a89 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -615,7 +615,7 @@ impl EditorView { let mut x = viewport.x; let current_doc = view!(editor).doc; - for doc in editor.documents() { + for (idx, doc) in editor.documents().enumerate() { let fname = doc .path() .unwrap_or(&scratch) @@ -630,6 +630,16 @@ impl EditorView { bufferline_inactive }; + // Render the separator before the text if the current document is not first. + if idx > 0 { + let used_width = viewport.x.saturating_sub(x); + let rem_width = surface.area.width.saturating_sub(used_width); + let sep = &editor.config().bufferline.separator; + x = surface + .set_stringn(x, viewport.y, sep, rem_width as usize, bufferline_inactive) + .0; + } + 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); @@ -1479,10 +1489,10 @@ impl Component for EditorView { let config = cx.editor.config(); // check if bufferline should be rendered - use helix_view::editor::BufferLine; - let use_bufferline = match config.bufferline { - BufferLine::Always => true, - BufferLine::Multiple if cx.editor.documents.len() > 1 => true, + use helix_view::editor::BufferLineRenderMode; + let use_bufferline = match config.bufferline.render_mode { + BufferLineRenderMode::Always => true, + BufferLineRenderMode::Multiple if cx.editor.documents.len() > 1 => true, _ => false, }; diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 1708b3b4e..3baa6195c 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -299,6 +299,8 @@ pub struct Config { /// Whether to display infoboxes. Defaults to true. pub auto_info: bool, pub file_picker: FilePickerConfig, + /// Configuration of the bufferline + pub bufferline: BufferLineConfig, /// Configuration of the statusline elements pub statusline: StatusLineConfig, /// Shape for cursor in each mode @@ -316,8 +318,6 @@ pub struct Config { pub rulers: Vec, #[serde(default)] pub whitespace: WhitespaceConfig, - /// Persistently display open buffers along the top - pub bufferline: BufferLine, /// Vertical indent width guides. pub indent_guides: IndentGuidesConfig, /// Whether to color modes with different colors. Defaults to `false`. @@ -458,6 +458,35 @@ pub struct SearchConfig { pub wrap_around: bool, } +/// bufferline render modes +#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum BufferLineRenderMode { + /// Don't render bufferline + #[default] + Never, + /// Always render + Always, + /// Only if multiple buffers are open + Multiple, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case", default, deny_unknown_fields)] +pub struct BufferLineConfig { + pub render_mode: BufferLineRenderMode, + pub separator: String, +} + +impl Default for BufferLineConfig { + fn default() -> Self { + Self { + render_mode: BufferLineRenderMode::default(), + separator: String::from("│"), + } + } +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case", default, deny_unknown_fields)] pub struct StatusLineConfig { @@ -633,19 +662,6 @@ impl Default for CursorShapeConfig { } } -/// bufferline render modes -#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "kebab-case")] -pub enum BufferLine { - /// Don't render bufferline - #[default] - Never, - /// Always render - Always, - /// Only if multiple buffers are open - Multiple, -} - #[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub enum LineNumber { @@ -952,6 +968,7 @@ impl Default for Config { completion_trigger_len: 2, auto_info: true, file_picker: FilePickerConfig::default(), + bufferline: BufferLineConfig::default(), statusline: StatusLineConfig::default(), cursor_shape: CursorShapeConfig::default(), true_color: false, @@ -961,7 +978,6 @@ impl Default for Config { terminal: get_terminal_provider(), rulers: Vec::new(), whitespace: WhitespaceConfig::default(), - bufferline: BufferLine::default(), indent_guides: IndentGuidesConfig::default(), color_modes: false, soft_wrap: SoftWrap {