unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* elisp, replace-regexp and re-search-forward
@ 2007-10-01  7:56 Seweryn Kokot
  0 siblings, 0 replies; 7+ messages in thread
From: Seweryn Kokot @ 2007-10-01  7:56 UTC (permalink / raw)
  To: help-gnu-emacs

Hello,

I try to write a function that operate on a region and which inserts a newline
between each line, for example.
   from:
aaa
bbb
ccc
   to:
aaa

bbb

ccc
-------

My first attempt is the following function which does the job
(defun my-test (beg end)
  (interactive "r")
  (replace-regexp "\n" "\n\n" nil beg end))

however in Emacs help for replace-regexp I see that it is not good to use
replace-regexp function. Instead it is recommended to use re-search-forward and
replace-match. So I try with such a function, but it does not work.

(defun my-test-two (beg end)
  (interactive "r")
    (while (re-search-forward "\n" end t)
      (replace-match "\n\n" nil nil)))

Any idea what is wrong?

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

* RE: elisp, replace-regexp and re-search-forward
@ 2007-10-01  9:08 Bourgneuf Francois
  0 siblings, 0 replies; 7+ messages in thread
From: Bourgneuf Francois @ 2007-10-01  9:08 UTC (permalink / raw)
  To: help-gnu-emacs

 You don't need to use a regexp.
(query-replace "\n" "\n\n") will do the job
Bour9

> -----Message d'origine-----
> De : 
> help-gnu-emacs-bounces+francois.bourgneuf=groupe-mma.fr@gnu.or
> g 
> [mailto:help-gnu-emacs-bounces+francois.bourgneuf=groupe-mma.f
> r@gnu.org] De la part de Seweryn Kokot
> Envoyé : lundi 1 octobre 2007 09:57
> À : help-gnu-emacs@gnu.org
> Objet : elisp, replace-regexp and re-search-forward
> 
> Hello,
> 
> I try to write a function that operate on a region and which 
> inserts a newline
> between each line, for example.
>    from:
> aaa
> bbb
> ccc
>    to:
> aaa
> 
> bbb
> 
> ccc
> -------
> 
> My first attempt is the following function which does the job
> (defun my-test (beg end)
>   (interactive "r")
>   (replace-regexp "\n" "\n\n" nil beg end))
> 
> however in Emacs help for replace-regexp I see that it is not 
> good to use
> replace-regexp function. Instead it is recommended to use 
> re-search-forward and
> replace-match. So I try with such a function, but it does not work.
> 
> (defun my-test-two (beg end)
>   (interactive "r")
>     (while (re-search-forward "\n" end t)
>       (replace-match "\n\n" nil nil)))
> 
> Any idea what is wrong?
> 
> 
> 
> 
> _______________________________________________
> help-gnu-emacs mailing list
> help-gnu-emacs@gnu.org
> http://lists.gnu.org/mailman/listinfo/help-gnu-emacs
> 
> 

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

* Re: elisp, replace-regexp and re-search-forward
       [not found] <mailman.1531.1191229744.18990.help-gnu-emacs@gnu.org>
@ 2007-10-01 11:36 ` weber
  2007-10-01 16:11   ` Seweryn Kokot
  0 siblings, 1 reply; 7+ messages in thread
From: weber @ 2007-10-01 11:36 UTC (permalink / raw)
  To: help-gnu-emacs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="us-ascii", Size: 1850 bytes --]

