1;;; erc-truncate.el --- Functions for truncating ERC buffers -*- lexical-binding: t; -*- 2 3;; Copyright (C) 2003-2004, 2006-2021 Free Software Foundation, Inc. 4 5;; Author: Andreas Fuchs <asf@void.at> 6;; Maintainer: Amin Bandali <bandali@gnu.org> 7;; URL: https://www.emacswiki.org/emacs/ErcTruncation 8;; Keywords: IRC, chat, client, Internet, logging 9 10;; This file is part of GNU Emacs. 11 12;; GNU Emacs is free software: you can redistribute it and/or modify 13;; it under the terms of the GNU General Public License as published by 14;; the Free Software Foundation, either version 3 of the License, or 15;; (at your option) any later version. 16 17;; GNU Emacs is distributed in the hope that it will be useful, 18;; but WITHOUT ANY WARRANTY; without even the implied warranty of 19;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20;; GNU General Public License for more details. 21 22;; You should have received a copy of the GNU General Public License 23;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. 24 25;;; Commentary: 26 27;; This implements buffer truncation (and optional log file writing 28;; support for the Emacs IRC client. Use `erc-truncate-mode' to switch 29;; on. Use `erc-enable-logging' to enable logging of the stuff which 30;; is getting truncated. 31 32;;; Code: 33 34(require 'erc) 35 36(defgroup erc-truncate nil 37 "Truncate buffers when they reach a certain size." 38 :group 'erc) 39 40(defcustom erc-max-buffer-size 30000 41 "Maximum size in chars of each ERC buffer. 42Used only when auto-truncation is enabled. 43\(see `erc-truncate-buffer' and `erc-insert-post-hook')." 44 :type 'integer) 45 46;;;###autoload(autoload 'erc-truncate-mode "erc-truncate" nil t) 47(define-erc-module truncate nil 48 "Truncate a query buffer if it gets too large. 49This prevents the query buffer from getting too large, which can 50bring any grown Emacs to its knees after a few days worth of 51tracking heavy-traffic channels." 52 ;;enable 53 ((add-hook 'erc-insert-post-hook #'erc-truncate-buffer)) 54 ;; disable 55 ((remove-hook 'erc-insert-post-hook #'erc-truncate-buffer))) 56 57;;;###autoload 58(defun erc-truncate-buffer-to-size (size &optional buffer) 59 "Truncates the buffer to the size SIZE. 60If BUFFER is not provided, the current buffer is assumed. The deleted 61region is logged if `erc-logging-enabled' returns non-nil." 62 ;; If buffer is non-nil, but get-buffer does not return anything, 63 ;; then this is a bug. If buffer is a buffer name, get the buffer 64 ;; object. If buffer is nil, use the current buffer. 65 (if (not buffer) 66 (setq buffer (current-buffer)) 67 (unless (get-buffer buffer) 68 (error "erc-truncate-buffer-to-size: %S is not a buffer" buffer))) 69 (when (> (buffer-size buffer) (+ size 512)) 70 (with-current-buffer buffer 71 ;; Note that when erc-insert-post-hook runs, the buffer is 72 ;; narrowed to the new message. So do this delicate widening. 73 ;; I am not sure, I think this was not recommended behavior in 74 ;; Emacs 20. 75 (save-restriction 76 (widen) 77 (let ((end (- erc-insert-marker size))) 78 ;; truncate at line boundaries 79 (goto-char end) 80 (beginning-of-line) 81 (setq end (point)) 82 ;; try to save the current buffer using 83 ;; `erc-save-buffer-in-logs'. We use this, in case the 84 ;; user has both `erc-save-buffer-in-logs' and 85 ;; `erc-truncate-buffer' in `erc-insert-post-hook'. If 86 ;; this is the case, only the non-saved part of the current 87 ;; buffer should be saved. Rather than appending the 88 ;; deleted part of the buffer to the log file. 89 ;; 90 ;; Alternatively this could be made conditional on: 91 ;; (not (memq 'erc-save-buffer-in-logs 92 ;; erc-insert-post-hook)) 93 ;; Comments? 94 (when (and (boundp 'erc-enable-logging) 95 erc-enable-logging 96 (erc-logging-enabled buffer)) 97 (erc-save-buffer-in-logs)) 98 ;; disable undoing for the truncating 99 (buffer-disable-undo) 100 (let ((inhibit-read-only t)) 101 (delete-region (point-min) end))) 102 (buffer-enable-undo))))) 103 104;;;###autoload 105(defun erc-truncate-buffer () 106 "Truncates the current buffer to `erc-max-buffer-size'. 107Meant to be used in hooks, like `erc-insert-post-hook'." 108 (interactive) 109 (erc-truncate-buffer-to-size erc-max-buffer-size)) 110 111(provide 'erc-truncate) 112;;; erc-truncate.el ends here 113;; 114;; Local Variables: 115;; generated-autoload-file: "erc-loaddefs.el" 116;; End: 117