Skip to content

Commit 4babd18

Browse files
committed
Fix: avoid switching buffers when loop for each irc buffer
other improvements: - remove earmuffs on global variables for consistency with elisp convention - use regex to get position of latest message instead of the ad hoc one (I need to use `(end-of-line)' for triple times in order to go to the end of line, probably it's a bug in ERC)
1 parent 941ae51 commit 4babd18

File tree

1 file changed

+88
-91
lines changed

1 file changed

+88
-91
lines changed

erc-logger.el

Lines changed: 88 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,28 @@
66
;; |___/ |___/
77

88
(require 'erc)
9-
(require 'cl)
9+
(require 'cl-lib)
1010

1111
(defgroup erc-logger nil
1212
"erc-logger customizations."
1313
:group 'erc
1414
:package-version '(erc-logger . "0.3"))
1515

16-
(defcustom *erc-logger-log-directory*
16+
(defcustom erc-logger-log-directory
1717
"~/erc/log"
1818
"This directory is used for storing messages of the current day,
1919
it is recommanded to be set on an SSD. "
2020
:type 'string
2121
:group 'erc-logger)
2222

23-
(defcustom *erc-logger-log-other-directory*
23+
(defcustom erc-logger-log-other-directory
2424
"~/erc/otherlog"
2525
"This directory is used for storing all compressed messages organized by date,
2626
it is recommanded to be set on an HDD. "
2727
:type 'string
2828
:group 'erc-logger)
2929

30-
(defcustom *erc-logger-log-begin-time*
30+
(defcustom erc-logger-log-begin-time
3131
"30 sec"
3232
"Time when to run `erc-logger-log-start' at.
3333
To specify a relative time as a string, use numbers followed by units. For
@@ -49,16 +49,16 @@
4949
:type 'string
5050
:group 'erc-logger)
5151

52-
(defcustom *erc-logger-log-interval*
52+
(defcustom erc-logger-log-interval
5353
10
5454
"The interval (second) to run `erc-log-buffers' repeatedly."
5555
:type 'float
5656
:group 'erc-logger)
5757

58-
(defvar *erc-logger-log-timer* nil)
59-
(defvar *erc-logger-log-date* nil)
60-
(defvar *erc-logger-log-todays-date* nil)
61-
(defvar *erc-logger-irc-buffer-size-map* nil)
58+
(defvar erc-logger-log-timer nil)
59+
(defvar erc-logger-log-date nil)
60+
(defvar erc-logger-log-todays-date nil)
61+
(defvar erc-logger-irc-buffer-size-map nil)
6262

6363
(defun erc-logger-write-file-immut (filename)
6464
(let ((cur-buffer (current-buffer)))
@@ -74,102 +74,99 @@
7474
(defun erc-logger-end-of-messages ()
7575
(save-excursion
7676
(goto-char (point-max))
77-
(previous-line)
78-
(end-of-line)
79-
(end-of-line)
80-
(end-of-line)
77+
(search-backward-regexp "\nERC>[^z-a]*?")
8178
(point)))
8279

8380
(defun erc-logger-log-start ()
8481
(interactive)
85-
(if (and *erc-logger-log-directory* *erc-logger-log-other-directory*)
86-
(setq *erc-logger-log-directory* (file-name-as-directory *erc-logger-log-directory*)
87-
*erc-logger-log-other-directory* (file-name-as-directory *erc-logger-log-other-directory*))
88-
(error "Invalid directory name, please set variable `*erc-logger-log-directory*' and `*erc-logger-log-other-directory*' properly."))
89-
(unless (and (file-exists-p *erc-logger-log-directory*)
90-
(file-exists-p *erc-logger-log-other-directory*))
91-
(mkdir *erc-logger-log-directory* "-p")
92-
(mkdir *erc-logger-log-other-directory* "-p"))
82+
(if (and erc-logger-log-directory erc-logger-log-other-directory)
83+
(setq erc-logger-log-directory (file-name-as-directory erc-logger-log-directory)
84+
erc-logger-log-other-directory (file-name-as-directory erc-logger-log-other-directory))
85+
(error "Invalid directory name, please set variable `erc-logger-log-directory' and `erc-logger-log-other-directory' properly."))
86+
(unless (and (file-exists-p erc-logger-log-directory)
87+
(file-exists-p erc-logger-log-other-directory))
88+
(mkdir erc-logger-log-directory t)
89+
(mkdir erc-logger-log-other-directory t))
9390
;; initialize hash table
94-
(setq *erc-logger-irc-buffer-size-map* (make-hash-table :test 'equal))
91+
(setq erc-logger-irc-buffer-size-map (make-hash-table :test 'equal))
9592
(dolist (erc-buffer (erc-buffer-list))
9693
(save-excursion
97-
(switch-to-buffer erc-buffer)
98-
(unless (gethash erc-buffer *erc-logger-irc-buffer-size-map*)
99-
(puthash erc-buffer (erc-logger-end-of-messages)
100-
*erc-logger-irc-buffer-size-map*))))
101-
(setq *erc-logger-log-todays-date* (format-time-string "%Y-%m-%d")
102-
*erc-logger-log-timer* (run-at-time "1 sec" *erc-logger-log-interval* #'erc-log-buffers)))
94+
(with-current-buffer erc-buffer
95+
(unless (gethash erc-buffer erc-logger-irc-buffer-size-map)
96+
(puthash erc-buffer (erc-logger-end-of-messages)
97+
erc-logger-irc-buffer-size-map)))))
98+
(setq erc-logger-log-todays-date (format-time-string "%Y-%m-%d")
99+
erc-logger-log-timer (run-at-time erc-logger-log-begin-time erc-logger-log-interval #'erc-log-buffers)))
103100

104101
(defun erc-logger-log-stop ()
105102
(interactive)
106-
(when *erc-logger-log-timer*
107-
(cancel-timer *erc-logger-log-timer*)))
103+
(when erc-logger-log-timer
104+
(cancel-timer erc-logger-log-timer)))
108105

109106
(defun erc-log-buffers ()
110-
(if (and *erc-logger-log-directory*
111-
(file-directory-p *erc-logger-log-directory*))
107+
(if (and erc-logger-log-directory
108+
(file-directory-p erc-logger-log-directory))
112109
(progn (save-excursion
113110
(dolist (erc-buffer (erc-buffer-list))
114-
(switch-to-buffer erc-buffer)
115-
(let* ((file-name (concat (buffer-name erc-buffer)
116-
(format-time-string "_%Y-%m-%d.txt")))
117-
(file-full-path (concat *erc-logger-log-directory*
118-
"/" file-name))
119-
(current-message-point (gethash erc-buffer *erc-logger-irc-buffer-size-map*))
120-
(end-of-message-point (erc-logger-end-of-messages)))
121-
(cl-flet ((save-buffer-graceful
122-
nil (unless current-message-point
123-
(let ((new-current-message-point (erc-logger-end-of-messages)))
124-
(puthash erc-buffer new-current-message-point
125-
*erc-logger-irc-buffer-size-map*)
126-
(setq current-message-point new-current-message-point)))
127-
(if (file-exists-p file-full-path)
128-
(when (not (= end-of-message-point current-message-point))
129-
(append-to-file current-message-point end-of-message-point file-full-path))
130-
(erc-logger-write-file-immut file-full-path))
131-
(when (not (= end-of-message-point current-message-point))
132-
(puthash erc-buffer end-of-message-point *erc-logger-irc-buffer-size-map*)))
133-
(buffer-read-write nil
134-
(setq-local inhibit-read-only t))
135-
(buffer-read-only nil
136-
(setq-local inhibit-read-only nil))
137-
(clear-previous-days-messages
138-
nil
139-
(delete-region (point-min) current-message-point)
140-
(setq end-of-message-point (erc-logger-end-of-messages)
141-
current-message-point end-of-message-point)
142-
(puthash erc-buffer end-of-message-point *erc-logger-irc-buffer-size-map*)))
143-
(if (string= *erc-logger-log-todays-date* (format-time-string "%Y-%m-%d"))
144-
(save-buffer-graceful)
111+
(with-current-buffer erc-buffer
112+
(let* ((file-name (concat (buffer-name erc-buffer)
113+
(format-time-string "_%Y-%m-%d.txt")))
114+
(file-full-path (concat erc-logger-log-directory
115+
"/" file-name))
116+
(current-message-point (gethash erc-buffer erc-logger-irc-buffer-size-map))
117+
(end-of-message-point (erc-logger-end-of-messages)))
118+
(cl-flet ((save-buffer-graceful
119+
nil (unless current-message-point
120+
(let ((new-current-message-point (erc-logger-end-of-messages)))
121+
(puthash erc-buffer new-current-message-point
122+
erc-logger-irc-buffer-size-map)
123+
(setq current-message-point new-current-message-point)))
124+
(if (file-exists-p file-full-path)
125+
(when (not (= end-of-message-point current-message-point))
126+
(append-to-file current-message-point end-of-message-point file-full-path))
127+
(erc-logger-write-file-immut file-full-path))
128+
(when (not (= end-of-message-point current-message-point))
129+
(puthash erc-buffer end-of-message-point erc-logger-irc-buffer-size-map)))
130+
(buffer-read-write nil
131+
(setq-local inhibit-read-only t))
132+
(buffer-read-only nil
133+
(setq-local inhibit-read-only nil))
134+
(clear-previous-days-messages
135+
nil
136+
(delete-region (point-min) current-message-point)
137+
(setq end-of-message-point (erc-logger-end-of-messages)
138+
current-message-point end-of-message-point)
139+
(puthash erc-buffer end-of-message-point erc-logger-irc-buffer-size-map)))
140+
(if (string= erc-logger-log-todays-date (format-time-string "%Y-%m-%d"))
141+
(save-buffer-graceful)
145142

146-
;; compress log files and mv them to another directory on next day
147-
;; and clear the buffer, save to new files
148-
(progn
149-
(buffer-read-write)
150-
(clear-previous-days-messages)
151-
(buffer-read-only)
152-
(save-buffer-graceful)
153-
(if (directory-name-p *erc-logger-log-other-directory*)
154-
(let* ((dir-name (file-name-as-directory (concat *erc-logger-log-other-directory*
155-
*erc-logger-log-todays-date*))))
156-
(cl-flet ((transfer-file ()
157-
(rename-file file-full-path dir-name t)
158-
(unless
159-
(= 0 (shell-command
160-
(concat "gzip -9f "
161-
dir-name
162-
file-name)))
163-
(message "failed to compress file!"))))
164-
(if (file-exists-p dir-name)
165-
(transfer-file)
166-
(progn (make-directory dir-name)
167-
(when (file-exists-p dir-name)
168-
(transfer-file))))))
169-
(error "Invalid directory name, please set variable `*erc-logger-log-other-directory*' properly.")))
170-
)))))
171-
(unless (string= *erc-logger-log-todays-date* (format-time-string "%Y-%m-%d"))
172-
(setq *erc-logger-log-todays-date* (format-time-string "%Y-%m-%d"))))
173-
(error "Invalid directory name, please set variable `*erc-logger-log-directory*' properly.")))
143+
;; compress log files and mv them to another directory on next day
144+
;; and clear the buffer, save to new files
145+
(progn
146+
(buffer-read-write)
147+
(clear-previous-days-messages)
148+
(buffer-read-only)
149+
(save-buffer-graceful)
150+
(if (directory-name-p erc-logger-log-other-directory)
151+
(let* ((dir-name (file-name-as-directory (concat erc-logger-log-other-directory
152+
erc-logger-log-todays-date))))
153+
(cl-flet ((transfer-file ()
154+
(rename-file file-full-path dir-name t)
155+
(unless
156+
(= 0 (shell-command
157+
(concat "gzip -9f "
158+
dir-name
159+
file-name)))
160+
(message "failed to compress file!"))))
161+
(if (file-exists-p dir-name)
162+
(transfer-file)
163+
(progn (make-directory dir-name)
164+
(when (file-exists-p dir-name)
165+
(transfer-file))))))
166+
(error "Invalid directory name, please set variable `erc-logger-log-other-directory' properly.")))
167+
))))))
168+
(unless (string= erc-logger-log-todays-date (format-time-string "%Y-%m-%d"))
169+
(setq erc-logger-log-todays-date (format-time-string "%Y-%m-%d"))))
170+
(error "Invalid directory name, please set variable `erc-logger-log-directory' properly.")))
174171

175172
(provide 'erc-logger)

0 commit comments

Comments
 (0)