     (boop--sync-result-and-config)
     (run-hooks 'boop-update-hook)
     (-map (lambda (config)
-            (let* ((id (car config))
+            (let* ((id     (car config))
+                   (script (cdr (assoc (plist-get (cdr config) :script) plugins)))
+                   (args   (mapconcat 'identity (plist-get (cdr config) :args) " "))
                    (select (plist-get (cdr config) :onselect))
-                   (script (cdr (assoc (plist-get (cdr config) :script) plugins)))
-                   (args (mapconcat 'identity (plist-get (cdr config) :args) " ")))
+                   (group  (plist-get (cdr config) :group)))
               ;; Set up the :onselect events
               (when select (eval `(boop-defmodelinemap ,id select)))
               ;; Only boop the configs with scripts
               (when script
                 (async-start `(lambda () (shell-command-to-string (format "%s %s" ,script ,args)))
-                             `(lambda (result) (boop--handle-result (quote ,id) (string-to-number result)))))))
+                             `(lambda (result) (boop--handle-result (quote ,id) (string-to-number result) (quote ,group)))))))
           boop-config-alist)))
 
 (defun boop-flash-result-ids ()

  "Synchronizes the result alist to contain only items in the config alist."
  (setq boop-result-alist (--filter (assoc (car it) boop-config-alist) boop-result-alist)))

(defun boop--handle-result (id result)
  "Update the resut with ID by handling the RESULT of the async `shell-command-to-string`."
  (if (assoc id boop-result-alist)
      (boop--update-result id result)
    (setq boop-result-alist (append (list (cons id result)) boop-result-alist))))

(defun boop--update-result (id result)
  "Update the boop with ID to have the new RESULT.

Updating the result will also trigger any actions associated with that RESULT form."
  (let* ((current-result (cdr (assoc id boop-result-alist)))
         (form (or (cdr (assoc result boop-format-alist))
                   boop-default-format))
         (name (car (assoc id boop-result-alist)))
         (action (plist-get form :action)))
    (setf (cdr (assoc id boop-result-alist)) result)
    (when (and (not (eq current-result result)) action)
      (funcall (if (symbolp action)
                   (symbol-function action)

                'local-map (eval map)
                'pointer (when map 'hand))))

;; Shorten functions

(defun boop--shorten-substring (id)
  "Formats an ID string to be the substring of up to 5 characters."
  (substring id 0 (min (length id) 5)))

(defun boop--shorten-delim (id)
  "Formats an ID string to be the substring of up to 5 characters."
  (downcase (mapconcat (lambda (s) (substring s 0 1)) (s-split-words id) "-")))

;; Click bindings

(defmacro boop-defmodelinemap (id f)
