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

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

Re: Problem with simple script to clean out an ERC buffer


From: J. David Boyd
Subject: Re: Problem with simple script to clean out an ERC buffer
Date: Wed, 06 Jun 2018 16:34:20 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (cygwin)

Joost Kremers <joostkremers@fastmail.fm> writes:

> On Wed, Jun 06 2018, J. David Boyd wrote:
>> Yes there is, but it doesn't do anything:  erc-cmd-CLEAR
>>
>> Supposed to "Clear the window content", but the code reads:
>>
>> (defun erc-cmd-CLEAR ()
>>   "Clear the window content."
>>   (recenter 0)
>>   t)
>> (put 'erc-cmd-CLEAR 'process-not-needed t)
>>
>> So not only does it not clear the window, but it seems to be
>> disabled.
>
> No, the erc source mentions that the `process-not-needed' property
> just indicates that the command can be run when the erc process is not
> alive. So it's not disabled.
>
> Since erc.el is part of Emacs, you might ask on the emacs-devel list
> why this command doesn't seem to do what it advertises and whether it
> should be changed to actually "clear the window content".
>
>> Anyway, I like to clear out the buffer so I can reduce my memory
>> footprint.
>> If there is anything important in it, I usually grab it and put it
>> into an org
>> file.
>
> As for your original question, your function has a bug:
>
> ```
>
> (defun clearERCbuffer()
>  (interactive)
>  (previous-line)
>  (end-of-line)
>  (set-mark(point))
>  (beginning-of-buffer)
>  (exchange-point-and-mark)
>  ;; (set-text-properties (point-min) (point-max) nil nil )
>  (delete-region (point-min) (point-max)))
>
> ```
>
> The final function call is `(delete-region (point-min) (point-max))`,
> which means that all the point, mark and region magic you did before
> that is moot, because you're trying to delete the entire buffer.
>
> Which is probably why your getting an error: in the part that you are
> deleting there's most likely (I don't use erc, so I can't check)
> something (a prompt perhaps) that is indeed read-only. What you
> probably want is simply `(delete-region)`, except that START and END
> aren't optional.
>
> So, I would do something like (untested):
>
> ```
> (defun clearERCbuffer()
>  (interactive)
>  (save-mark-and-excursion
>    (forward-line -1)
>    (end-of-line)
>    (delete-region (point-min) (point))))
> ```
>
> Some remarks:
>
> - `save-mark-and-excursion` saves point and mark and restores them
> after executing its body. This means that point should be back to
> where it was before you called the function. Note that if you're on
> Emacs 25, you should replace `save-mark-and-excursion` with
> `save-excursion`.
> - The doc string of `previous-line` suggests it shouldn't be used in
> Lisp programs, so I used `(forward-line -1)` instead.
> - With `delete-region`, there's no need to create an active region
> first. By (temporarily, due to `save-mark-and-excursion`) positioning
> the cursor at the end of the previous line, it's possible to simply
> use (point) as the END argument to `delete-region`.
>
> HTH


Thanks.  So that's why I kept getting told that I had read-only text.  The
prompt is indeed read only, so that makes sense.

All your ideas make sense, thanks very much!





reply via email to

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