[Openmcl-devel] Alternative parens
Glen Foy
lisp at clairvaux.org
Fri Apr 26 12:23:57 PDT 2013
Bracket highlighting would be easy to get. You could make these two mods in update-paren-highlight (cocoa-editor.lisp):
;; *** mod:
(cond ((or (eql (hi::next-character point) #\()
(eql (hi::next-character point) #\[))
;; *** mod:
((or (eql (hi::previous-character point) #\))
(eql (hi::previous-character point) #\]))
To do evaluation with brackets you could do char substitution, parens for brackets, before sending the string returned by region-to-string to CCL for evaluation. That would be in hemlock::eval-region (listener.lisp).
The other problem sounds like a lot of work.
-- Glen
On Apr 26, 2013, at 12:53 PM, Ron Garret <ron at flownet.com> wrote:
> On my system, C-M doesn't do anything:
>
> ? (hi::get-command #k"C-M" :mode "editor")
> NIL
>
> But I'm a mouser, not an emacser, so that's not really what I care about. What I want is matching-paren highlighting and editor-eval-sexpr to work. Double-clicking on a close-bracket to highlight a sexpr would be nice too.
>
> Actually, what I *really* want is not to use brackets as parens (though that would be nice too) but for «balanced quotes» to work. I have reader macros for balanced quotes that do the Right Thing. I use them to embed code written in other languages, mainly Javascript. This way, if there is a double quote in the embedded string I don't have to escape it. The problem is that if there's a semicolon in the embedded string, Hemlock treats it as a Lisp comment because it doesn't know it's inside a string. If there's an unbalanced paren after the semicolon, that throws off paren matching, e.g.:
>
> (defvar *js-template* «
>
> var s = "foo"; // Using balanced quotes means you don't need to escape double quotes in the embedded string
> function foo() {
> for (var i=1; i<10; i++) ...; // Hemlock misinterprets on this line and screws up syntax highlighting
> }
>
> »)
>
> Here's the balanced quote reader code in case you want to play around with this:
>
> (defun make-string-reader (c1 c2)
> (lambda (stream c)
> (declare (ignore c))
> (with-output-to-string (s)
> (loop for c = (read-char stream)
> with cnt = 1
> if (eql c c1) do (incf cnt)
> else if (eql c c2) do (decf cnt)
> until (and (eql c c2) (eql cnt 0))
> do (princ c s)))))
>
> (set-macro-character #\« (make-string-reader #\« #\»))
>
> rg
>
>
> On Apr 26, 2013, at 6:55 AM, Glen Foy wrote:
>
>> This works once you define the character attributes:
>>
>> With point at the start the form shown below, C-M f will move point to the end of the form, and then C-M b will move you back to the start:
>>
>> [foo [bar]] [foo [bar]]
>> ^ ^
>>
>> If the attributes are not defined, C-M f will move you to the end of 'foo':
>>
>> [foo [bar]]
>> ^
>>
>> The nested form also seems to work appropriately when the attributes are defined. The "Forward Form" command calls the basic hemlock function, hemlock::form-offset.
>>
>> What functionality are you not getting?
>>
>> -- Glen
>>
>> On Apr 25, 2013, at 8:44 PM, Ron Garret <ron at flownet.com> wrote:
>>
>>> Looking at the code in
>>>
>>> cocoa-ide/hemlock/src/defsyn.lisp
>>>
>>> it would appear that if one did, e.g.:
>>>
>>> (setf (hi::character-attribute :lisp-syntax #\[) :open-paren)
>>> (setf (hi::character-attribute :lisp-syntax #\]) :close-paren)
>>>
>>> that the editor should then treat square-bracketed expressions the same as paren-bracketed ones. But it doesn't seem to work. What is the right way to get Hemlock to recognize other kinds of balanced delimiters?
>>>
>>> Thanks,
>>> rg
>>>
>>> _______________________________________________
>>> Openmcl-devel mailing list
>>> Openmcl-devel at clozure.com
>>> http://clozure.com/mailman/listinfo/openmcl-devel
>>
>> _______________________________________________
>> Openmcl-devel mailing list
>> Openmcl-devel at clozure.com
>> http://clozure.com/mailman/listinfo/openmcl-devel
>
More information about the Openmcl-devel
mailing list