diff --git a/README.md b/README.md index c59e0778812..074f0fc4901 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,6 @@ require'nvim-tree'.setup { require'nvim-tree'.setup { -- BEGIN_DEFAULT_OPTS auto_reload_on_write = true, disable_netrw = false, - hide_root_folder = false, hijack_cursor = false, hijack_netrw = true, hijack_unnamed_buffer_when_opening = false, @@ -130,6 +129,7 @@ require'nvim-tree'.setup { -- BEGIN_DEFAULT_OPTS view = { width = 30, height = 30, + hide_root_folder = false, side = "left", preserve_window_proportions = false, number = false, @@ -166,7 +166,7 @@ require'nvim-tree'.setup { -- BEGIN_DEFAULT_OPTS }, ignore_ft_on_setup = {}, system_open = { - cmd = nil, + cmd = "", args = {}, }, diagnostics = { diff --git a/doc/nvim-tree-lua.txt b/doc/nvim-tree-lua.txt index b2019508f86..face92e68a0 100644 --- a/doc/nvim-tree-lua.txt +++ b/doc/nvim-tree-lua.txt @@ -82,11 +82,11 @@ SETUP *nvim-tree.setup* To configure the tree (and make it runnable), you should call the setup function. +Values may be functions. Warning: this may result in unexpected behaviour. > require("nvim-tree").setup { -- BEGIN_DEFAULT_OPTS auto_reload_on_write = true, disable_netrw = false, - hide_root_folder = false, hijack_cursor = false, hijack_netrw = true, hijack_unnamed_buffer_when_opening = false, @@ -99,6 +99,7 @@ function. view = { width = 30, height = 30, + hide_root_folder = false, side = "left", preserve_window_proportions = false, number = false, @@ -135,7 +136,7 @@ function. }, ignore_ft_on_setup = {}, system_open = { - cmd = nil, + cmd = "", args = {}, }, diagnostics = { @@ -311,10 +312,10 @@ Here is a list of the options available in the setup call: *nvim-tree.system_open* - |system_open|: configuration options for the system open command - - |system_open.cmd|: the command to run, leaving nil should work but + - |system_open.cmd|: the command to run, leaving empty should work but useful if you want to override the default command with another one. type: `string` - default: `nil` + default: `""` - |system_open.args|: the command arguments as a list type: `{string}` diff --git a/lua/nvim-tree.lua b/lua/nvim-tree.lua index 651bbf620be..0a56efc7e1d 100644 --- a/lua/nvim-tree.lua +++ b/lua/nvim-tree.lua @@ -311,7 +311,6 @@ end local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS auto_reload_on_write = true, disable_netrw = false, - hide_root_folder = false, hijack_cursor = false, hijack_netrw = true, hijack_unnamed_buffer_when_opening = false, @@ -324,6 +323,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS view = { width = 30, height = 30, + hide_root_folder = false, side = "left", preserve_window_proportions = false, number = false, @@ -360,7 +360,7 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS }, ignore_ft_on_setup = {}, system_open = { - cmd = nil, + cmd = "", args = {}, }, diagnostics = { @@ -429,16 +429,53 @@ local function merge_options(conf) return vim.tbl_deep_extend("force", DEFAULT_OPTS, conf or {}) end +local function validate_options(conf) + local msg + + local function validate(user, def, prefix) + -- only compare tables with contents that are not integer indexed + if type(user) ~= "table" or type(def) ~= "table" or not next(def) or type(next(def)) == "number" then + return + end + + for k, v in pairs(user) do + local invalid + if def[k] == nil then + -- option does not exist + invalid = string.format("unknown option: %s%s", prefix, k) + elseif type(v) ~= type(def[k]) and type(v) ~= "function" then + -- option is of the wrong type and is not a function + invalid = string.format("invalid option: %s%s expected: %s actual: %s", prefix, k, type(def[k]), type(v)) + end + + if invalid then + if msg then + msg = string.format("%s | %s", msg, invalid) + else + msg = string.format("%s", invalid) + end + user[k] = nil + else + validate(v, def[k], prefix .. k .. ".") + end + end + end + + validate(conf, DEFAULT_OPTS, "") + + if msg then + utils.warn(msg) + end +end + function M.setup(conf) legacy.migrate_legacy_options(conf or {}) + validate_options(conf) + local opts = merge_options(conf) local netrw_disabled = opts.disable_netrw or opts.hijack_netrw - if opts.auto_close then - utils.warn "auto close feature has been removed, see note in the README (tips & reminder section)" - end - _config.update_focused_file = opts.update_focused_file _config.open_on_setup = opts.open_on_setup _config.open_on_setup_file = opts.open_on_setup_file diff --git a/lua/nvim-tree/actions/system-open.lua b/lua/nvim-tree/actions/system-open.lua index b0f63596429..e44e357a72c 100644 --- a/lua/nvim-tree/actions/system-open.lua +++ b/lua/nvim-tree/actions/system-open.lua @@ -9,7 +9,7 @@ local M = { } function M.fn(node) - if not M.config.system_open.cmd then + if #M.config.system_open.cmd == 0 then require("nvim-tree.utils").warn "Cannot open file with system application. Unrecognized platform." return end @@ -53,7 +53,7 @@ end function M.setup(opts) M.config.system_open = opts or {} - if not M.config.system_open.cmd then + if #M.config.system_open.cmd == 0 then if M.config.is_windows then M.config.system_open = { cmd = "cmd", diff --git a/lua/nvim-tree/legacy.lua b/lua/nvim-tree/legacy.lua index f4023c628d7..3030630a933 100644 --- a/lua/nvim-tree/legacy.lua +++ b/lua/nvim-tree/legacy.lua @@ -5,7 +5,7 @@ local M = {} -- TODO update git.io/JPhyt when adding a migration -- migrate the g: to o if the user has not specified that when calling setup -local migrations = { +local g_migrations = { nvim_tree_disable_netrw = function(o) if o.disable_netrw == nil then o.disable_netrw = vim.g.nvim_tree_disable_netrw ~= 0 @@ -178,22 +178,7 @@ local migrations = { end, } -function M.migrate_legacy_options(opts) - local msg = nil - - -- g: options - for g, m in pairs(migrations) do - if vim.fn.exists("g:" .. g) ~= 0 then - m(opts) - msg = (msg and msg .. ", " or "Following options were moved to setup, see git.io/JPhyt: ") .. g - end - end - - if msg then - require("nvim-tree.utils").warn(msg) - end - - -- regular opts +local function refactored(opts) if opts.view then if opts.view.mappings then if opts.view.mappings.list then @@ -207,4 +192,31 @@ function M.migrate_legacy_options(opts) end end +local function removed(opts) + if opts.auto_close then + utils.warn "auto close feature has been removed, see note in the README (tips & reminder section)" + opts.auto_close = nil + end +end + +function M.migrate_legacy_options(opts) + -- g: options + local msg + for g, m in pairs(g_migrations) do + if vim.fn.exists("g:" .. g) ~= 0 then + m(opts) + msg = (msg and msg .. ", " or "Following options were moved to setup, see git.io/JPhyt: ") .. g + end + end + if msg then + utils.warn(msg) + end + + -- silently move + refactored(opts) + + -- warn and delete + removed(opts) +end + return M