Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-config/src/definition/ui.rs')
-rw-r--r--helix-config/src/definition/ui.rs291
1 files changed, 291 insertions, 0 deletions
diff --git a/helix-config/src/definition/ui.rs b/helix-config/src/definition/ui.rs
new file mode 100644
index 00000000..378d4e05
--- /dev/null
+++ b/helix-config/src/definition/ui.rs
@@ -0,0 +1,291 @@
+use serde::{Deserialize, Serialize};
+
+use crate::*;
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum StatusLineElement {
+ /// The editor mode (Normal, Insert, Visual/Selection)
+ Mode,
+ /// The LSP activity spinner
+ Spinner,
+ /// The file basename (the leaf of the open file's path)
+ FileBaseName,
+ /// The relative file path
+ FileName,
+ // The file modification indicator
+ FileModificationIndicator,
+ /// An indicator that shows `"[readonly]"` when a file cannot be written
+ ReadOnlyIndicator,
+ /// The file encoding
+ FileEncoding,
+ /// The file line endings (CRLF or LF)
+ FileLineEnding,
+ /// The file type (language ID or "text")
+ FileType,
+ /// A summary of the number of errors and warnings
+ Diagnostics,
+ /// A summary of the number of errors and warnings on file and workspace
+ WorkspaceDiagnostics,
+ /// The number of selections (cursors)
+ Selections,
+ /// The number of characters currently in primary selection
+ PrimarySelectionLength,
+ /// The cursor position
+ Position,
+ /// The separator string
+ Separator,
+ /// The cursor position as a percent of the total file
+ PositionPercentage,
+ /// The total line numbers of the current file
+ TotalLineNumbers,
+ /// A single space
+ Spacer,
+ /// Current version control information
+ VersionControl,
+ /// Indicator for selected register
+ Register,
+}
+
+config_serde_adapter!(StatusLineElement);
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
+#[serde(rename_all = "lowercase")]
+/// UNSTABLE
+pub enum CursorKind {
+ /// █
+ Block,
+ /// |
+ Bar,
+ /// _
+ Underline,
+ /// Hidden cursor, can set cursor position with this to let IME have correct cursor position.
+ Hidden,
+}
+
+impl Default for CursorKind {
+ fn default() -> Self {
+ Self::Block
+ }
+}
+
+config_serde_adapter!(CursorKind);
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum WhitespaceRenderValue {
+ None,
+ // TODO
+ // Selection,
+ All,
+}
+
+config_serde_adapter!(WhitespaceRenderValue);
+
+/// bufferline render modes
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum BufferLine {
+ /// Don't render bufferline
+ Never,
+ /// Always render
+ Always,
+ /// Only if multiple buffers are open
+ Multiple,
+}
+
+config_serde_adapter!(BufferLine);
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum PopupBorderConfig {
+ None,
+ All,
+ Popup,
+ Menu,
+}
+
+config_serde_adapter!(PopupBorderConfig);
+
+options! {
+ struct UiConfig {
+ /// Whether to display info boxes
+ #[read = copy]
+ auto_info: bool = true,
+ /// Renders a line at the top of the editor displaying open buffers.
+ /// Can be `always`, `never` or `multiple` (only shown if more than one
+ /// buffer is in use)
+ #[read = copy]
+ bufferline: BufferLine = BufferLine::Never,
+ /// Highlight all lines with a cursor
+ #[read = copy]
+ cursorline: bool = false,
+ /// Highlight all columns with a cursor
+ #[read = copy]
+ cursorcolumn: bool = false,
+ /// List of column positions at which to display the rulers.
+ #[read = deref]
+ rulers: List<u16> = List::default(),
+ /// Whether to color the mode indicator with different colors depending on the mode itself
+ #[read = copy]
+ popup_border: bool = false,
+ /// Whether to color the mode indicator with different colors depending on the mode itself
+ #[read = copy]
+ color_modes: bool = false,
+ }
+
+ struct WhiteSpaceRenderConfig {
+ #[name = "whitespace.characters.space"]
+ #[read = copy]
+ space_char: char = '·', // U+00B7
+ #[name = "whitespace.characters.nbsp"]
+ #[read = copy]
+ nbsp_char: char = '⍽', // U+237D
+ #[name = "whitespace.characters.tab"]
+ #[read = copy]
+ tab_char: char = '→', // U+2192
+ #[name = "whitespace.characters.tabpad"]
+ #[read = copy]
+ tabpad_char: char = '⏎', // U+23CE
+ #[name = "whitespace.characters.newline"]
+ #[read = copy]
+ newline_char: char = ' ',
+ #[name = "whitespace.render.default"]
+ #[read = copy]
+ render: WhitespaceRenderValue = WhitespaceRenderValue::None,
+ #[name = "whitespace.render.space"]
+ #[read = copy]
+ render_space: Option<WhitespaceRenderValue> = None,
+ #[name = "whitespace.render.nbsp"]
+ #[read = copy]
+ render_nbsp: Option<WhitespaceRenderValue> = None,
+ #[name = "whitespace.render.tab"]
+ #[read = copy]
+ render_tab: Option<WhitespaceRenderValue> = None,
+ #[name = "whitespace.render.newline"]
+ #[read = copy]
+ render_newline: Option<WhitespaceRenderValue> = None,
+ }
+
+ struct TerminfoConfig {
+ /// Set to `true` to override automatic detection of terminal truecolor
+ /// support in the event of a false negative
+ #[name = "true-color"]
+ #[read = copy]
+ force_true_color: bool = false,
+ /// Set to `true` to override automatic detection of terminal undercurl
+ /// support in the event of a false negative
+ #[name = "undercurl"]
+ #[read = copy]
+ force_undercurl: bool = false,
+ }
+
+ struct IndentGuidesConfig {
+ /// Whether to render indent guides
+ #[read = copy]
+ render: bool = false,
+ /// Character to use for rendering indent guides
+ #[read = copy]
+ character: char = '│',
+ /// Number of indent levels to skip
+ #[read = copy]
+ skip_levels: u8 = 0,
+ }
+
+ struct CursorShapeConfig {
+ /// Cursor shape in normal mode
+ #[name = "cursor-shape.normal"]
+ #[read = copy]
+ normal_mode_cursor: CursorKind = CursorKind::Block,
+ /// Cursor shape in select mode
+ #[name = "cursor-shape.select"]
+ #[read = copy]
+ select_mode_cursor: CursorKind = CursorKind::Block,
+ /// Cursor shape in insert mode
+ #[name = "cursor-shape.insert"]
+ #[read = copy]
+ insert_mode_cursor: CursorKind = CursorKind::Block,
+ }
+
+ struct FilePickerConfig {
+ /// Whether to exclude hidden files from any file pickers.
+ #[name = "file-picker.hidden"]
+ #[read = copy]
+ hidden: bool = true,
+ /// Follow symlinks instead of ignoring them
+ #[name = "file-picker.follow-symlinks"]
+ #[read = copy]
+ follow_symlinks: bool = true,
+ /// Ignore symlinks that point at files already shown in the picker
+ #[name = "file-picker.deduplicate-links"]
+ #[read = copy]
+ deduplicate_links: bool = true,
+ /// Enables reading ignore files from parent directories.
+ #[name = "file-picker.parents"]
+ #[read = copy]
+ parents: bool = true,
+ /// Enables reading `.ignore` files.
+ #[name = "file-picker.ignore"]
+ #[read = copy]
+ ignore: bool = true,
+ /// Enables reading `.gitignore` files.
+ #[name = "file-picker.git-ignore"]
+ #[read = copy]
+ git_ignore: bool = true,
+ /// Enables reading global .gitignore, whose path is specified in git's config: `core.excludefile` option.
+ #[name = "file-picker.git-global"]
+ #[read = copy]
+ git_global: bool = true,
+ /// Enables reading `.git/info/exclude` files.
+ #[name = "file-picker.git-exclude"]
+ #[read = copy]
+ git_exclude: bool = true,
+ /// Maximum Depth to recurse directories in file picker and global search.
+ #[name = "file-picker.max-depth"]
+ #[read = copy]
+ max_depth: Option<usize> = None,
+ }
+
+ struct StatusLineConfig{
+ /// A list of elements aligned to the left of the statusline
+ #[name = "statusline.left"]
+ #[read = deref]
+ left: List<StatusLineElement> = &[
+ StatusLineElement::Mode,
+ StatusLineElement::Spinner,
+ StatusLineElement::FileName,
+ StatusLineElement::ReadOnlyIndicator,
+ StatusLineElement::FileModificationIndicator,
+ ],
+ /// A list of elements aligned to the middle of the statusline
+ #[name = "statusline.center"]
+ #[read = deref]
+ center: List<StatusLineElement> = List::default(),
+ /// A list of elements aligned to the right of the statusline
+ #[name = "statusline.right"]
+ #[read = deref]
+ right: List<StatusLineElement> = &[
+ StatusLineElement::Diagnostics,
+ StatusLineElement::Selections,
+ StatusLineElement::Register,
+ StatusLineElement::Position,
+ StatusLineElement::FileEncoding,
+ ],
+ /// The character used to separate elements in the statusline
+ #[name = "statusline.seperator"]
+ #[read = deref]
+ seperator: String = "│",
+ /// The text shown in the `mode` element for normal mode
+ #[name = "statusline.mode.normal"]
+ #[read = deref]
+ mode_indicator_normal: String = "NOR",
+ /// The text shown in the `mode` element for insert mode
+ #[name = "statusline.mode.insert"]
+ #[read = deref]
+ mode_indicator_insert: String = "INS",
+ /// The text shown in the `mode` element for select mode
+ #[name = "statusline.mode.select"]
+ #[read = deref]
+ mode_indicator_select: String = "SEL",
+ }
+}