diff --git a/nature/init.lua b/nature/init.lua index 16f26ed..c70f6cc 100644 --- a/nature/init.lua +++ b/nature/init.lua @@ -6,6 +6,7 @@ package.path = package.path .. ';' .. hilbish.dataDir .. '/?/init.lua' require 'nature.commands' require 'nature.completions' +require 'nature.opts' local shlvl = tonumber(os.getenv 'SHLVL') if shlvl ~= nil then diff --git a/nature/opts/autocd.lua b/nature/opts/autocd.lua new file mode 100644 index 0000000..b25732e --- /dev/null +++ b/nature/opts/autocd.lua @@ -0,0 +1,23 @@ +local fs = require 'fs' + +function cdHandle(inp) + local input, exit, err = hilbish.runner.lua(inp) + + if not err then + return input, exit, err + end + + input, exit, err = hilbish.runner.sh(inp) + + if exit ~= 0 and hilbish.opts.autocd then + local ok, stat = pcall(fs.stat, input) + if ok and stat.isDir then + -- discard here to not append the cd, which will be in history + _, exit, err = hilbish.runner.sh('cd ' .. input) + end + end + + return input, exit, err +end + +hilbish.runner.setMode(cdHandle) diff --git a/nature/opts/init.lua b/nature/opts/init.lua new file mode 100644 index 0000000..59d3cbd --- /dev/null +++ b/nature/opts/init.lua @@ -0,0 +1,28 @@ +local opts = {} +hilbish.opts = {} + +setmetatable(hilbish.opts, { + __newindex = function(_, k, v) + if opts[k] == nil then + error(string.format('opt %s does not exist', k)) + end + + opts[k] = v + end, + __index = function(_, k) + return opts[k] + end +}) + +local function setupOpt(name, default) + opts[name] = default + require('nature.opts.' .. name) +end + +local defaultOpts = { + autocd = false +} + +for optsName, default in pairs(defaultOpts) do + setupOpt(optsName, default) +end