insert_api.go 1.5 KB

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