+(defun murk-complete-input ()
+ (interactive)
+ (let ((completion-ignore-case t))
+ (when (>= (point) murk-input-marker)
+ (pcase (buffer-substring murk-input-marker (point))
+ ((rx (: "/" (let cmd-str (+ (not whitespace))) (+ " ") (* (not whitespace)) string-end))
+ (let ((space-idx (save-excursion
+ (re-search-backward " " murk-input-marker t)))
+ (table-row (assoc (upcase cmd-str) murk-command-table #'equal)))
+ (if (and table-row (elt table-row 3))
+ (let* ((completions-nospace (funcall (elt table-row 3)))
+ (completions (mapcar (lambda (el) (concat el " ")) completions-nospace)))
+ (completion-in-region (+ 1 space-idx) (point) completions)))))
+ ((rx (: "/" (* (not whitespace)) string-end))
+ (message (buffer-substring murk-input-marker (point)))
+ (completion-in-region murk-input-marker (point)
+ (mapcar (lambda (row) (concat "/" (car row) " "))
+ murk-command-table)))
+ (_
+ (let* ((end (max murk-input-marker (point)))
+ (space-idx (save-excursion
+ (re-search-backward " " murk-input-marker t)))
+ (start (if space-idx (+ 1 space-idx) murk-input-marker)))
+ (unless (string-prefix-p "/" (buffer-substring start end))
+ (let* ((users (murk-get-context-users murk-current-context))
+ (users-no@ (mapcar
+ (lambda (u) (car (split-string u "@" t)))
+ users)))
+ (completion-in-region start end users-no@)))))))))