init.lua 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. -- doom-modeline.lua
  2. -- ============================================================================
  3. -- Doom Emacs-inspired modeline styling and configuration.
  4. -- Provides enhanced visual styling for the modeline.
  5. -- ============================================================================
  6. local doom_modeline = {}
  7. -- Configuration options
  8. doom_modeline.config = {
  9. height = 1, -- Number of lines (currently fixed to 1)
  10. bar_width = 4, -- Width of the colored bar indicator
  11. icon_type = "unicode", -- "unicode" or "ascii" (unicode uses special chars)
  12. show_major_mode_icon = true, -- Show icon for major mode
  13. show_buffer_encoding = false, -- Show buffer encoding
  14. show_word_count = false, -- Show word count for text modes
  15. }
  16. -- Unicode icons for various states (fallback to ASCII if not supported)
  17. doom_modeline.icons = {
  18. modified = "●", -- Buffer modified
  19. readonly = "", -- Read-only
  20. saved = "✓", -- Just saved
  21. lock = "🔒", -- Locked
  22. -- Major mode icons
  23. lua = "☾",
  24. python = "🐍",
  25. c = "C",
  26. cpp = "C++",
  27. javascript = "JS",
  28. typescript = "TS",
  29. rust = "🦀",
  30. go = "Go",
  31. fundamental = "F",
  32. -- Status indicators
  33. error = "✗",
  34. warning = "⚠",
  35. info = "ℹ",
  36. -- Git icons (for future use)
  37. git_branch = "",
  38. git_added = "+",
  39. git_modified = "~",
  40. git_removed = "-",
  41. }
  42. -- ASCII fallbacks
  43. doom_modeline.icons_ascii = {
  44. modified = "*",
  45. readonly = "%%",
  46. saved = "-",
  47. lock = "#",
  48. lua = "Lua",
  49. python = "Py",
  50. c = "C",
  51. cpp = "C++",
  52. javascript = "JS",
  53. typescript = "TS",
  54. rust = "Rs",
  55. go = "Go",
  56. fundamental = "F",
  57. error = "!",
  58. warning = "?",
  59. info = "i",
  60. git_branch = "@",
  61. git_added = "+",
  62. git_modified = "~",
  63. git_removed = "-",
  64. }
  65. -- Get icon based on configuration
  66. function doom_modeline.get_icon(name)
  67. if doom_modeline.config.icon_type == "ascii" then
  68. return doom_modeline.icons_ascii[name] or name
  69. end
  70. return doom_modeline.icons[name] or doom_modeline.icons_ascii[name] or name
  71. end
  72. -- Define doom-modeline faces
  73. function doom_modeline.setup_faces()
  74. -- Main modeline face (active window)
  75. lumacs.set_face("doom-modeline", {
  76. foreground = "#bbc2cf",
  77. background = "#21242b",
  78. })
  79. -- Inactive modeline
  80. lumacs.set_face("doom-modeline-inactive", {
  81. foreground = "#5B6268",
  82. background = "#1c1f24",
  83. })
  84. -- Buffer name (emphasized)
  85. lumacs.set_face("doom-modeline-buffer-file", {
  86. foreground = "#51afef",
  87. weight = "bold",
  88. })
  89. -- Modified indicator
  90. lumacs.set_face("doom-modeline-buffer-modified", {
  91. foreground = "#da8548",
  92. weight = "bold",
  93. })
  94. -- Major mode
  95. lumacs.set_face("doom-modeline-buffer-major-mode", {
  96. foreground = "#51afef",
  97. weight = "bold",
  98. })
  99. -- Minor modes
  100. lumacs.set_face("doom-modeline-buffer-minor-mode", {
  101. foreground = "#98be65",
  102. })
  103. -- Position info
  104. lumacs.set_face("doom-modeline-buffer-position", {
  105. foreground = "#bbc2cf",
  106. })
  107. -- Error indicator (for flycheck-like features)
  108. lumacs.set_face("doom-modeline-error", {
  109. foreground = "#ff6c6b",
  110. weight = "bold",
  111. })
  112. -- Warning indicator
  113. lumacs.set_face("doom-modeline-warning", {
  114. foreground = "#ECBE7B",
  115. weight = "bold",
  116. })
  117. -- Info indicator
  118. lumacs.set_face("doom-modeline-info", {
  119. foreground = "#98be65",
  120. })
  121. -- Project/workspace
  122. lumacs.set_face("doom-modeline-project", {
  123. foreground = "#c678dd",
  124. weight = "bold",
  125. })
  126. -- Bar segment (the colored vertical bar)
  127. lumacs.set_face("doom-modeline-bar", {
  128. background = "#51afef",
  129. })
  130. lumacs.set_face("doom-modeline-bar-inactive", {
  131. background = "#3f444a",
  132. })
  133. -- Evil/modal state faces (for future modal editing support)
  134. lumacs.set_face("doom-modeline-evil-normal", {
  135. foreground = "#21242b",
  136. background = "#51afef",
  137. weight = "bold",
  138. })
  139. lumacs.set_face("doom-modeline-evil-insert", {
  140. foreground = "#21242b",
  141. background = "#98be65",
  142. weight = "bold",
  143. })
  144. lumacs.set_face("doom-modeline-evil-visual", {
  145. foreground = "#21242b",
  146. background = "#c678dd",
  147. weight = "bold",
  148. })
  149. lumacs.set_face("doom-modeline-evil-emacs", {
  150. foreground = "#21242b",
  151. background = "#c678dd",
  152. weight = "bold",
  153. })
  154. end
  155. -- Apply doom-modeline styling to standard modeline faces
  156. function doom_modeline.apply_theme()
  157. -- Apply doom styling to the standard mode-line faces
  158. lumacs.set_face("mode-line", {
  159. foreground = "#bbc2cf",
  160. background = "#21242b",
  161. })
  162. lumacs.set_face("mode-line-inactive", {
  163. foreground = "#5B6268",
  164. background = "#1c1f24",
  165. })
  166. lumacs.set_face("mode-line-buffer-id", {
  167. foreground = "#51afef",
  168. weight = "bold",
  169. })
  170. end
  171. -- Color presets that can be applied
  172. doom_modeline.presets = {
  173. doom_one = {
  174. bar = "#51afef",
  175. bar_inactive = "#3f444a",
  176. buffer = "#51afef",
  177. modified = "#da8548",
  178. mode = "#c678dd",
  179. position = "#bbc2cf",
  180. background = "#21242b",
  181. foreground = "#bbc2cf",
  182. },
  183. nord = {
  184. bar = "#88c0d0",
  185. bar_inactive = "#3b4252",
  186. buffer = "#88c0d0",
  187. modified = "#ebcb8b",
  188. mode = "#b48ead",
  189. position = "#d8dee9",
  190. background = "#2e3440",
  191. foreground = "#d8dee9",
  192. },
  193. dracula = {
  194. bar = "#bd93f9",
  195. bar_inactive = "#44475a",
  196. buffer = "#ff79c6",
  197. modified = "#ffb86c",
  198. mode = "#bd93f9",
  199. position = "#f8f8f2",
  200. background = "#282a36",
  201. foreground = "#f8f8f2",
  202. },
  203. gruvbox = {
  204. bar = "#83a598",
  205. bar_inactive = "#3c3836",
  206. buffer = "#83a598",
  207. modified = "#fe8019",
  208. mode = "#d3869b",
  209. position = "#ebdbb2",
  210. background = "#282828",
  211. foreground = "#ebdbb2",
  212. },
  213. solarized = {
  214. bar = "#268bd2",
  215. bar_inactive = "#073642",
  216. buffer = "#268bd2",
  217. modified = "#cb4b16",
  218. mode = "#6c71c4",
  219. position = "#839496",
  220. background = "#002b36",
  221. foreground = "#839496",
  222. },
  223. }
  224. -- Apply a preset color scheme
  225. function doom_modeline.set_preset(preset_name)
  226. local preset = doom_modeline.presets[preset_name]
  227. if not preset then
  228. editor:message("Unknown preset: " .. preset_name, "warning")
  229. return
  230. end
  231. lumacs.set_face("mode-line", {
  232. foreground = preset.foreground,
  233. background = preset.background,
  234. })
  235. lumacs.set_face("mode-line-inactive", {
  236. foreground = preset.foreground,
  237. background = preset.bar_inactive,
  238. })
  239. lumacs.set_face("mode-line-buffer-id", {
  240. foreground = preset.buffer,
  241. weight = "bold",
  242. })
  243. lumacs.set_face("doom-modeline-buffer-modified", {
  244. foreground = preset.modified,
  245. weight = "bold",
  246. })
  247. lumacs.set_face("doom-modeline-buffer-major-mode", {
  248. foreground = preset.mode,
  249. weight = "bold",
  250. })
  251. lumacs.set_face("doom-modeline-buffer-position", {
  252. foreground = preset.position,
  253. })
  254. lumacs.set_face("doom-modeline-bar", {
  255. background = preset.bar,
  256. })
  257. lumacs.set_face("doom-modeline-bar-inactive", {
  258. background = preset.bar_inactive,
  259. })
  260. editor:message("Applied doom-modeline preset: " .. preset_name)
  261. end
  262. -- Register commands
  263. editor:register_command("doom-modeline-preset", "Set doom-modeline color preset", function(args)
  264. if #args == 0 then
  265. local presets = {}
  266. for name, _ in pairs(doom_modeline.presets) do
  267. table.insert(presets, name)
  268. end
  269. table.sort(presets)
  270. return {success = false, message = "Available presets: " .. table.concat(presets, ", ")}
  271. end
  272. doom_modeline.set_preset(args[1])
  273. return {success = true}
  274. end, {"dm-preset"}, true, "s")
  275. -- Setup command to apply all doom-modeline styling
  276. editor:register_command("doom-modeline-setup", "Enable doom-modeline styling", function(args)
  277. doom_modeline.setup_faces()
  278. doom_modeline.apply_theme()
  279. editor:message("Doom modeline styling applied")
  280. return {success = true}
  281. end, {"dm-setup"})
  282. -- Toggle ASCII/Unicode mode
  283. editor:register_command("doom-modeline-icons", "Toggle doom-modeline icon style", function(args)
  284. if #args > 0 then
  285. doom_modeline.config.icon_type = args[1]
  286. else
  287. if doom_modeline.config.icon_type == "unicode" then
  288. doom_modeline.config.icon_type = "ascii"
  289. else
  290. doom_modeline.config.icon_type = "unicode"
  291. end
  292. end
  293. editor:message("Icon type: " .. doom_modeline.config.icon_type)
  294. return {success = true}
  295. end, {"dm-icons"}, true, "s")
  296. -- Store in lumacs namespace
  297. lumacs.doom_modeline = doom_modeline
  298. print("[doom-modeline] Package loaded")
  299. return doom_modeline