I'm curious what you don't like about the automatic insertion scheme
that you talked about. I'm using Parenedit with emacs and I'm quite
happy with it. I think the scheme is quite simple... whenever you type
'(', it inserts ')'. Similarly with '[' and '{'.
  -Patrick

On Sep 26, 7:51 pm, blais <bl...@furius.ca> wrote:
> Hi,
>
> Writing Clojure code tends to require a larger mix of "()",
> "[]" and "{}" characters than other LISPs I use. This
> sometimes makes it a bit tiring to write those balanced
> expressions.
>
> Writing balanced expressions has been addressed in editors
> mainly by providing the automated insertion of matching
> characters when you type an opening character. This kind of
> support usually also comes with a fancy overloading of the
> default insertion behaviour of those characters to
> automatically skip extraneous ones, locking you into keeping
> everything balanced all the time; I find this extremely
> distracting and annoying to use, because it changes the
> behaviour I expect from my editor (it doesn't *always*
> insert, it is deeply troubling to me). I've tried it, and I
> could not get used to it.
>
> I came up with what I see as a better solution, and it feels
> right to me: a simple command to automatically insert the
> "correct" closing character at the current cursor location.
> For example, invoking the same command 4 times when the cursor
> is at the '|' location in the following expression will do
> the right thing:
>
>   (comment
>     (use '[merced.testinput :only (protocol|
>
> results in:
>
>   (comment
>     (use '[merced.testinput :only (protocol)]))
>
> One advantage of this approach is the absence of "modality,"
> i.e., the behaviour is the same in all contexts, e.g. when I
> type to insert, it always inserts. The new command means
> "insert to close the sequence here, whatever the sequence
> character is."
>
> If you want to try it, here is the corresponding Emacs code:
>
>   (defvar close-matching-chars
>     '( (?( . ?))
>        (?[ . ?])
>        (?{ . ?})
>        (?< . >})
>        ))
>
>   (defun close-matching ()
>     "Close with the most appropriate matching balanced character."
>     (interactive)
>     ;; Scan backwards until it stops.
>     (let ((c (save-excursion
>                (while (ignore-errors (forward-sexp -1) (not (<=
> (point) 1))))
>                (backward-char 1)
>                (string-to-char (thing-at-point 'char))
>                )))
>       (insert-char (cdr (assoc c close-matching-chars)) 1)
>       ))
>
> Bind it to your favourite key (I use 'Ctrl-)' ):
>
>   (global-set-key [(control \))] 'close-matching)
>
> Have fun,

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to