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