|
|
@@ -0,0 +1,350 @@
|
|
|
+-- doom-modeline.lua
|
|
|
+-- ============================================================================
|
|
|
+-- Doom Emacs-inspired modeline styling and configuration.
|
|
|
+-- Provides enhanced visual styling for the modeline.
|
|
|
+-- ============================================================================
|
|
|
+
|
|
|
+local doom_modeline = {}
|
|
|
+
|
|
|
+-- Configuration options
|
|
|
+doom_modeline.config = {
|
|
|
+ height = 1, -- Number of lines (currently fixed to 1)
|
|
|
+ bar_width = 4, -- Width of the colored bar indicator
|
|
|
+ icon_type = "unicode", -- "unicode" or "ascii" (unicode uses special chars)
|
|
|
+ show_major_mode_icon = true, -- Show icon for major mode
|
|
|
+ show_buffer_encoding = false, -- Show buffer encoding
|
|
|
+ show_word_count = false, -- Show word count for text modes
|
|
|
+}
|
|
|
+
|
|
|
+-- Unicode icons for various states (fallback to ASCII if not supported)
|
|
|
+doom_modeline.icons = {
|
|
|
+ modified = "●", -- Buffer modified
|
|
|
+ readonly = "", -- Read-only
|
|
|
+ saved = "✓", -- Just saved
|
|
|
+ lock = "🔒", -- Locked
|
|
|
+
|
|
|
+ -- Major mode icons
|
|
|
+ lua = "☾",
|
|
|
+ python = "🐍",
|
|
|
+ c = "C",
|
|
|
+ cpp = "C++",
|
|
|
+ javascript = "JS",
|
|
|
+ typescript = "TS",
|
|
|
+ rust = "🦀",
|
|
|
+ go = "Go",
|
|
|
+ fundamental = "F",
|
|
|
+
|
|
|
+ -- Status indicators
|
|
|
+ error = "✗",
|
|
|
+ warning = "⚠",
|
|
|
+ info = "ℹ",
|
|
|
+
|
|
|
+ -- Git icons (for future use)
|
|
|
+ git_branch = "",
|
|
|
+ git_added = "+",
|
|
|
+ git_modified = "~",
|
|
|
+ git_removed = "-",
|
|
|
+}
|
|
|
+
|
|
|
+-- ASCII fallbacks
|
|
|
+doom_modeline.icons_ascii = {
|
|
|
+ modified = "*",
|
|
|
+ readonly = "%%",
|
|
|
+ saved = "-",
|
|
|
+ lock = "#",
|
|
|
+
|
|
|
+ lua = "Lua",
|
|
|
+ python = "Py",
|
|
|
+ c = "C",
|
|
|
+ cpp = "C++",
|
|
|
+ javascript = "JS",
|
|
|
+ typescript = "TS",
|
|
|
+ rust = "Rs",
|
|
|
+ go = "Go",
|
|
|
+ fundamental = "F",
|
|
|
+
|
|
|
+ error = "!",
|
|
|
+ warning = "?",
|
|
|
+ info = "i",
|
|
|
+
|
|
|
+ git_branch = "@",
|
|
|
+ git_added = "+",
|
|
|
+ git_modified = "~",
|
|
|
+ git_removed = "-",
|
|
|
+}
|
|
|
+
|
|
|
+-- Get icon based on configuration
|
|
|
+function doom_modeline.get_icon(name)
|
|
|
+ if doom_modeline.config.icon_type == "ascii" then
|
|
|
+ return doom_modeline.icons_ascii[name] or name
|
|
|
+ end
|
|
|
+ return doom_modeline.icons[name] or doom_modeline.icons_ascii[name] or name
|
|
|
+end
|
|
|
+
|
|
|
+-- Define doom-modeline faces
|
|
|
+function doom_modeline.setup_faces()
|
|
|
+ -- Main modeline face (active window)
|
|
|
+ lumacs.set_face("doom-modeline", {
|
|
|
+ foreground = "#bbc2cf",
|
|
|
+ background = "#21242b",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Inactive modeline
|
|
|
+ lumacs.set_face("doom-modeline-inactive", {
|
|
|
+ foreground = "#5B6268",
|
|
|
+ background = "#1c1f24",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Buffer name (emphasized)
|
|
|
+ lumacs.set_face("doom-modeline-buffer-file", {
|
|
|
+ foreground = "#51afef",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Modified indicator
|
|
|
+ lumacs.set_face("doom-modeline-buffer-modified", {
|
|
|
+ foreground = "#da8548",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Major mode
|
|
|
+ lumacs.set_face("doom-modeline-buffer-major-mode", {
|
|
|
+ foreground = "#51afef",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Minor modes
|
|
|
+ lumacs.set_face("doom-modeline-buffer-minor-mode", {
|
|
|
+ foreground = "#98be65",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Position info
|
|
|
+ lumacs.set_face("doom-modeline-buffer-position", {
|
|
|
+ foreground = "#bbc2cf",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Error indicator (for flycheck-like features)
|
|
|
+ lumacs.set_face("doom-modeline-error", {
|
|
|
+ foreground = "#ff6c6b",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Warning indicator
|
|
|
+ lumacs.set_face("doom-modeline-warning", {
|
|
|
+ foreground = "#ECBE7B",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Info indicator
|
|
|
+ lumacs.set_face("doom-modeline-info", {
|
|
|
+ foreground = "#98be65",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Project/workspace
|
|
|
+ lumacs.set_face("doom-modeline-project", {
|
|
|
+ foreground = "#c678dd",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Bar segment (the colored vertical bar)
|
|
|
+ lumacs.set_face("doom-modeline-bar", {
|
|
|
+ background = "#51afef",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-bar-inactive", {
|
|
|
+ background = "#3f444a",
|
|
|
+ })
|
|
|
+
|
|
|
+ -- Evil/modal state faces (for future modal editing support)
|
|
|
+ lumacs.set_face("doom-modeline-evil-normal", {
|
|
|
+ foreground = "#21242b",
|
|
|
+ background = "#51afef",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-evil-insert", {
|
|
|
+ foreground = "#21242b",
|
|
|
+ background = "#98be65",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-evil-visual", {
|
|
|
+ foreground = "#21242b",
|
|
|
+ background = "#c678dd",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-evil-emacs", {
|
|
|
+ foreground = "#21242b",
|
|
|
+ background = "#c678dd",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+end
|
|
|
+
|
|
|
+-- Apply doom-modeline styling to standard modeline faces
|
|
|
+function doom_modeline.apply_theme()
|
|
|
+ -- Apply doom styling to the standard mode-line faces
|
|
|
+ lumacs.set_face("mode-line", {
|
|
|
+ foreground = "#bbc2cf",
|
|
|
+ background = "#21242b",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("mode-line-inactive", {
|
|
|
+ foreground = "#5B6268",
|
|
|
+ background = "#1c1f24",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("mode-line-buffer-id", {
|
|
|
+ foreground = "#51afef",
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+end
|
|
|
+
|
|
|
+-- Color presets that can be applied
|
|
|
+doom_modeline.presets = {
|
|
|
+ doom_one = {
|
|
|
+ bar = "#51afef",
|
|
|
+ bar_inactive = "#3f444a",
|
|
|
+ buffer = "#51afef",
|
|
|
+ modified = "#da8548",
|
|
|
+ mode = "#c678dd",
|
|
|
+ position = "#bbc2cf",
|
|
|
+ background = "#21242b",
|
|
|
+ foreground = "#bbc2cf",
|
|
|
+ },
|
|
|
+
|
|
|
+ nord = {
|
|
|
+ bar = "#88c0d0",
|
|
|
+ bar_inactive = "#3b4252",
|
|
|
+ buffer = "#88c0d0",
|
|
|
+ modified = "#ebcb8b",
|
|
|
+ mode = "#b48ead",
|
|
|
+ position = "#d8dee9",
|
|
|
+ background = "#2e3440",
|
|
|
+ foreground = "#d8dee9",
|
|
|
+ },
|
|
|
+
|
|
|
+ dracula = {
|
|
|
+ bar = "#bd93f9",
|
|
|
+ bar_inactive = "#44475a",
|
|
|
+ buffer = "#ff79c6",
|
|
|
+ modified = "#ffb86c",
|
|
|
+ mode = "#bd93f9",
|
|
|
+ position = "#f8f8f2",
|
|
|
+ background = "#282a36",
|
|
|
+ foreground = "#f8f8f2",
|
|
|
+ },
|
|
|
+
|
|
|
+ gruvbox = {
|
|
|
+ bar = "#83a598",
|
|
|
+ bar_inactive = "#3c3836",
|
|
|
+ buffer = "#83a598",
|
|
|
+ modified = "#fe8019",
|
|
|
+ mode = "#d3869b",
|
|
|
+ position = "#ebdbb2",
|
|
|
+ background = "#282828",
|
|
|
+ foreground = "#ebdbb2",
|
|
|
+ },
|
|
|
+
|
|
|
+ solarized = {
|
|
|
+ bar = "#268bd2",
|
|
|
+ bar_inactive = "#073642",
|
|
|
+ buffer = "#268bd2",
|
|
|
+ modified = "#cb4b16",
|
|
|
+ mode = "#6c71c4",
|
|
|
+ position = "#839496",
|
|
|
+ background = "#002b36",
|
|
|
+ foreground = "#839496",
|
|
|
+ },
|
|
|
+}
|
|
|
+
|
|
|
+-- Apply a preset color scheme
|
|
|
+function doom_modeline.set_preset(preset_name)
|
|
|
+ local preset = doom_modeline.presets[preset_name]
|
|
|
+ if not preset then
|
|
|
+ editor:message("Unknown preset: " .. preset_name, "warning")
|
|
|
+ return
|
|
|
+ end
|
|
|
+
|
|
|
+ lumacs.set_face("mode-line", {
|
|
|
+ foreground = preset.foreground,
|
|
|
+ background = preset.background,
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("mode-line-inactive", {
|
|
|
+ foreground = preset.foreground,
|
|
|
+ background = preset.bar_inactive,
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("mode-line-buffer-id", {
|
|
|
+ foreground = preset.buffer,
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-buffer-modified", {
|
|
|
+ foreground = preset.modified,
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-buffer-major-mode", {
|
|
|
+ foreground = preset.mode,
|
|
|
+ weight = "bold",
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-buffer-position", {
|
|
|
+ foreground = preset.position,
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-bar", {
|
|
|
+ background = preset.bar,
|
|
|
+ })
|
|
|
+
|
|
|
+ lumacs.set_face("doom-modeline-bar-inactive", {
|
|
|
+ background = preset.bar_inactive,
|
|
|
+ })
|
|
|
+
|
|
|
+ editor:message("Applied doom-modeline preset: " .. preset_name)
|
|
|
+end
|
|
|
+
|
|
|
+-- Register commands
|
|
|
+editor:register_command("doom-modeline-preset", "Set doom-modeline color preset", function(args)
|
|
|
+ if #args == 0 then
|
|
|
+ local presets = {}
|
|
|
+ for name, _ in pairs(doom_modeline.presets) do
|
|
|
+ table.insert(presets, name)
|
|
|
+ end
|
|
|
+ table.sort(presets)
|
|
|
+ return {success = false, message = "Available presets: " .. table.concat(presets, ", ")}
|
|
|
+ end
|
|
|
+
|
|
|
+ doom_modeline.set_preset(args[1])
|
|
|
+ return {success = true}
|
|
|
+end, {"dm-preset"}, true, "s")
|
|
|
+
|
|
|
+-- Setup command to apply all doom-modeline styling
|
|
|
+editor:register_command("doom-modeline-setup", "Enable doom-modeline styling", function(args)
|
|
|
+ doom_modeline.setup_faces()
|
|
|
+ doom_modeline.apply_theme()
|
|
|
+ editor:message("Doom modeline styling applied")
|
|
|
+ return {success = true}
|
|
|
+end, {"dm-setup"})
|
|
|
+
|
|
|
+-- Toggle ASCII/Unicode mode
|
|
|
+editor:register_command("doom-modeline-icons", "Toggle doom-modeline icon style", function(args)
|
|
|
+ if #args > 0 then
|
|
|
+ doom_modeline.config.icon_type = args[1]
|
|
|
+ else
|
|
|
+ if doom_modeline.config.icon_type == "unicode" then
|
|
|
+ doom_modeline.config.icon_type = "ascii"
|
|
|
+ else
|
|
|
+ doom_modeline.config.icon_type = "unicode"
|
|
|
+ end
|
|
|
+ end
|
|
|
+ editor:message("Icon type: " .. doom_modeline.config.icon_type)
|
|
|
+ return {success = true}
|
|
|
+end, {"dm-icons"}, true, "s")
|
|
|
+
|
|
|
+-- Store in lumacs namespace
|
|
|
+lumacs.doom_modeline = doom_modeline
|
|
|
+
|
|
|
+return doom_modeline
|