src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/edit/insert_api.go (about)

     1  package edit
     2  
     3  import (
     4  	"src.elv.sh/pkg/cli"
     5  	"src.elv.sh/pkg/eval"
     6  	"src.elv.sh/pkg/eval/vals"
     7  	"src.elv.sh/pkg/eval/vars"
     8  )
     9  
    10  func initInsertAPI(appSpec *cli.AppSpec, nt notifier, ev *eval.Evaler, nb eval.NsBuilder) {
    11  	simpleAbbr := vals.EmptyMap
    12  	simpleAbbrVar := vars.FromPtr(&simpleAbbr)
    13  	appSpec.SimpleAbbreviations = makeMapIterator(simpleAbbrVar)
    14  
    15  	commandAbbr := vals.EmptyMap
    16  	commandAbbrVar := vars.FromPtr(&commandAbbr)
    17  	appSpec.CommandAbbreviations = makeMapIterator(commandAbbrVar)
    18  
    19  	smallWordAbbr := vals.EmptyMap
    20  	smallWordAbbrVar := vars.FromPtr(&smallWordAbbr)
    21  	appSpec.SmallWordAbbreviations = makeMapIterator(smallWordAbbrVar)
    22  
    23  	bindingVar := newBindingVar(emptyBindingsMap)
    24  	appSpec.CodeAreaBindings = newMapBindings(nt, ev, bindingVar)
    25  
    26  	quotePaste := newBoolVar(false)
    27  	appSpec.QuotePaste = func() bool { return quotePaste.GetRaw().(bool) }
    28  
    29  	toggleQuotePaste := func() {
    30  		quotePaste.Set(!quotePaste.Get().(bool))
    31  	}
    32  
    33  	nb.AddVar("abbr", simpleAbbrVar)
    34  	nb.AddVar("command-abbr", commandAbbrVar)
    35  	nb.AddVar("small-word-abbr", smallWordAbbrVar)
    36  	nb.AddGoFn("toggle-quote-paste", toggleQuotePaste)
    37  	nb.AddNs("insert", eval.BuildNs().
    38  		AddVar("binding", bindingVar).
    39  		AddVar("quote-paste", quotePaste))
    40  }
    41  
    42  func makeMapIterator(mv vars.PtrVar) func(func(a, b string)) {
    43  	return func(f func(a, b string)) {
    44  		for it := mv.GetRaw().(vals.Map).Iterator(); it.HasElem(); it.Next() {
    45  			k, v := it.Elem()
    46  			ks, kok := k.(string)
    47  			vs, vok := v.(string)
    48  			if !kok || !vok {
    49  				continue
    50  			}
    51  			f(ks, vs)
    52  		}
    53  	}
    54  }