Well. So I went ahead and implemented all the tag commands except for cget and ranges, fixing a minor thing in the process:
(defun tag-to-string (tag) "Convert a lisp-side tag to a string, return the resulting string" (if (stringp tag) tag (if tag (format nil "~(~a~)" tag) "")))
(defgeneric tag-add (txt tag &rest indices)) (defmethod tag-add ((txt text) tag &rest indices) (format-wish "~a tag add ~a ~{ ~(~a~)~}" (widget-path txt) (tag-to-string tag) indices) txt)
(defgeneric tag-remove (txt tag &rest indices)) (defmethod tag-remove ((txt text) tag &rest indices) (format-wish "~a tag remove ~a ~{ ~(~a~)~}" (widget-path txt) (tag-to-string tag) indices) txt)
(defgeneric tag-configure (txt tag option value)) (defmethod tag-configure ((txt text) tag option value) (format-wish "~a tag configure ~a -~(~a~) {~(~a~)}" (widget-path txt) (tag-to-string tag) option value) txt)
(defgeneric tag-bind (txt tag event fun)) (defmethod tag-bind ((txt text) tag event fun) "bind fun to event of the tag of the text widget txt" (let ((name (create-name))) (add-callback name fun) (format-wish "~a tag bind ~(~a~) ~a {callback ~A}" (widget-path txt) (tag-to-string tag) event name)) txt)
(defgeneric tag-delete (txt tag &rest other-tags)) (defmethod tag-delete ((txt text) tag &rest other-tags) (format-wish "~a tag delete ~a ~{ ~(~a~)~}" (widget-path txt) (tag-to-string tag) (mapcar #'tag-to-string other-tags)) txt)
(defgeneric tag-lower (txt tag &optional other-tag)) (defmethod tag-lower ((txt text) tag &optional other-tag) (format-wish "~a tag lower ~a ~a" (widget-path txt) (tag-to-string tag) (tag-to-string other-tag)) txt)
(defgeneric tag-raise (txt tag &optional other-tag)) (defmethod tag-raise ((txt text) tag &optional other-tag) (format-wish "~a tag raise ~a ~a" (widget-path txt) (tag-to-string tag) (tag-to-string other-tag)) txt)
(defgeneric tag-names (txt index)) (defmethod tag-names ((txt text) index) (format-wish "~a tag names ~(~a~)" (widget-path txt) index) txt)
(defgeneric tag-nextrange (txt tag index1 &optional index2)) (defmethod tag-nextrange ((txt text) tag index1 &optional index2) (format-wish "~a tag nextrange ~a ~(~a~) ~(~a~)" (widget-path txt) (tag-to-string tag) index1 (if index2 index2 "")) txt)
(defgeneric tag-prevrange (txt tag index1 &optional index2)) (defmethod tag-prevrange ((txt text) tag index1 &optional index2) (format-wish "~a tag nextrange ~a ~(~a~) ~(~a~)" (widget-path txt) (tag-to-string tag) index1 (if index2 index2 "")) txt)
(defgeneric tag-ranges (txt tag)) (defmethod tag-ranges ((txt text) tag) (format-wish "~a tag ranges ~a" (widget-path txt) (tag-to-string tag)) (read-data))
Now, both cget and ranges need to read data from wish -- how do I do that? It seems that read-data will break if there is no data to read, and "tag ranges" may or may not return data.
--J.