diff options
| author | kylo252 <59826753+kylo252@users.noreply.github.com> | 2021-09-25 18:56:06 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-25 18:56:06 +0200 |
| commit | 93309eb9bcf2111eb072dd82269a7a439e0c8e26 (patch) | |
| tree | 9cf135027cc0c64eb9b360d42c7f7129600f4b36 /lua | |
| parent | hls: update to 1.4.0 (diff) | |
| download | mason-93309eb9bcf2111eb072dd82269a7a439e0c8e26.tar mason-93309eb9bcf2111eb072dd82269a7a439e0c8e26.tar.gz mason-93309eb9bcf2111eb072dd82269a7a439e0c8e26.tar.bz2 mason-93309eb9bcf2111eb072dd82269a7a439e0c8e26.tar.lz mason-93309eb9bcf2111eb072dd82269a7a439e0c8e26.tar.xz mason-93309eb9bcf2111eb072dd82269a7a439e0c8e26.tar.zst mason-93309eb9bcf2111eb072dd82269a7a439e0c8e26.zip | |
feat: add a logger based on plenary.log (#99)
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/nvim-lsp-installer/log.lua | 161 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/process.lua | 6 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/ui/display.lua | 5 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/ui/status-win/init.lua | 6 |
4 files changed, 156 insertions, 22 deletions
diff --git a/lua/nvim-lsp-installer/log.lua b/lua/nvim-lsp-installer/log.lua index 1c61180b..1fa3209e 100644 --- a/lua/nvim-lsp-installer/log.lua +++ b/lua/nvim-lsp-installer/log.lua @@ -1,18 +1,151 @@ -local M = {} +local config = { + -- Name of the plugin. Prepended to log messages + name = "lsp-installer", --- TODO + -- Should print the output to neovim while running + -- values: 'sync','async',false + use_console = false, -function M.debug(...) - -- print("[debug]", vim.inspect(...)) -end -function M.error(...) - -- print("[error]", vim.inspect(...)) -end -function M.warn(...) - -- print("[warn]", vim.inspect(...)) -end -function M.info(...) - -- print("[info]", vim.inspect(...)) + -- Should highlighting be used in console (using echohl) + highlights = true, + + -- Should write to a file + use_file = true, + + -- Level configuration + modes = { + { name = "trace", hl = "Comment" }, + { name = "debug", hl = "Comment" }, + { name = "info", hl = "None" }, + { name = "warn", hl = "WarningMsg" }, + { name = "error", hl = "ErrorMsg" }, + { name = "fatal", hl = "ErrorMsg" }, + }, + + -- Can limit the number of decimals displayed for floats + float_precision = 0.01, +} + +local log = {} + +-- Default log level is warn. +vim.g.lsp_installer_log_level = vim.g.lsp_installer_log_level or vim.log.levels.WARN + +local unpack = unpack or table.unpack + +do + local outfile = string.format("%s/%s.log", vim.api.nvim_call_function("stdpath", { "cache" }), config.name) + + local round = function(x, increment) + increment = increment or 1 + x = x / increment + return (x > 0 and math.floor(x + 0.5) or math.ceil(x - 0.5)) * increment + end + + local make_string = function(...) + local t = {} + for i = 1, select("#", ...) do + local x = select(i, ...) + + if type(x) == "number" and config.float_precision then + x = tostring(round(x, config.float_precision)) + elseif type(x) == "table" then + x = vim.inspect(x) + else + x = tostring(x) + end + + t[#t + 1] = x + end + return table.concat(t, " ") + end + + local log_at_level = function(level, level_config, message_maker, ...) + -- Return early if we're below the current_log_level + if level < vim.g.lsp_installer_log_level then + return + end + local nameupper = level_config.name:upper() + + local msg = message_maker(...) + local info = debug.getinfo(config.info_level or 2, "Sl") + local lineinfo = info.short_src .. ":" .. info.currentline + + -- Output to console + if config.use_console then + local log_to_console = function() + local console_string = string.format("[%-6s%s] %s: %s", nameupper, os.date "%H:%M:%S", lineinfo, msg) + + if config.highlights and level_config.hl then + vim.cmd(string.format("echohl %s", level_config.hl)) + end + + local split_console = vim.split(console_string, "\n") + for _, v in ipairs(split_console) do + local formatted_msg = string.format("[%s] %s", config.name, vim.fn.escape(v, [["\]])) + + local ok = pcall(vim.cmd, string.format([[echom "%s"]], formatted_msg)) + if not ok then + vim.api.nvim_out_write(msg .. "\n") + end + end + + if config.highlights and level_config.hl then + vim.cmd "echohl NONE" + end + end + if config.use_console == "sync" and not vim.in_fast_event() then + log_to_console() + else + vim.schedule(log_to_console) + end + end + + -- Output to log file + if config.use_file then + local fp = assert(io.open(outfile, "a")) + local str = string.format("[%-6s%s] %s: %s\n", nameupper, os.date(), lineinfo, msg) + fp:write(str) + fp:close() + end + end + + for i, x in ipairs(config.modes) do + -- log.info("these", "are", "separated") + log[x.name] = function(...) + return log_at_level(i, x, make_string, ...) + end + + -- log.fmt_info("These are %s strings", "formatted") + log[("fmt_%s"):format(x.name)] = function(...) + return log_at_level(i, x, function(...) + local passed = { ... } + local fmt = table.remove(passed, 1) + local inspected = {} + for _, v in ipairs(passed) do + table.insert(inspected, vim.inspect(v)) + end + return string.format(fmt, unpack(inspected)) + end, ...) + end + + -- log.lazy_info(expensive_to_calculate) + log[("lazy_%s"):format(x.name)] = function() + return log_at_level(i, x, function(f) + return f() + end) + end + + -- log.file_info("do not print") + log[("file_%s"):format(x.name)] = function(vals, override) + local original_console = config.use_console + config.use_console = false + config.info_level = override.info_level + log_at_level(i, x, make_string, unpack(vals)) + config.use_console = original_console + config.info_level = nil + end + end end -return M +return log diff --git a/lua/nvim-lsp-installer/process.lua b/lua/nvim-lsp-installer/process.lua index 8669f7b6..5b4bc22a 100644 --- a/lua/nvim-lsp-installer/process.lua +++ b/lua/nvim-lsp-installer/process.lua @@ -7,7 +7,7 @@ local M = {} local function connect_sink(pipe, sink) return function(err, data) if err then - log.error { "Unexpected error when reading pipe.", err } + -- log.error { "Unexpected error when reading pipe.", err } end if data ~= nil then local lines = vim.split(data, "\n") @@ -51,7 +51,7 @@ function M.spawn(cmd, opts, callback) local stdio = { stdin, stdout, stderr } - log.debug { "Spawning", cmd, opts } + -- log.debug { "Spawning", cmd, opts } local spawn_opts = { env = opts.env, @@ -90,7 +90,7 @@ function M.spawn(cmd, opts, callback) return nil, nil end - log.debug { "Spawned with pid", pid } + -- log.debug { "Spawned with pid", pid } stdout:read_start(connect_sink(stdout, opts.stdio_sink.stdout)) stderr:read_start(connect_sink(stderr, opts.stdio_sink.stderr)) diff --git a/lua/nvim-lsp-installer/ui/display.lua b/lua/nvim-lsp-installer/ui/display.lua index 01a43cf5..c5f9c60b 100644 --- a/lua/nvim-lsp-installer/ui/display.lua +++ b/lua/nvim-lsp-installer/ui/display.lua @@ -154,7 +154,8 @@ function M.new_view_only_win(name) if not win or not vim.api.nvim_buf_is_valid(buf) then -- the window has been closed or the buffer is somehow no longer valid unsubscribe(true) - return log.debug { "Buffer or window is no longer valid", name, win, buf } + -- return log.debug { "Buffer or window is no longer valid", name, win, buf } + return end local win_width = vim.api.nvim_win_get_width(win) @@ -202,7 +203,7 @@ function M.new_view_only_win(name) return mutate_state, get_state end, open = vim.schedule_wrap(function(opts) - log.debug { "opening window" } + -- log.debug { "opening window" } assert(has_initiated, "Display has not been initiated, cannot open.") local win = vim.fn.win_findbuf(buf)[1] if win and vim.api.nvim_win_is_valid(win) then diff --git a/lua/nvim-lsp-installer/ui/status-win/init.lua b/lua/nvim-lsp-installer/ui/status-win/init.lua index 42a5d1a1..15e2696f 100644 --- a/lua/nvim-lsp-installer/ui/status-win/init.lua +++ b/lua/nvim-lsp-installer/ui/status-win/init.lua @@ -327,10 +327,10 @@ local function init(all_servers) return { open = open, install_server = function(server) - log.debug { "installing server", server } + -- log.debug { "installing server", server } local server_state = get_state().servers[server.name] if server_state and (server_state.installer.is_running or server_state.installer.is_queued) then - log.debug { "Installer is already queued/running", server.name } + -- log.debug { "Installer is already queued/running", server.name } return end mutate_state(function(state) @@ -343,7 +343,7 @@ local function init(all_servers) uninstall_server = function(server) local server_state = get_state().servers[server.name] if server_state and (server_state.installer.is_running or server_state.installer.is_queued) then - log.debug { "Installer is already queued/running", server.name } + -- log.debug { "Installer is already queued/running", server.name } return end |
