diff --git a/book/src/themes.md b/book/src/themes.md index 9b7e97a1c9ff8..23c3a0c29b9af 100644 --- a/book/src/themes.md +++ b/book/src/themes.md @@ -247,59 +247,64 @@ These scopes are used for theming the editor interface. - `hover` - for hover popup ui -| Key | Notes | -| --- | --- | -| `ui.background` | | -| `ui.background.separator` | Picker separator below input line | -| `ui.cursor` | | -| `ui.cursor.normal` | | -| `ui.cursor.insert` | | -| `ui.cursor.select` | | -| `ui.cursor.match` | Matching bracket etc. | -| `ui.cursor.primary` | Cursor with primary selection | -| `ui.cursor.primary.normal` | | -| `ui.cursor.primary.insert` | | -| `ui.cursor.primary.select` | | -| `ui.gutter` | Gutter | -| `ui.gutter.selected` | Gutter for the line the cursor is on | -| `ui.linenr` | Line numbers | -| `ui.linenr.selected` | Line number for the line the cursor is on | -| `ui.statusline` | Statusline | -| `ui.statusline.inactive` | Statusline (unfocused document) | -| `ui.statusline.normal` | Statusline mode during normal mode ([only if `editor.color-modes` is enabled][editor-section]) | -| `ui.statusline.insert` | Statusline mode during insert mode ([only if `editor.color-modes` is enabled][editor-section]) | -| `ui.statusline.select` | Statusline mode during select mode ([only if `editor.color-modes` is enabled][editor-section]) | -| `ui.statusline.separator` | Separator character in statusline | -| `ui.popup` | Documentation popups (e.g Space + k) | -| `ui.popup.info` | Prompt for multiple key options | -| `ui.window` | Border lines separating splits | -| `ui.help` | Description box for commands | -| `ui.text` | Command prompts, popup text, etc. | -| `ui.text.focus` | | -| `ui.text.inactive` | Same as `ui.text` but when the text is inactive (e.g. suggestions) | -| `ui.text.info` | The key: command text in `ui.popup.info` boxes | -| `ui.virtual.ruler` | Ruler columns (see the [`editor.rulers` config][editor-section]) | -| `ui.virtual.whitespace` | Visible whitespace characters | -| `ui.virtual.indent-guide` | Vertical indent width guides | -| `ui.virtual.wrap` | Soft-wrap indicator (see the [`editor.soft-wrap` config][editor-section]) | -| `ui.menu` | Code and command completion menus | -| `ui.menu.selected` | Selected autocomplete item | -| `ui.menu.scroll` | `fg` sets thumb color, `bg` sets track color of scrollbar | -| `ui.selection` | For selections in the editing area | -| `ui.selection.primary` | | -| `ui.cursorline.primary` | The line of the primary cursor ([if cursorline is enabled][editor-section]) | -| `ui.cursorline.secondary` | The lines of any other cursors ([if cursorline is enabled][editor-section]) | -| `ui.cursorcolumn.primary` | The column of the primary cursor ([if cursorcolumn is enabled][editor-section]) | -| `ui.cursorcolumn.secondary` | The columns of any other cursors ([if cursorcolumn is enabled][editor-section]) | -| `warning` | Diagnostics warning (gutter) | -| `error` | Diagnostics error (gutter) | -| `info` | Diagnostics info (gutter) | -| `hint` | Diagnostics hint (gutter) | -| `diagnostic` | Diagnostics fallback style (editing area) | -| `diagnostic.hint` | Diagnostics hint (editing area) | -| `diagnostic.info` | Diagnostics info (editing area) | -| `diagnostic.warning` | Diagnostics warning (editing area) | -| `diagnostic.error` | Diagnostics error (editing area) | +| Key | Notes | +| --- | --- | +| `ui.background` | | +| `ui.background.separator` | Picker separator below input line | +| `ui.cursor` | | +| `ui.cursor.normal` | | +| `ui.cursor.insert` | | +| `ui.cursor.select` | | +| `ui.cursor.match` | Matching bracket etc. | +| `ui.cursor.primary` | Cursor with primary selection | +| `ui.cursor.primary.normal` | | +| `ui.cursor.primary.insert` | | +| `ui.cursor.primary.select` | | +| `ui.debug.breakpoint` | Color of the breakpoint signal, found in the gutter. | +| `ui.debug.current` | Color of the current line at which debugging execution is paused at. | +| `ui.debug.cursor` | Cursor color on the line at which debugging execution is paused at. Defaults to `ui.cursor` (either primary or not). | +| `ui.debug.indicator` | Gutter indicator for `ui.debug.current`. Falls back on `ui.debug.breakpoint`. | +| `ui.debug.selection` | Selection color on the line at which debugging execution is paused at. Defaults to `ui.selection` (either primary or not). | +| `ui.gutter` | Gutter | +| `ui.gutter.selected` | Gutter for the line the cursor is on | +| `ui.linenr` | Line numbers | +| `ui.linenr.selected` | Line number for the line the cursor is on | +| `ui.statusline` | Statusline | +| `ui.statusline.inactive` | Statusline (unfocused document) | +| `ui.statusline.normal` | Statusline mode during normal mode ([only if `editor.color-modes` is enabled][editor-section]) | +| `ui.statusline.insert` | Statusline mode during insert mode ([only if `editor.color-modes` is enabled][editor-section]) | +| `ui.statusline.select` | Statusline mode during select mode ([only if `editor.color-modes` is enabled][editor-section]) | +| `ui.statusline.separator` | Separator character in statusline | +| `ui.popup` | Documentation popups (e.g Space + k) | +| `ui.popup.info` | Prompt for multiple key options | +| `ui.window` | Border lines separating splits | +| `ui.help` | Description box for commands | +| `ui.text` | Command prompts, popup text, etc. | +| `ui.text.focus` | | +| `ui.text.inactive` | Same as `ui.text` but when the text is inactive (e.g. suggestions) | +| `ui.text.info` | The key: command text in `ui.popup.info` boxes | +| `ui.virtual.ruler` | Ruler columns (see the [`editor.rulers` config][editor-section]) | +| `ui.virtual.whitespace` | Visible whitespace characters | +| `ui.virtual.indent-guide` | Vertical indent width guides | +| `ui.virtual.wrap` | Soft-wrap indicator (see the [`editor.soft-wrap` config][editor-section]) | +| `ui.menu` | Code and command completion menus | +| `ui.menu.selected` | Selected autocomplete item | +| `ui.menu.scroll` | `fg` sets thumb color, `bg` sets track color of scrollbar | +| `ui.selection` | For selections in the editing area | +| `ui.selection.primary` | | +| `ui.cursorline.primary` | The line of the primary cursor ([if cursorline is enabled][editor-section]) | +| `ui.cursorline.secondary` | The lines of any other cursors ([if cursorline is enabled][editor-section]) | +| `ui.cursorcolumn.primary` | The column of the primary cursor ([if cursorcolumn is enabled][editor-section]) | +| `ui.cursorcolumn.secondary` | The columns of any other cursors ([if cursorcolumn is enabled][editor-section]) | +| `warning` | Diagnostics warning (gutter) | +| `error` | Diagnostics error (gutter) | +| `info` | Diagnostics info (gutter) | +| `hint` | Diagnostics hint (gutter) | +| `diagnostic` | Diagnostics fallback style (editing area) | +| `diagnostic.hint` | Diagnostics hint (editing area) | +| `diagnostic.info` | Diagnostics info (editing area) | +| `diagnostic.warning` | Diagnostics warning (editing area) | +| `diagnostic.error` | Diagnostics error (editing area) | You can check compliance to spec with diff --git a/helix-dap/src/client.rs b/helix-dap/src/client.rs index f6d8a06967134..7a750446aa38b 100644 --- a/helix-dap/src/client.rs +++ b/helix-dap/src/client.rs @@ -495,4 +495,14 @@ impl Client { self.call::(args) } + + pub fn current_stack_frame(&self) -> Option<&StackFrame> { + if let (Some(frame), Some(thread_id)) = (self.active_frame, self.thread_id) { + self.stack_frames + .get(&thread_id) + .and_then(|bt| bt.get(frame)) + } else { + None + } + } } diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 59f371bda5dc8..f973e763e1015 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -91,18 +91,16 @@ impl EditorView { let mut line_decorations: Vec> = Vec::new(); let mut translated_positions: Vec = Vec::new(); + if is_focused && config.cursorline { + line_decorations.push(Self::cursorline_decorator(doc, view, theme)) + } + + if is_focused && config.cursorcolumn { + Self::highlight_cursorcolumn(doc, view, surface, theme, inner, &text_annotations); + } + // DAP: Highlight current stack frame position - let stack_frame = editor.debugger.as_ref().and_then(|debugger| { - if let (Some(frame), Some(thread_id)) = (debugger.active_frame, debugger.thread_id) { - debugger - .stack_frames - .get(&thread_id) - .and_then(|bt| bt.get(frame)) - } else { - None - } - }); - if let Some(frame) = stack_frame { + let dap_line = if let Some(frame) = editor.current_stack_frame() { if doc.path().is_some() && frame .source @@ -111,27 +109,27 @@ impl EditorView { == doc.path() { let line = frame.line - 1; // convert to 0-indexing - let style = theme.get("ui.highlight"); + let dap_current_style = theme.get("ui.debug.current"); let line_decoration = move |renderer: &mut TextRenderer, pos: LinePos| { if pos.doc_line != line { return; } - renderer - .surface - .set_style(Rect::new(area.x, pos.visual_line, area.width, 1), style); + + renderer.surface.set_style( + Rect::new(inner.x, inner.y + pos.visual_line, inner.width, 1), + dap_current_style, + ); }; + // This adds the line background. line_decorations.push(Box::new(line_decoration)); + Some(line) + } else { + None } - } - - if is_focused && config.cursorline { - line_decorations.push(Self::cursorline_decorator(doc, view, theme)) - } - - if is_focused && config.cursorcolumn { - Self::highlight_cursorcolumn(doc, view, surface, theme, inner, &text_annotations); - } + } else { + None + }; let mut highlights = Self::doc_syntax_highlights(doc, view.offset.anchor, inner.height, theme); @@ -155,6 +153,23 @@ impl EditorView { } let highlights: Box> = if is_focused { + // This ensures foreground, cursor and selections are highlighted properly for DAP. + let (highlights, dap_range): (Box>, Option) = + if let Some(dap_line) = dap_line { + let dap_current_index = theme.find_scope_index("ui.debug.current").expect( + "Could not find scope `ui.debug.current` or any suitable fallback in theme!", + ); + let text = doc.text(); + let dap_line_start = text.line_to_char(dap_line); + let dap_line_end = text.line_to_char(dap_line + 1); + let highlights = Box::new(syntax::merge( + highlights, + vec![(dap_current_index, dap_line_start..dap_line_end)], + )); + (highlights, Some(Range::new(dap_line_start, dap_line_end))) + } else { + (highlights, None) + }; let highlights = syntax::merge( highlights, Self::doc_selection_highlights( @@ -163,6 +178,7 @@ impl EditorView { view, theme, &config.cursor_shape, + &dap_range, ), ); let focused_view_elements = Self::highlight_focused_view_elements(view, doc, theme); @@ -406,6 +422,7 @@ impl EditorView { view: &View, theme: &Theme, cursor_shape_config: &CursorShapeConfig, + dap_range: &Option, ) -> Vec<(usize, std::ops::Range)> { let text = doc.text().slice(..); let selection = doc.selection(view.id); @@ -426,20 +443,18 @@ impl EditorView { let base_primary_cursor_scope = theme .find_scope_index("ui.cursor.primary") .unwrap_or(base_cursor_scope); + let dap_selection_scope = theme + .find_scope_index_exact("ui.debug.selection") + .unwrap_or(selection_scope); + let dap_cursor_scope = theme + .find_scope_index_exact("ui.debug.cursor") + .unwrap_or(base_cursor_scope); - let cursor_scope = match mode { - Mode::Insert => theme.find_scope_index_exact("ui.cursor.insert"), - Mode::Select => theme.find_scope_index_exact("ui.cursor.select"), - Mode::Normal => theme.find_scope_index_exact("ui.cursor.normal"), - } - .unwrap_or(base_cursor_scope); + let cursor_scope = mode.cursor_scope(theme).unwrap_or(base_cursor_scope); - let primary_cursor_scope = match mode { - Mode::Insert => theme.find_scope_index_exact("ui.cursor.primary.insert"), - Mode::Select => theme.find_scope_index_exact("ui.cursor.primary.select"), - Mode::Normal => theme.find_scope_index_exact("ui.cursor.primary.normal"), - } - .unwrap_or(base_primary_cursor_scope); + let primary_cursor_scope = mode + .primary_cursor_scope(theme) + .unwrap_or(base_primary_cursor_scope); let mut spans: Vec<(usize, std::ops::Range)> = Vec::new(); for (i, range) in selection.iter().enumerate() { @@ -474,16 +489,39 @@ impl EditorView { } else { cursor_start }; - spans.push((selection_scope, range.anchor..selection_end)); + + let sel_range = Range::new(range.anchor, selection_end); + if Self::is_range_inside_dap_range(dap_range, &sel_range) { + let dap_range = dap_range.unwrap(); + Self::set_dap_selection_highlights( + &mut spans, + selection_scope, + dap_selection_scope, + &dap_range, + &sel_range, + range.anchor, + selection_end, + ); + } else { + spans.push((selection_scope, range.anchor..selection_end)); + } + let cursor_range = Range::new(cursor_start, range.head); if !selection_is_primary || cursor_is_block { - spans.push((cursor_scope, cursor_start..range.head)); + if Self::is_range_inside_dap_range(dap_range, &cursor_range) { + let dap_range = dap_range.unwrap(); + Self::set_dap_cursor_highlights( + &mut spans, + dap_cursor_scope, + &dap_range, + &cursor_range, + ); + } else { + spans.push((cursor_scope, cursor_start..range.head)); + } } } else { // Reverse case. let cursor_end = next_grapheme_boundary(text, range.head); - if !selection_is_primary || cursor_is_block { - spans.push((cursor_scope, range.head..cursor_end)); - } // non block cursors look like they exclude the cursor let selection_start = if selection_is_primary && !cursor_is_block @@ -493,13 +531,99 @@ impl EditorView { } else { cursor_end }; - spans.push((selection_scope, selection_start..range.anchor)); + + let cursor_range = Range::new(range.head, cursor_end); + if !selection_is_primary || cursor_is_block { + if Self::is_range_inside_dap_range(dap_range, &cursor_range) { + let dap_range = dap_range.unwrap(); + Self::set_dap_cursor_highlights( + &mut spans, + dap_cursor_scope, + &dap_range, + &cursor_range, + ); + } else { + spans.push((cursor_scope, range.head..cursor_end)); + } + } + let sel_range = Range::new(selection_start, range.anchor); + if Self::is_range_inside_dap_range(dap_range, &sel_range) { + let dap_range = dap_range.unwrap(); + Self::set_dap_selection_highlights( + &mut spans, + selection_scope, + dap_selection_scope, + &dap_range, + &sel_range, + selection_start, + range.anchor, + ); + } else { + spans.push((selection_scope, selection_start..range.anchor)); + } } } spans } + #[inline] + pub fn is_range_inside_dap_range(dap_range: &Option, range: &Range) -> bool { + let dap_range = match dap_range { + Some(dap_range) => dap_range, + None => { + return false; + } + }; + + (range.anchor > dap_range.anchor || range.head > dap_range.anchor) + && (range.anchor < dap_range.head || range.head < dap_range.head) + } + + fn set_dap_selection_highlights( + spans: &mut Vec<(usize, std::ops::Range)>, + selection_scope: usize, + dap_selection_scope: usize, + dap_range: &Range, + sel_range: &Range, + original_start: usize, + original_end: usize, + ) { + let dap_sel_start = if dap_range.anchor > sel_range.anchor { + dap_range.anchor + } else { + sel_range.anchor + }; + let dap_sel_end = if dap_range.head < sel_range.head { + dap_range.head + } else { + sel_range.head + }; + + spans.push((selection_scope, original_start..dap_sel_start)); + spans.push((dap_selection_scope, dap_sel_start..dap_sel_end)); + spans.push((selection_scope, dap_sel_end..original_end)); + } + + fn set_dap_cursor_highlights( + spans: &mut Vec<(usize, std::ops::Range)>, + dap_cursor_scope: usize, + dap_range: &Range, + cursor_range: &Range, + ) { + let dap_cursor_start = if dap_range.anchor > cursor_range.anchor { + dap_range.anchor + } else { + cursor_range.anchor + }; + let dap_cursor_end = if dap_range.head < cursor_range.head { + dap_range.head + } else { + cursor_range.head + }; + spans.push((dap_cursor_scope, dap_cursor_start..dap_cursor_end)); + } + /// Render brace match, etc (meant for the focused view only) pub fn highlight_focused_view_elements( view: &View, diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 579c6725063bb..559355a17ab79 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -50,6 +50,24 @@ pub enum Mode { Insert = 2, } +impl Mode { + pub fn cursor_scope(&self, theme: &Theme) -> Option { + match self { + Mode::Insert => theme.find_scope_index_exact("ui.cursor.insert"), + Mode::Select => theme.find_scope_index_exact("ui.cursor.select"), + Mode::Normal => theme.find_scope_index_exact("ui.cursor.normal"), + } + } + + pub fn primary_cursor_scope(&self, theme: &Theme) -> Option { + match self { + Mode::Insert => theme.find_scope_index_exact("ui.primary.cursor.insert"), + Mode::Select => theme.find_scope_index_exact("ui.primary.cursor.select"), + Mode::Normal => theme.find_scope_index_exact("ui.primary.cursor.normal"), + } + } +} + impl Display for Mode { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 50da3ddeac2df..a9f582a363bb7 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -10,6 +10,7 @@ use crate::{ view::ViewPosition, Align, Document, DocumentId, View, ViewId, }; +use dap::StackFrame; use helix_vcs::DiffProviderRegistry; use futures_util::stream::select_all::SelectAll; @@ -1650,6 +1651,17 @@ impl Editor { doc.restore_cursor = false; } } + + pub fn current_stack_frame(&self) -> Option<&StackFrame> { + let debugger = match self.debugger.as_ref() { + Some(debugger) => debugger, + None => { + return None; + } + }; + + debugger.current_stack_frame() + } } fn try_restore_indent(doc: &mut Document, view: &mut View) { diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs index cb9e43336f409..46a600e525280 100644 --- a/helix-view/src/gutter.rs +++ b/helix-view/src/gutter.rs @@ -2,7 +2,7 @@ use std::fmt::Write; use crate::{ editor::GutterType, - graphics::{Color, Style, UnderlineStyle}, + graphics::{Style, UnderlineStyle}, Document, Editor, Theme, View, }; @@ -245,9 +245,9 @@ pub fn breakpoints<'doc>( theme: &Theme, _is_focused: bool, ) -> GutterFn<'doc> { - let warning = theme.get("warning"); let error = theme.get("error"); let info = theme.get("info"); + let breakpoint_style = theme.get("ui.debug.breakpoint"); let breakpoints = doc.path().and_then(|path| editor.breakpoints.get(path)); @@ -265,30 +265,58 @@ pub fn breakpoints<'doc>( .iter() .find(|breakpoint| breakpoint.line == line)?; - let mut style = if breakpoint.condition.is_some() && breakpoint.log_message.is_some() { + let style = if breakpoint.condition.is_some() && breakpoint.log_message.is_some() { error.underline_style(UnderlineStyle::Line) } else if breakpoint.condition.is_some() { error } else if breakpoint.log_message.is_some() { info } else { - warning + breakpoint_style }; - if !breakpoint.verified { - // Faded colors - style = if let Some(Color::Rgb(r, g, b)) = style.fg { - style.fg(Color::Rgb( - ((r as f32) * 0.4).floor() as u8, - ((g as f32) * 0.4).floor() as u8, - ((b as f32) * 0.4).floor() as u8, - )) - } else { - style.fg(Color::Gray) + let sym = if breakpoint.verified { "●" } else { "◯" }; + write!(out, "{}", sym).unwrap(); + Some(style) + }, + ) +} + +fn execution_pause_indicator<'doc>( + editor: &'doc Editor, + doc: &'doc Document, + theme: &Theme, + is_focused: bool, +) -> GutterFn<'doc> { + let mut style = theme.get("ui.debug.indicator"); + if style == Style::default() { + style = theme.get("ui.debug.breakpoint"); + } + + Box::new( + move |line: usize, _selected: bool, first_visual_line: bool, out: &mut String| { + if !first_visual_line || !is_focused { + return None; + } + + let current_stack_frame = match editor.current_stack_frame() { + Some(frame) => frame, + None => { + return None; } }; + if line != current_stack_frame.line - 1 + || doc.path().is_none() + || current_stack_frame + .source + .as_ref() + .and_then(|source| source.path.as_ref()) + != doc.path() + { + return None; + } - let sym = if breakpoint.verified { "▲" } else { "⊚" }; + let sym = "▶"; write!(out, "{}", sym).unwrap(); Some(style) }, @@ -304,9 +332,11 @@ pub fn diagnostics_or_breakpoints<'doc>( ) -> GutterFn<'doc> { let mut diagnostics = diagnostic(editor, doc, view, theme, is_focused); let mut breakpoints = breakpoints(editor, doc, view, theme, is_focused); + let mut execution_pause_indicator = execution_pause_indicator(editor, doc, theme, is_focused); Box::new(move |line, selected, first_visual_line: bool, out| { - breakpoints(line, selected, first_visual_line, out) + execution_pause_indicator(line, selected, first_visual_line, out) + .or_else(|| breakpoints(line, selected, first_visual_line, out)) .or_else(|| diagnostics(line, selected, first_visual_line, out)) }) } diff --git a/runtime/themes/acme.toml b/runtime/themes/acme.toml index e1d66ff8f2dae..cef0c56c66899 100644 --- a/runtime/themes/acme.toml +++ b/runtime/themes/acme.toml @@ -12,6 +12,9 @@ "ui.virtual.ruler" = { bg = "acme_bar_bg" } "ui.cursor.match" = {bg="acme_bar_bg"} "ui.cursor" = {bg="cursor", fg="white"} +"ui.debug.breakpoint" = {bg="acme_bg", fg="red"} +"ui.debug.current" = {bg="red", fg="white"} +"ui.debug.selection" = {bg="selected", fg="red"} "string" = "red" "comment" = "green" "ui.help" = {fg="black", bg="acme_bg"} diff --git a/runtime/themes/autumn.toml b/runtime/themes/autumn.toml index 5186031237037..177ff7a9b65dc 100644 --- a/runtime/themes/autumn.toml +++ b/runtime/themes/autumn.toml @@ -26,6 +26,10 @@ "ui.cursor.primary" = { fg = "my_white", modifiers = ["reversed"] } "ui.cursorline.primary" = { bg = "my_black" } "ui.cursorline.secondary" = { bg = "my_black" } +"ui.debug.current" = { fg = "my_gray3", bg = "my_yellow1" } +"ui.debug.cursor" = { fg = "my_white", bg = "my_gray5" } +"ui.debug.breakpoint" = { fg = "my_yellow1", bg = "my_gray0" } +"ui.debug.selection" = { fg = "my_yellow1", bg = "my_gray0" } "ui.text" = "my_white" "operator" = "my_white" "ui.text.focus" = "my_white" diff --git a/runtime/themes/ayu_dark.toml b/runtime/themes/ayu_dark.toml index 15ac09864a920..af6928e58ee34 100644 --- a/runtime/themes/ayu_dark.toml +++ b/runtime/themes/ayu_dark.toml @@ -60,6 +60,10 @@ "diagnostic.error"= { underline = { color = "red", style="curl"} } "ui.bufferline" = { fg = "gray", bg = "background" } "ui.bufferline.active" = { fg = "foreground", bg = "dark_gray" } +"ui.debug.breakpoint" = { fg = "orange", bg = "background" } +"ui.debug.current" = { fg = "background", bg = "orange" } +"ui.debug.cursor" = { fg = "background", bg = "magenta" } +"ui.debug.selection" = { fg = "foreground", bg = "dark_gray" } "special" = "orange" diff --git a/runtime/themes/ayu_light.toml b/runtime/themes/ayu_light.toml index 0b4dab1222ee8..501a923a135e2 100644 --- a/runtime/themes/ayu_light.toml +++ b/runtime/themes/ayu_light.toml @@ -60,6 +60,10 @@ "diagnostic.error"= { underline = { color = "red", style = "curl" } } "ui.bufferline" = { fg = "gray", bg = "background" } "ui.bufferline.active" = { fg = "foreground", bg = "dark_gray" } +"ui.debug.breakpoint" = { fg = "orange", bg = "background" } +"ui.debug.current" = { fg = "background", bg = "orange" } +"ui.debug.cursor" = { fg = "background", bg = "magenta" } +"ui.debug.selection" = { fg = "orange", bg = "dark_gray" } "special" = "orange" diff --git a/runtime/themes/ayu_mirage.toml b/runtime/themes/ayu_mirage.toml index fd142a77e62b0..a3743aaa7a87f 100644 --- a/runtime/themes/ayu_mirage.toml +++ b/runtime/themes/ayu_mirage.toml @@ -60,6 +60,10 @@ "diagnostic.error"= { underline = { color = "red", style = "curl" } } "ui.bufferline" = { fg = "gray", bg = "background" } "ui.bufferline.active" = { fg = "foreground", bg = "dark_gray" } +"ui.debug.breakpoint" = { fg = "orange", bg = "background" } +"ui.debug.current" = { fg = "background", bg = "orange" } +"ui.debug.cursor" = { fg = "background", bg = "magenta" } +"ui.debug.selection" = { fg = "foreground", bg = "dark_gray" } "special" = "orange" diff --git a/runtime/themes/dracula.toml b/runtime/themes/dracula.toml index 5146482490fab..0705fac88ad07 100644 --- a/runtime/themes/dracula.toml +++ b/runtime/themes/dracula.toml @@ -25,6 +25,9 @@ "ui.cursor.primary" = { fg = "background", bg = "cyan", modifiers = ["dim"] } "ui.cursorline.primary" = { bg = "background_dark" } "ui.help" = { fg = "foreground", bg = "background_dark" } +"ui.debug.breakpoint" = { fg = "red" } +"ui.debug.current" = { fg = "black", bg = "red" } +"ui.debug.selection" = { fg = "white", bg = "secondary_highlight" } "ui.linenr" = { fg = "comment" } "ui.linenr.selected" = { fg = "foreground" } "ui.menu" = { fg = "foreground", bg = "background_dark" } diff --git a/runtime/themes/dracula_at_night.toml b/runtime/themes/dracula_at_night.toml index 9f10ec90f378a..7df689d9b348e 100644 --- a/runtime/themes/dracula_at_night.toml +++ b/runtime/themes/dracula_at_night.toml @@ -25,6 +25,8 @@ "ui.cursor.match" = { fg = "green", modifiers = ["underlined"] } "ui.cursor.primary" = { fg = "background", bg = "cyan", modifiers = ["dim"] } "ui.help" = { fg = "foreground", bg = "background_dark" } +"ui.debug.breakpoint" = { fg = "red" } +"ui.debug.current" = { fg = "black", bg = "red" } "ui.linenr" = { fg = "comment" } "ui.linenr.selected" = { fg = "foreground" } "ui.menu" = { fg = "foreground", bg = "background_dark" } diff --git a/runtime/themes/onedark.toml b/runtime/themes/onedark.toml index 81ca046301916..6dd816b40ba38 100644 --- a/runtime/themes/onedark.toml +++ b/runtime/themes/onedark.toml @@ -78,6 +78,10 @@ "ui.text.focus" = { fg = "white", bg = "light-black", modifiers = ["bold"] } "ui.help" = { fg = "white", bg = "gray" } +"ui.debug.breakpoint" = { fg = "red" } +"ui.debug.current" = { fg = "black", bg = "red" } +"ui.debug.cursor" = { fg = "dark", bg = "white" } +"ui.debug.selection" = { fg = "red", bg = "faint-gray" } "ui.popup" = { bg = "gray" } "ui.window" = { fg = "gray" } "ui.menu" = { fg = "white", bg = "gray" } diff --git a/runtime/themes/onedarker.toml b/runtime/themes/onedarker.toml index 33f900cc0356d..9cfddbd14398c 100644 --- a/runtime/themes/onedarker.toml +++ b/runtime/themes/onedarker.toml @@ -78,6 +78,8 @@ "ui.text.focus" = { fg = "white", bg = "light-black", modifiers = ["bold"] } "ui.help" = { fg = "white", bg = "gray" } +"ui.debug.breakpoint" = { fg = "red" } +"ui.debug.current" = { fg = "black", bg = "red" } "ui.popup" = { bg = "gray" } "ui.window" = { fg = "gray" } "ui.menu" = { fg = "white", bg = "gray" } diff --git a/theme.toml b/theme.toml index b67eaecc35733..f410584a43d9d 100644 --- a/theme.toml +++ b/theme.toml @@ -68,7 +68,10 @@ label = "honey" "ui.cursor.match" = { fg = "#212121", bg = "#6C6999" } "ui.cursor" = { modifiers = ["reversed"] } "ui.cursorline.primary" = { bg = "bossanova" } -"ui.highlight" = { bg = "bossanova" } +"ui.debug.breakpoint" = { fg = "apricot" } +"ui.debug.current" = { fg = "bossanova", bg = "lilac" } +"ui.debug.indicator" = { fg = "lilac" } +"ui.debug.selection" = { fg = "lilac", bg = "revolver" } "ui.menu" = { fg = "lavender", bg = "revolver" } "ui.menu.selected" = { fg = "revolver", bg = "white" }