Kaynağa Gözat

fix(log): don't rely on lvim.builtin.notify.active (#1831)

kylo252 3 yıl önce
ebeveyn
işleme
0ea08c7a1c
3 değiştirilmiş dosya ile 39 ekleme ve 38 silme
  1. 2 2
      lua/lvim/config/defaults.lua
  2. 16 29
      lua/lvim/core/log.lua
  3. 21 7
      lua/lvim/core/notify.lua

+ 2 - 2
lua/lvim/config/defaults.lua

@@ -28,7 +28,7 @@ return {
         float_opts = {},
       },
     },
-    ---@usage set to false to restore the default behavior of vim.notify
-    override_notify = true,
+    -- currently disabled due to instabilities
+    override_notify = false,
   },
 }

+ 16 - 29
lua/lvim/core/log.lua

@@ -1,7 +1,6 @@
 local Log = {}
 
 local logfile = string.format("%s/%s.log", vim.fn.stdpath "cache", "lvim")
-local in_headless = #vim.api.nvim_list_uis() == 0
 
 Log.levels = {
   TRACE = 1,
@@ -19,20 +18,20 @@ function Log:init()
     return nil
   end
 
-  local nvim_notify_params = {}
-  local nvim_notify_params_injecter = function(_, entry)
-    for key, value in pairs(nvim_notify_params) do
-      entry[key] = value
-    end
-    return entry
-  end
+  local notify_handler = require "lvim.core.notify"
 
-  local nvim_notify_default_namer = function(logger, entry)
-    entry["title"] = logger.name
-    return entry
+  ---Check if notify is available
+  ---@return boolean
+  local is_notify_available = function()
+    local in_headless = #vim.api.nvim_list_uis() == 0
+    --We can't rely on lvim.builtin.notify.active since this can be used before the config loader
+    local has_notify_plugin = pcall(require, "notify")
+    if not in_headless and has_notify_plugin then
+      return true
+    end
+    return false
   end
 
-  nvim_notify_params_injecter(nil, {})
   local log_level = Log.levels[(lvim.log.level):upper() or "WARN"]
   local lvim_log = {
     lvim = {
@@ -65,13 +64,13 @@ function Log:init()
     },
   }
 
-  if not in_headless and lvim.builtin.notify.active then
+  if is_notify_available() then
     table.insert(
       lvim_log.lvim.sinks,
       structlog.sinks.NvimNotify(Log.levels.INFO, {
         processors = {
-          nvim_notify_default_namer,
-          nvim_notify_params_injecter,
+          notify_handler.default_namer,
+          notify_handler.params_injecter,
         },
         formatter = structlog.formatters.Format( --
           "%s",
@@ -94,20 +93,8 @@ function Log:init()
 
   local logger = structlog.get_logger "lvim"
 
-  if not in_headless and lvim.builtin.notify.active and lvim.log.override_notify then
-    -- Overwrite vim.notify to use the logger
-    vim.notify = function(msg, vim_log_level, opts)
-      nvim_notify_params = vim.tbl_deep_extend("force", lvim.builtin.notify.opts, opts)
-      -- vim_log_level can be omitted
-      if vim_log_level == nil then
-        vim_log_level = Log.levels["INFO"]
-      end
-      if type(vim_log_level) == "string" then
-        vim_log_level = Log.levels[(vim_log_level):upper() or "INFO"]
-      end
-      -- https://github.com/neovim/neovim/blob/685cf398130c61c158401b992a1893c2405cd7d2/runtime/lua/vim/lsp/log.lua#L5
-      logger:log(vim_log_level + 1, msg)
-    end
+  if lvim.log.override_notify then
+    logger:log(Log.levels.INFO, "Ignoring request to override vim.notify with structlog due to instabilities")
   end
 
   return logger

+ 21 - 7
lua/lvim/core/notify.lua

@@ -2,25 +2,26 @@ local M = {}
 
 function M.config()
   local pallete = require "onedarker.palette"
+
   lvim.builtin.notify = {
     active = false,
     on_config_done = nil,
     -- TODO: update after https://github.com/rcarriga/nvim-notify/pull/24
     opts = {
-      ---@usage Animation style (see below for details)
-      stages = "fade_in_slide_out",
+      ---@usage Animation style one of { "fade", "slide", "fade_in_slide_out", "static" }
+      stages = "slide",
 
-      ---@usage Default timeout for notifications
+      ---@usage timeout for notifications in ms, default 5000
       timeout = 5000,
 
-      ---@usage For stages that change opacity this is treated as the highlight behind the window
+      ---@usage highlight behind the window for stages that change opacity
       background_colour = pallete.fg,
 
       ---@usage Icons for the different levels
       icons = {
-        ERROR = "",
-        WARN = "",
-        INFO = "",
+        ERROR = "",
+        WARN = "",
+        INFO = "",
         DEBUG = "",
         TRACE = "✎",
       },
@@ -28,4 +29,17 @@ function M.config()
   }
 end
 
+M.params_injecter = function(_, entry)
+  -- FIXME: this is currently getting ignored or is not passed correctly
+  for key, value in pairs(lvim.builtin.notify.opts) do
+    entry[key] = value
+  end
+  return entry
+end
+
+M.default_namer = function(logger, entry)
+  entry["title"] = logger.name
+  return entry
+end
+
 return M