On Oct 1, 6:08 am, "Bourgneuf Francois" <francois.bourgn...@groupe-
mma.fr> wrote:
>  You don't need to use a regexp.
> (query-replace "\n" "\n\n") will do the job
> Bour9
>
> > -----Message d'origine-----
> > De :
> > help-gnu-emacs-bounces+francois.bourgneuf=groupe-mma...@gnu.or
> > g
> > [mailto:help-gnu-emacs-bounces+francois.bourgneuf=groupe-mma.f
> > r...@gnu.org] De la part de Seweryn Kokot
> > Envoyé : lundi 1 octobre 2007 09:57
> > À : help-gnu-em...@gnu.org
> > Objet : elisp, replace-regexp and re-search-forward
>
> > Hello,
>
> > I try to write a function that operate on a region and which
> > inserts a newline
> > between each line, for example.
> >    from:
> > aaa
> > bbb
> > ccc
> >    to:
> > aaa
>
> > bbb
>
> > ccc
> > -------
>
> > My first attempt is the following function which does the job
> > (defun my-test (beg end)
> >   (interactive "r")
> >   (replace-regexp "\n" "\n\n" nil beg end))
>
> > however in Emacs help for replace-regexp I see that it is not
> > good to use
> > replace-regexp function. Instead it is recommended to use
> > re-search-forward and
> > replace-match. So I try with such a function, but it does not work.
>
> > (defun my-test-two (beg end)
> >   (interactive "r")
> >     (while (re-search-forward "\n" end t)
> >       (replace-match "\n\n" nil nil)))
>
> > Any idea what is wrong?
>
> > _______________________________________________
> > help-gnu-emacs mailing list
> > help-gnu-em...@gnu.org
> >http://lists.gnu.org/mailman/listinfo/help-gnu-emacs

Another version imitates what you would do if you were going to do it
manually (jump one line, press ret, jump one line..) :

(defun insert-lines (beg end)
  (interactive "r")
  (goto-char beg)
  (while (< (point) end)
	(insert "\n")
	(next-line 1)))

Regards,
weber

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

* Re: elisp, replace-regexp and re-search-forward
  2007-10-01 11:36 ` elisp, replace-regexp and re-search-forward weber
@ 2007-10-01 16:11   ` Seweryn Kokot
  2007-10-01 16:21     ` Bastien
       [not found]     ` <mailman.1550.1191255727.18990.help-gnu-emacs@gnu.org>
  0 siblings, 2 replies; 7+ messages in thread
From: Seweryn Kokot @ 2007-10-01 16:11 UTC (permalink / raw)
  To: help-gnu-emacs

weber <hugows@gmail.com> writes:

> Another version imitates what you would do if you were going to do it
> manually (jump one line, press ret, jump one line..) :
>
> (defun insert-lines (beg end)
>   (interactive "r")
>   (goto-char beg)
>   (while (< (point) end)
> 	(insert "\n")
> 	(next-line 1)))
>
> Regards,
> weber

thanks for another approach. However I needed to modify the function a
little. So now I have two working functions

; works
(defun insert-lines (beg end)
  (interactive "r")
  (save-excursion
	(let ((line 1)
		  (region-lines (count-lines beg end)))
	  (goto-char beg)
	  (while (< line region-lines)
		(end-of-line)
		(insert "\n")
		(forward-line)
		(setq line (+ line 1))))))

; works
(defun my-test (beg end)
  (interactive "r")
  (replace-regexp "\n" "\n\n" nil beg end))

and one which doesn't work

(defun insert-empty-lines (beg end)
  (interactive "r")
	(goto-char beg)
	(while (re-search-forward "\n" end t)
	  (replace-match "\n\n" nil nil)))

namely if I select the following region from 1 (mark at 1) to 7 (mark
after 7)

1
2
3
4
5
6
7

I get something like this

1

2

3

4

5
6
7

(note that there is no \n after 5 and 6). It seems that the replacement
doesn't reach the end bound which was after number 7.  Any ideas what is
wrong?

regards,
-- 
Seweryn Kokot

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

