diff --git a/editor.go b/editor.go index 9c49440..3e6f9b7 100644 --- a/editor.go +++ b/editor.go @@ -17,6 +17,7 @@ func editorLoader(rtm *rt.Runtime) *rt.Table { "getVimRegister": {editorGetRegister, 2, false}, "getLine": {editorGetLine, 0, false}, "readChar": {editorReadChar, 0, false}, + "deleteByAmount": {editorDeleteByAmount, 1, false}, } mod := rt.NewTable() @@ -106,3 +107,21 @@ func editorReadChar(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { return c.PushingNext1(t.Runtime, rt.StringValue(string(buf))), nil } + +// #interface editor +// deleteByAmount() -> string +// Reads a keystroke from the user. This is in a format of something like Ctrl-L. +func editorDeleteByAmount(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { + if err := c.Check1Arg(); err != nil { + return nil, err + } + + amount, err := c.IntArg(0) + if err != nil { + return nil, err + } + + lr.rl.DeleteByAmount(int(amount)) + + return c.Next(), nil +} diff --git a/nature/abbr.lua b/nature/abbr.lua new file mode 100644 index 0000000..82b4095 --- /dev/null +++ b/nature/abbr.lua @@ -0,0 +1,35 @@ +local bait = require 'bait' +local hilbish = require 'hilbish' +hilbish.abbr = { + _abbrevs = {} +} + +function hilbish.abbr.add(opts) + hilbish.abbr._abbrevs[opts.abbr] = opts +end + +print 'abbr loaded' +hilbish.abbr.add { + abbr = 'tt', + expand = 'echo titties' +} + +hilbish.abbr.add { + abbr = 'idk', + expand = 'i dont know', + anywhere = true +} + +bait.catch('hilbish.rawInput', function(c) + if c == ' ' then -- space + -- check if the last "word" was a valid abbreviation + local line = hilbish.editor.getLine() + local lineSplits = string.split(line, ' ') + local thisAbbr = hilbish.abbr._abbrevs[lineSplits[#lineSplits]] + + if thisAbbr and (#lineSplits == 1 or thisAbbr.anywhere == true) then + hilbish.editor.deleteByAmount(-lineSplits[#lineSplits]:len()) + hilbish.editor.insert(thisAbbr.expand) + end + end +end) diff --git a/nature/init.lua b/nature/init.lua index a0579d7..1e0d7e6 100644 --- a/nature/init.lua +++ b/nature/init.lua @@ -24,6 +24,7 @@ require 'nature.opts' require 'nature.vim' require 'nature.runner' require 'nature.hummingbird' +require 'nature.abbr' local shlvl = tonumber(os.getenv 'SHLVL') if shlvl ~= nil then diff --git a/readline/vimdelete.go b/readline/vimdelete.go index 7a07259..f5c1806 100644 --- a/readline/vimdelete.go +++ b/readline/vimdelete.go @@ -142,6 +142,10 @@ func (rl *Instance) viDeleteByAdjust(adjust int) { rl.updateHelpers() } +func (rl *Instance) DeleteByAmount(adjust int) { + rl.viDeleteByAdjust(adjust) +} + func (rl *Instance) vimDeleteToken(r rune) bool { tokens, _, _ := tokeniseSplitSpaces(rl.line, 0) pos := int(r) - 48 // convert ASCII to integer