help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Adding `#' at each new line with text until the end of the file


From: Pascal J. Bourguignon
Subject: Re: Adding `#' at each new line with text until the end of the file
Date: Wed, 08 Dec 2010 15:08:43 -0000
User-agent: Gnus/5.101 (Gnus v5.10.10) Emacs/23.1 (darwin)

Merciadri Luca <Luca.Merciadri@student.ulg.ac.be> writes:

> pjb@informatimago.com (Pascal J. Bourguignon) writes:
>
>> Merciadri Luca <Luca.Merciadri@student.ulg.ac.be> writes:
>>
>>> pjb@informatimago.com (Pascal J. Bourguignon) writes:
>>>
>>>>
>>>> So:
>>>>     (while (< (point) (point-max))
>>>>         (when (looking-at ".")
>>>>             (insert "#"))
>>>>         (forward-line))
>>>>
>>>
>>> After extensive testing,
>>>
>>> ==
>>> (defun fildi ()
>>>   (find-file "~/Sayings")
>>>   (goto-char (point-min))
>>>   (while (< (point) (point-max))
>>>     (when (looking-at ".")
>>>       (insert "#"))
>>>     (forward-line)) 
>>>   )
>>> ==
>>>
>>> does not work. When I evaluate it using C-x C-e (in a buffer), it only
>>> says `fildi', which does not look very interesting. What am I doing
>>> wrong? It finds the file; it goes to the beginning of it; while it has
>>> not reached the end of the file, it looks for a line containing a dot
>>> (as every saying ends by a dot); 
>>
>> No.  Did you read the documentation of looking-at?
> No. I should have done it.
>> Because that's
>> what you should do for every new function you see!
> Nice reflex.
>
>> What does the
>> documentation of looking-at says about the arguments of the function?
>>
>> (looking-at ".")  tests whether the cursor is at position where there
>> is any character, but a newline.  That is, it tests whether the line
>> contains something, since we should be at the beginning of the line,
>> because this is what point-min should be at (actually, unless you
>> narrow the region from the middle of a line), and this is ensured by
>> forward-line.
> Okay, thanks.
>>
>>> while this works, it inserts a "#"
>>> and, as the cursor is at the beginning of the line, it inserts a "#"
>>> at the beginning of the line. It also goes to the next line. And?
>>
>> Wasn't it what you asked for?  Otherwise I didn't understand what you
>> wanted.
> Sure, but, as I explained in my previous message, it does not even
> modify the Sayings file. Why?

Because you didn't instruct the program to modify the file.
Read the documentation of insert, for example.  Does it mention files?
What does insert modify?



Here is a macro that could be useful:

(require 'cl)
(defmacro* with-file (file-and-options &body body)
  "Processes BODY with a buffer on the given file.
DO:              find-file or find-file-literally, process body, and
                 optionally save the buffer and kill it.
                 save is not done if body exits exceptionnaly.
                 kill is always done as specified.
FILE-AND-OPTION: either an atom evaluated to a path,
                 or (path &key (save t) (kill t) (literal nil))
"
  (if (atom file-and-options)
      `(with-file (,file-and-options) ,@body)
    ;; destructuring-bind is broken, we cannot give anything else than nil
    ;; as default values:
    (destructuring-bind (path &key (save nil savep) (kill nil killp)
                              (literal nil literalp))
        file-and-options
      (unless savep (setf save t))
      (unless killp (setf kill t))
      `(unwind-protect
           (progn
             (,(if literal 'find-file-literally 'find-file) ,path)
             (prog1 (save-excursion ,@body)
               ,(when save `(save-buffer 1))))
         ,(when kill
            `(kill-buffer (current-buffer)))))))


-- 
__Pascal Bourguignon__
http://www.informatimago.com


reply via email to

[Prev in Thread] Current Thread [Next in Thread]