code: func SetKeywords(p *dt.Plugin, khs ...dt.KeywordHandler) {
  	p.Keywords = &dt.Keywords{
  		Dict: map[string]dt.KeywordFn{},
  	}
  	for _, kh := range khs {
  		for _, intent := range kh.Trigger.Intents {
  			intent = strings.ToLower(intent)
  			if !language.Contains(p.Trigger.Intents, intent) {
  				p.Trigger.Intents = append(p.Trigger.Intents, intent)
  			}
  			key := "I_" + intent
  			_, exists := p.Keywords.Dict[key]
  			if exists {
  				continue
  			}
  			p.Keywords.Dict[key] = kh.Fn
  		}
  		eng := porter2.Stemmer
  		for _, cmd := range kh.Trigger.Commands {
  			cmd = strings.ToLower(eng.Stem(cmd))
  			if !language.Contains(p.Trigger.Commands, cmd) {
  				p.Trigger.Commands = append(p.Trigger.Commands, cmd)
  			}
  			for _, obj := range kh.Trigger.Objects {
  				obj = strings.ToLower(eng.Stem(obj))
  				if !language.Contains(p.Trigger.Objects, obj) {
  					p.Trigger.Objects = append(p.Trigger.Objects, obj)
  				}
  				key := "CO_" + cmd + "_" + obj
  				p.Keywords.Dict[key] = kh.Fn
  			}
  		}
  	}
  }
docs: // SetKeywords processes and registers keywords with Abot's core for routing.