<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><br><div>Begin forwarded message:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;"><span style="font-family:'Helvetica'; font-size:medium; color:rgba(0, 0, 0, 1);"><b>From: </b></span><span style="font-family:'Helvetica'; font-size:medium;">Arthur Cater <<a href="mailto:arthur.cater@ucd.ie">arthur.cater@ucd.ie</a>><br></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;"><span style="font-family:'Helvetica'; font-size:medium; color:rgba(0, 0, 0, 1);"><b>Date: </b></span><span style="font-family:'Helvetica'; font-size:medium;">28 January 2012 12:23:56 GMT<br></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;"><span style="font-family:'Helvetica'; font-size:medium; color:rgba(0, 0, 0, 1);"><b>To: </b></span><span style="font-family:'Helvetica'; font-size:medium;">Glen Foy <<a href="mailto:lisp@clairvaux.org">lisp@clairvaux.org</a>><br></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;"><span style="font-family:'Helvetica'; font-size:medium; color:rgba(0, 0, 0, 1);"><b>Subject: </b></span><span style="font-family:'Helvetica'; font-size:medium;"><b>Re: [Openmcl-devel] How does Hemlock ...</b><br></span></div><br><div>Thank you Glen for that help. I've adapted it for my use by using the<br>buffer-plist instead of parameter *process-down-mouse-p* and instead of<br>rebinding the #k"LeftDown". It works now for the single-line case but not<br>for the multi-line case. I think my claim that the invocation happens after<br>mouse-up was wrong, the result of my code switching attention to another<br>buffer - the listener's - in order to be seen to do something.<br><br>So my problems a,b,c seem fixed, but not d.<br><br>I still don't understand how the buffer-point gets to be set in the first place,<br>nor why what I was doing previously caused it to be set only belatedly.<br>And I like to understand.<br><br>Arthur<br><br><br>On 27 Jan 2012, at 01:19, Glen Foy wrote:<br><br><blockquote type="cite">Arthur,<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">This is ugly as sin, but it will respond to left-down-mouse, and it will read point after it has been set to the new click position. There may be a cleaner way to do this (surely there is), but I couldn't find it:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">-- Glen<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">(defConstant *left-mouse-down* 65535)<br></blockquote><blockquote type="cite">(defParameter *process-down-mouse-p* nil)<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">;;; Redefintion of a Hemlock method in cocoa-editor.lisp<br></blockquote><blockquote type="cite">(defMethod hi::handle-hemlock-event :around ((view hi:hemlock-view) event)<br></blockquote><blockquote type="cite"> (ccl::with-autorelease-pool<br></blockquote><blockquote type="cite"> (call-next-method))<br></blockquote><blockquote type="cite"> (let ((keysym (when (typep event 'hi::key-event) (hi::key-event-keysym event))))<br></blockquote><blockquote type="cite"> (when (and (numberp keysym) (= keysym *left-mouse-down*))<br></blockquote><blockquote type="cite"> (setf *process-down-mouse-p* t))))<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">(defmethod gui::compute-temporary-attributes :around ((self gui::hemlock-textstorage-text-view))<br></blockquote><blockquote type="cite"> (call-next-method)<br></blockquote><blockquote type="cite"> (when *process-down-mouse-p*<br></blockquote><blockquote type="cite"> (let* ((view (gui::hemlock-view self))<br></blockquote><blockquote type="cite"> (hi::*current-buffer* (hi::hemlock-view-buffer view))<br></blockquote><blockquote type="cite"> (point (hi::current-point))<br></blockquote><blockquote type="cite"> (line (when point (hi::mark-line point)))<br></blockquote><blockquote type="cite"> (pos (when point (hi::mark-charpos point))))<br></blockquote><blockquote type="cite"> (format t "~%~%line: ~S" line)<br></blockquote><blockquote type="cite"> (format t "~%pos: ~S" pos))<br></blockquote><blockquote type="cite"> (setq *process-down-mouse-p* nil)))<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">On Jan 26, 2012, at 5:52 AM, Arthur Cater wrote:<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><blockquote type="cite">I'm looking for some help because I'm floundering in trying to program Hemlock.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">I'm using a MacBook Pro, OS 10.6.8, ClozureCL Version 1.7-r15184M (DarwinX8664) <br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">What I'm trying to do is write a format directive that gives a behaviour rather like<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">hyperlinks when used on a customised Hemlock view: text should be highlighted<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(underlined and printed in red) and clicking on it should invoke the function of choice.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">I can get the red and underlining, and get a function invoked. But<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">a) the invocation of the function happens on mouse-up rather than mouse-down<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">b) the invocation does happen on mouse-downwhen in the minibuffer<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">c) when there is just one line of text with no terminating newline, the current-point<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> of the buffer seems to correspond to the previous mouse-down-up sequence<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> rather than the current one<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">d) when there are many lines of text with a terminating newline, the current-point<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> stubbornly stays at buffer end.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">I have searched the Hemlock sources for various things, but I do not understand<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">how a mouse-click gets to move the buffer's buffer-point. Please can somebody<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">explain to me how that is done, or tell me where to look more carefully?<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Below, if anyone cares to look, is the code I have. It will create a hemlock view,<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">if in the listener you type (hemlock::two) you will see a line of text with two words<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">in red and underlined. Clicking on them - or elsewhere - causes informative messages<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">to be written to the listener. If you close the window, make a new one with<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(hemlock::my) and (hemlock::twentytwo) you see many lines of text each with one<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">word red and underlined. I must be doing something wrong :( and would gratefully<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">receive advice.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(I am aware of difficulties ahead, eg interaction with justification directives. I'm<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">not too concerned with those at the moment because I'm trying to build a tool to<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">help with examining datastructures in an application I'm building.)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Thanks in advance for any help I get!<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Arthur<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(in-package hemlock)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defmacro do-objc-array ((itemvar arrayexpr) &body body)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">"Perform BODY with ITEMVAR bound to successive elements of the ObjC array which<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">is value of ARRAYEXPR, while allowing for the possibility it is a null pointer."<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(let ((arrayvar (gensym)) (countvar (gensym)) (indexvar (gensym)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> `(let ((,arrayvar ,arrayexpr))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (unless (ccl::%null-ptr-p ,arrayvar)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (let ((,countvar (#/count ,arrayvar)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (dotimes (,indexvar ,countvar)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (let ((,itemvar (#/objectAtIndex: ,arrayvar ,indexvar))) ,@body)))))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defmacro write-listener (msg &rest args)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(let ((p (gensym)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> `(let ((,p (find 'gui::cocoa-listener-process (ccl:all-processes) :key #'type-of)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (if ,p<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (format (gui::cocoa-listener-process-output-stream ,p) ,msg ,@args)))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defmethod gui::compute-temporary-attributes ((self gui::hemlock-textstorage-text-view))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">nil)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defparameter *my* nil "Gets set to a hemlock-view")<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defparameter *mystream* nil "Gets set to an output stream for the hemlock-view in *MY*")<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defparameter *click-color* nil)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defparameter *underlinedict* nil "Gets set to a ns-mutable-dictionary")<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defparameter *info* nil "Accumulates some debug info")<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defun underlinedict nil "Makes or reuses a ns-mutable-dictionary"<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(or *underlinedict*<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (prog1<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (setf *underlinedict*<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (make-instance 'ns:ns-mutable-dictionary :with-capacity 2))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (setf *click-color* (#/colorWithCalibratedRed:green:blue:alpha: ns:ns-color 1.0 0.2 0.2 1.0))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (#/setObject:forKey: *underlinedict* (#/numberWithInt: ns:ns-number 1)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> #&NSUnderlineStyleAttributeName)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (#/setObject:forKey: *underlinedict* *click-color*<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> #&NSForegroundColorAttributeName))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defcommand "Invoke Click Response" (p) "Responds to 'CLICKABLE' text by invoking its associated function."<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(declare (ignore p))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">;(write-listener "Invoking...~%")<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(gui::execute-in-gui<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (lambda nil<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (gui::assume-cocoa-thread)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (let* ((point (current-point))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (line (mark-line point))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (pos (mark-charpos point))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (pchange (find pos (slot-value line 'hi::charprops-changes) :from-end t :test #'>= :key #'hi::charprops-change-index))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (props (when pchange (hi::charprops-change-plist pchange))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (write-listener "point=~s~%line=~s~%pos=~s~%LastKeyEvent=~s~%" point line pos (last-key-event-typed))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (when (and props (<= pos (+ (getf props :length) (hi::charprops-change-index pchange))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (write-listener "props are ~s, fn is ~s, arg is ~s~%"<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> props (getf props :clickfunction) (getf props :argument)))))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defun my ()<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(gui::execute-in-gui ; Makes the view<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> #'(lambda nil<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (setf hemlock::*my* (gui::find-or-make-hemlock-view nil))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (let ((buffer (hemlock-view-buffer hemlock::*my*)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (underlinedict)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (bind-key "Invoke Click Response" #k"LeftDown" :buffer buffer)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (setf *mystream* (hi:make-hemlock-output-stream (buffer-start-mark buffer) :none)) ))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(my)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defun open-hemlock-output-stream-p (stream)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(and (typep stream 'hemlock::hemlock-output-stream)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (slot-value stream 'hi::mark)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> t))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; --------------------------------------------------------------------------------<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; Redefine methods given in ccl:cocoa-ide;hemlock;src;streams.lisp<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; to ensure that hemlock buffer modification is done in the proper thread<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; --------------------------------------------------------------------------------<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defmethod hi::stream-write-char ((stream hi::hemlock-output-stream) char)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(gui::execute-in-gui<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (lambda nil<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (gui::assume-cocoa-thread)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (funcall (hi::old-lisp-stream-out stream) stream char))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defmethod hi::stream-write-string ((stream hi::hemlock-output-stream) string<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> &optional<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (start 0)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (end (length string)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(gui::execute-in-gui<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (lambda nil<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (gui::assume-cocoa-thread)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (funcall (hi::old-lisp-stream-sout stream) stream string start end))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; --------------------------------------------------------------------------------<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; The ~V/CLICKABLE/ format directive<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; Consumes one or two arguments from the format args list<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; The principal argument is something to be output to the stream.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; By default it is printed as if by PRINC (~A), but the colon modifier causes it<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; to be printed as if by PRIN1 (~S).<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; The prefix argument (corresponding to V) should be a function of one argument<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; or a symbol naming one.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; - If the stream is a hemlock-output-stream that has not been closed, then the<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; text produced for the principal argument will be mouse-sensitive. Clicking on<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; it will cause the function to be invoked with the argument that was printed.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; - On other streams, the prefix argument will be consumed but ignored.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; - If the V prefix is omitted, then no function will be invoked by clicking.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">; --------------------------------------------------------------------------------<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defun clickable (stream arg colon atsign &optional prefix)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(declare (ignorable atsign))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(cond<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> ((open-hemlock-output-stream-p stream)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (let* ((mark (hi:copy-mark (slot-value stream 'hi::mark) :temporary))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (markabsolute (hi::mark-absolute-position mark))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (line (slot-value mark 'hi::line))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (charprops (when prefix `(:font-underline :single :font-color ,*click-color*<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> :clickfunction ,prefix :argument ,arg)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (start (when charprops (slot-value mark 'hi::charpos)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> end)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (if colon (prin1 arg stream) (princ arg stream))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (when charprops<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (let* ((length (- (hi::mark-absolute-position (slot-value stream 'hi::mark)) markabsolute))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (doc (hi::buffer-document (line-buffer line)))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (store (when doc (slot-value doc 'gui::textstorage))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (setf end (slot-value (slot-value stream 'hi::mark) 'hi::charpos))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (setf *info* `(:start ,start :end ,end))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (hi::set-line-charprops line (list* :length length charprops) :start start :end end)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (when doc<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (do-objc-array (layout (#/layoutManagers store))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (ns:with-ns-range (range markabsolute length)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (#/addTemporaryAttributes:forCharacterRange: layout (underlinedict) range))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (gui::perform-edit-change-notification<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> store<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (objc:\@selector #/noteHemlockAttrChangeAtPosition:length:)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> markabsolute length 0)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (setf *info* `(:changes ,(hi::line-charprops-changes line) ,@*info*))))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (t (if colon (prin1 arg stream) (princ arg stream)))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defun twentytwo nil<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(dotimes (k 22)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> (format *mystream*<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> "Try ~v/hemlock::clickable/ out.~%" :that (format nil "~5,'xD" k))))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(defun two nil<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">(format *mystream*<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> "Try ~v/hemlock::clickable/ or ~v/hemlock::clickable/ now."<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"> :first :one :second :two))<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">_______________________________________________<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">Openmcl-devel mailing list<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><a href="mailto:Openmcl-devel@clozure.com">Openmcl-devel@clozure.com</a><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><a href="http://clozure.com/mailman/listinfo/openmcl-devel">http://clozure.com/mailman/listinfo/openmcl-devel</a><br></blockquote></blockquote><blockquote type="cite"><br></blockquote><br></div></blockquote></div><br></body></html>