// AutoCompleteFunction returns a callback for terminal autocompletion func (h *Host) AutoCompleteFunction(u *message.User) func(line string, pos int, key rune) (newLine string, newPos int, ok bool) { return func(line string, pos int, key rune) (newLine string, newPos int, ok bool) { if key != 9 { return } if line == "" || strings.HasSuffix(line[:pos], " ") { // Don't autocomplete spaces. return } fields := strings.Fields(line[:pos]) isFirst := len(fields) < 2 partial := fields[len(fields)-1] posPartial := pos - len(partial) var completed string if isFirst && strings.HasPrefix(partial, "/") { // Command completed = h.completeCommand(partial) if completed == "/reply" { replyTo := u.ReplyTo() if replyTo != nil { completed = "/msg " + replyTo.Name() } } } else { // Name completed = h.completeName(partial) if completed == "" { return } if isFirst { completed += ":" } } completed += " " // Reposition the cursor newLine = strings.Replace(line[posPartial:], partial, completed, 1) newLine = line[:posPartial] + newLine newPos = pos + (len(completed) - len(partial)) ok = true return } }