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: Joost Kremers
Subject: Re: Problem with simple script to clean out an ERC buffer
Date: Wed, 06 Jun 2018 14:45:24 +0200
User-agent: mu4e 1.1.0; emacs 26.1.50


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

--
Joost Kremers
Life has its moments



reply via email to

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