unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* A little lisp help
@ 2003-01-21 19:06 Peter Lee
  2003-01-21 19:24 ` Henrik Enberg
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Peter Lee @ 2003-01-21 19:06 UTC (permalink / raw)


I'm learning lisp atm, and decided to write a macro to insert curly
braces around a region and re-indent.

So for this,

if (x)
    y=0;

z=0;
w=0;
*

setting mark at begining of line y=0 and setting point at * would
produce the following.

if (x)
    {
    y=0;

    z=0;
    w=0;
    }

This is what I have so far, but it doesn't work very well.

(defun curly-brace-region (mark point)
  "Inserts curly braces around region and indents"
  (interactive "r")
  (message "point=%d, mark=%d" point mark)
  (goto-char mark)
  (insert-string "{")
  (newline-and-indent)
  (goto-char point)
  (insert-string "}")
  (newline-and-indent)
  (fill-region mark point))

There's probably functions to make this trivial and I'm just missing
them due to lack of familiarity.

TIA.

^ permalink raw reply	[flat|nested] 13+ messages in thread
* RE: A little lisp help
@ 2003-01-24 16:51 Bingham, Jay
  0 siblings, 0 replies; 13+ messages in thread
From: Bingham, Jay @ 2003-01-24 16:51 UTC (permalink / raw)


On Friday, January 24, 2003 1:39 AM Jim Janney wrote:

>Christopher J. White <chris@grierwhite.com> wrote:
>
>> You have to be careful when using region end-points
>> and inserting text.  m and p above are numerical values
>> that reference offsets from the beginning of the file and
>> do not "move" when text is inserted before them.
>> 
>> Use markers if you really want to be able to move around
>> and insert text, but the best method was the previous
>> suggestion to narrow-to-region.  
>
>Markers are the most general solution, but you can sometimes get by
>without them by making changes in reverse buffer order.  For example,
in
>this case
>
>    (goto-char p)
>    (insert "}\n")
>    (save-excursion (goto-char m) (insert "{\n"))
>    (indent-region m (point) nil))
>
>Note that (interactive "r") always passes the arguments smallest first,
>but for a function that might also be called from lisp code you'd want
>to check that m really comes before p.  I prefer to call the values
>"start" and "end" since they may not be the actual point and mark.

Markers are indeed a general solution, however, there are some
circumstances where they do not work as advertized.  In Emacs 20.4 I
found that the replace-match function does not update markers.  (I have
not tried it in Emacs 21).

If the modifications will occur entirely before the location that needs
to be preserved, a simple method for doing this is to calculate the
distance of the location from the end of the buffer before doing the
modifications, then when the modifications are complete the new value of
the location can be calculated by subtracting offset from the new end of
the buffer.  For example:

(setq offset-from-eob (- point-max point-I-want-to-remember))
 ... the modifications happen here ...
(setq point-I-want-to-remember (- point-max offset-from-eob))

-_
J_)
C_)ingham
.    HP - NonStop Austin Software & Services - Software Quality
Assurance
.    Austin, TX
. "Language is the apparel in which your thoughts parade in public.
.  Never clothe them in vulgar and shoddy attire."     -Dr. George W.
Crane-

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2003-01-27 14:48 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-01-21 19:06 A little lisp help Peter Lee
2003-01-21 19:24 ` Henrik Enberg
2003-01-21 20:13 ` Stefan Monnier <foo@acm.com>
2003-01-21 20:32   ` Peter Lee
2003-01-21 20:41     ` Barry Margolin
2003-01-21 21:52 ` Peter Lee
2003-01-21 22:34   ` Peter Lee
2003-01-22 22:55     ` Christopher J. White
2003-01-22 23:02       ` Stefan Monnier <foo@acm.com>
2003-01-24  7:39       ` Jim Janney
2003-01-27 14:48         ` Stefan Monnier <foo@acm.com>
2003-01-22  8:24   ` Kai Großjohann
  -- strict thread matches above, loose matches on Subject: below --
2003-01-24 16:51 Bingham, Jay

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).