summaryrefslogtreecommitdiff
path: root/lisp/erc/erc-fill.el
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>2006-01-29 13:08:58 +0000
committerMiles Bader <miles@gnu.org>2006-01-29 13:08:58 +0000
commit597993cf4433604ea65e40d33ad6cfe83dab2fb7 (patch)
tree9e9cc6dbc0968bc83d7657c17ecade6b56691f89 /lisp/erc/erc-fill.el
parent33c7860d38eb0f5416630b54a7a1b878810a5d3b (diff)
downloademacs-597993cf4433604ea65e40d33ad6cfe83dab2fb7.tar.gz
Revision: emacs@sv.gnu.org/emacs--devo--0--patch-22
Creator: Michael Olson <mwolson@gnu.org> Install ERC.
Diffstat (limited to 'lisp/erc/erc-fill.el')
-rw-r--r--lisp/erc/erc-fill.el197
1 files changed, 197 insertions, 0 deletions
diff --git a/lisp/erc/erc-fill.el b/lisp/erc/erc-fill.el
new file mode 100644
index 00000000000..f945d838c2a
--- /dev/null
+++ b/lisp/erc/erc-fill.el
@@ -0,0 +1,197 @@
+;;; erc-fill.el --- Filling IRC messages in various ways
+
+;; Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+
+;; Author: Andreas Fuchs <asf@void.at>
+;; Mario Lang <mlang@delysid.org>
+;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcFilling
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This package implements filling of messages sent and received. Use
+;; `erc-fill-mode' to switch it on. Customize `erc-fill-function' to
+;; change the style.
+
+;;; Code:
+
+(require 'erc)
+(require 'erc-stamp); for the timestamp stuff
+
+(defgroup erc-fill nil
+ "Filling means to reformat long lines in different ways."
+ :group 'erc)
+
+;;;###autoload (autoload 'erc-fill-mode "erc-fill" nil t)
+(erc-define-minor-mode erc-fill-mode
+ "Toggle ERC fill mode.
+With numeric arg, turn ERC fill mode on if and only if arg is
+positive. In ERC fill mode, messages in the channel buffers are
+filled."
+ nil nil nil
+ :global t :group 'erc-fill
+ (if erc-fill-mode
+ (erc-fill-enable)
+ (erc-fill-disable)))
+
+(defun erc-fill-enable ()
+ "Setup hooks for `erc-fill-mode'."
+ (interactive)
+ (add-hook 'erc-insert-modify-hook 'erc-fill)
+ (add-hook 'erc-send-modify-hook 'erc-fill))
+
+(defun erc-fill-disable ()
+ "Cleanup hooks, disable `erc-fill-mode'."
+ (interactive)
+ (remove-hook 'erc-insert-modify-hook 'erc-fill)
+ (remove-hook 'erc-send-modify-hook 'erc-fill))
+
+(defcustom erc-fill-prefix nil
+ "Values used as `fill-prefix' for `erc-fill-variable'.
+nil means fill with space, a string means fill with this string."
+ :group 'erc-fill
+ :type '(choice (const nil) string))
+
+(defcustom erc-fill-function 'erc-fill-variable
+ "Function to use for filling messages.
+
+Variable Filling with an `erc-fill-prefix' of nil:
+
+<shortnick> this is a very very very long message with no
+ meaning at all
+
+Variable Filling with an `erc-fill-prefix' of four spaces:
+
+<shortnick> this is a very very very long message with no
+ meaning at all
+
+Static Filling with `erc-fill-static-center' of 27:
+
+ <shortnick> foo bar baz
+ <a-very-long-nick> foo bar baz quuuuux
+ <shortnick> this is a very very very long message with no
+ meaning at all
+
+These two styles are implemented using `erc-fill-variable' and
+`erc-fill-static'. You can, of course, define your own filling
+function. Narrowing to the region in question is in effect while your
+function is called."
+ :group 'erc-fill
+ :type '(choice (const :tag "Variable Filling" erc-fill-variable)
+ (const :tag "Static Filling" erc-fill-static)
+ function))
+
+(defcustom erc-fill-static-center 27
+ "Column around which all statically filled messages will be
+centered. This column denotes the point where the ' ' character
+between <nickname> and the entered text will be put, thus aligning
+nick names right and text left."
+ :group 'erc-fill
+ :type 'integer)
+
+(defcustom erc-fill-variable-maximum-indentation 17
+ "If we indent a line after a long nick, don't indent more then this
+characters. Set to nil to disable."
+ :group 'erc-fill
+ :type 'integer)
+
+(defcustom erc-fill-column 78
+ "The column at which a filled paragraph is broken."
+ :group 'erc-fill
+ :type 'integer)
+
+;;;###autoload
+(defun erc-fill ()
+ "Fill a region using the function referenced in `erc-fill-function'.
+You can put this on `erc-insert-modify-hook' and/or `erc-send-modify-hook'."
+ (unless (erc-string-invisible-p (buffer-substring (point-min) (point-max)))
+ (when erc-fill-function
+ (funcall erc-fill-function))))
+
+(defun erc-fill-static ()
+ "Fills a text such that messages start at column `erc-fill-static-center'."
+ (save-match-data
+ (goto-char (point-min))
+ (looking-at "^\\(\\S-+\\)")
+ (let ((nick (match-string 1)))
+ (let ((fill-column (- erc-fill-column (erc-timestamp-offset)))
+ (fill-prefix (make-string erc-fill-static-center 32)))
+ (insert (make-string (max 0 (- erc-fill-static-center
+ (length nick) 1))
+ 32))
+ (erc-fill-regarding-timestamp))
+ (erc-restore-text-properties))))
+
+(defun erc-fill-variable ()
+ "Fill from `point-min' to `point-max'."
+ (let ((fill-prefix erc-fill-prefix)
+ (fill-column (or erc-fill-column fill-column)))
+ (goto-char (point-min))
+ (if fill-prefix
+ (let ((first-line-offset (make-string (erc-timestamp-offset) 32)))
+ (insert first-line-offset)
+ (fill-region (point-min) (point-max) t t)
+ (goto-char (point-min))
+ (delete-char (length first-line-offset)))
+ (save-match-data
+ (let* ((nickp (looking-at "^\\(\\S-+\\)"))
+ (nick (if nickp
+ (match-string 1)
+ ""))
+ (fill-column (- erc-fill-column (erc-timestamp-offset)))
+ (fill-prefix (make-string (min (+ 1 (length nick))
+ (- fill-column 1)
+ (or erc-fill-variable-maximum-indentation
+ fill-column))
+ 32)))
+ (erc-fill-regarding-timestamp))))
+ (erc-restore-text-properties)))
+
+(defun erc-fill-regarding-timestamp ()
+ "Fills a text such that messages start at column `erc-fill-static-center'."
+ (fill-region (point-min) (point-max) t t)
+ (goto-char (point-min))
+ (forward-line)
+ (indent-rigidly (point) (point-max) (erc-timestamp-offset)))
+
+(defun erc-timestamp-offset ()
+ "Get length of timestamp if inserted left."
+ (if (and (boundp 'erc-timestamp-format)
+ erc-timestamp-format
+ (eq erc-insert-timestamp-function 'erc-insert-timestamp-left)
+ (not erc-hide-timestamps))
+ (length (format-time-string erc-timestamp-format))
+ 0))
+
+(defun erc-restore-text-properties ()
+ "Restore the property 'erc-parsed for the region."
+ (let* ((parsed-posn (text-property-not-all (point-min) (point-max)
+ 'erc-parsed nil))
+ (parsed-prop (when parsed-posn
+ (get-text-property parsed-posn 'erc-parsed))))
+ (put-text-property (point-min) (point-max) 'erc-parsed parsed-prop)))
+
+(provide 'erc-fill)
+
+;;; erc-fill.el ends here
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End:
+
+;; arch-tag: 89224581-c2c2-4e26-92e5-e3a390dc516a