* Re: elisp, replace-regexp and re-search-forward
  2007-10-01 16:11   ` Seweryn Kokot
@ 2007-10-01 16:21     ` Bastien
       [not found]     ` <mailman.1550.1191255727.18990.help-gnu-emacs@gnu.org>
  1 sibling, 0 replies; 7+ messages in thread
From: Bastien @ 2007-10-01 16:21 UTC (permalink / raw)
  To: Seweryn Kokot; +Cc: help-gnu-emacs

Seweryn Kokot <s.kokot@po.opole.pl> writes:

> and one which doesn't work
>
> (defun insert-empty-lines (beg end)
>   (interactive "r")
> 	(goto-char beg)
> 	(while (re-search-forward "\n" end t)
> 	  (replace-match "\n\n" nil nil)))

Since your modifying the text within the region, the region end moves.
You should perhaps use markers to track these moves:

(defun insert-empty-lines (beg end)
  (interactive "r")
  (let* ((end-marker (make-marker))
	 (end-marker (set-marker endm end)))
    (save-excursion
      (goto-char beg)
      (while (re-search-forward "\n" end-marker t)
	(replace-match "\n\n" nil nil)))))

See (info "(elisp)Markers")

-- 
Bastien

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

* Re: elisp, replace-regexp and re-search-forward
       [not found]     ` <mailman.1550.1191255727.18990.help-gnu-emacs@gnu.org>
@ 2007-10-01 20:03       ` weber
  2007-10-01 20:06       ` weber
  1 sibling, 0 replies; 7+ messages in thread
From: weber @ 2007-10-01 20:03 UTC (permalink / raw)
  To: help-gnu-emacs

On Oct 1, 1:21 pm, Bastien <b...@altern.org> wrote:
> Seweryn Kokot <s.ko...@po.opole.pl> writes:
> > and one which doesn't work
>
> > (defun insert-empty-lines (beg end)
> >   (interactive "r")
> >    (goto-char beg)
> >    (while (re-search-forward "\n" end t)
> >      (replace-match "\n\n" nil nil)))
>
> Since your modifying the text within the region, the region end moves.
> You should perhaps use markers to track these moves:
>
> (defun insert-empty-lines (beg end)
>   (interactive "r")
>   (let* ((end-marker (make-marker))
>          (end-marker (set-marker endm end)))
>     (save-excursion
>       (goto-char beg)
>       (while (re-search-forward "\n" end-marker t)
>         (replace-match "\n\n" nil nil)))))
>
> See (info "(elisp)Markers")
>
> --
> Bastien

I had totally missed that. Please forgive me for posting the snippet
of malfunctioning code.
-weber

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

* Re: elisp, replace-regexp and re-search-forward
       [not found]     ` <mailman.1550.1191255727.18990.help-gnu-emacs@gnu.org>
  2007-10-01 20:03       ` weber
@ 2007-10-01 20:06       ` weber
  1 sibling, 0 replies; 7+ messages in thread
From: weber @ 2007-10-01 20:06 UTC (permalink / raw)
  To: help-gnu-emacs

On Oct 1, 1:21 pm, Bastien <b...@altern.org> wrote:
> Seweryn Kokot <s.ko...@po.opole.pl> writes:
> > and one which doesn't work
>
> > (defun insert-empty-lines (beg end)
> >   (interactive "r")
> >    (goto-char beg)
> >    (while (re-search-forward "\n" end t)
> >      (replace-match "\n\n" nil nil)))
>
> Since your modifying the text within the region, the region end moves.
> You should perhaps use markers to track these moves:
>
> (defun insert-empty-lines (beg end)
>   (interactive "r")
>   (let* ((end-marker (make-marker))
>          (end-marker (set-marker endm end)))
>     (save-excursion
>       (goto-char beg)
>       (while (re-search-forward "\n" end-marker t)
>         (replace-match "\n\n" nil nil)))))
>
> See (info "(elisp)Markers")
>
> --
> Bastien

I was testing that here and it looks like the first "end-marker"
should be "endm".
Cheers!
weber

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

end of thread, other threads:[~2007-10-01 20:06 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.1531.1191229744.18990.help-gnu-emacs@gnu.org>
2007-10-01 11:36 ` elisp, replace-regexp and re-search-forward weber
2007-10-01 16:11   ` Seweryn Kokot
2007-10-01 16:21     ` Bastien
     [not found]     ` <mailman.1550.1191255727.18990.help-gnu-emacs@gnu.org>
2007-10-01 20:03       ` weber
2007-10-01 20:06       ` weber
2007-10-01  9:08 Bourgneuf Francois
  -- strict thread matches above, loose matches on Subject: below --
2007-10-01  7:56 Seweryn Kokot

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).