From c890b86e084d08339e96588c690d68bb82d766c0 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Sat, 30 Apr 2022 21:22:37 -0400 Subject: [PATCH] feat: add hilbish.opts and autocd opt this adds `hilbish.opts`, a table to set simple options akin to shopt or setopt on other shells. this commit specifically also includes the autocd opt, which functions the way you expect it to to set opts, simply do `hilbish.opts.name = val`, where `name` is the opt you want to set and `val` being the opt setting. ie: `hilbish.opts.autocd = true` to turn on autocd --- nature/init.lua | 1 + nature/opts/autocd.lua | 23 +++++++++++++++++++++++ nature/opts/init.lua | 28 ++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 nature/opts/autocd.lua create mode 100644 nature/opts/init.lua 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