changeset 32835:001414add3a5

Now there is a column formatting mechanism. Modified to customization mechanisms convention. Doc fix. (columns): New group for delim-col. (delimit-columns-before, delimit-columns-after) (delimit-columns-format, delimit-columns-extra, delimit-columns-start) (delimit-columns-end): New vars. (delimit-columns-customize, delimit-columns-format): New funs. (delimit-columns-region, delimit-columns-rectangle) (delimit-columns-rectangle-line): Modified to support column formatting.
author Gerd Moellmann <gerd@gnu.org>
date Tue, 24 Oct 2000 21:17:06 +0000
parents 91d978fbe967
children 2d9f4fc56dba
files lisp/delim-col.el
diffstat 1 files changed, 283 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/delim-col.el	Tue Oct 24 20:57:11 2000 +0000
+++ b/lisp/delim-col.el	Tue Oct 24 21:17:06 2000 +0000
@@ -1,12 +1,13 @@
 ;;; delim-col.el --- Prettify all columns in a region or rectangle.
 
-;; Copyright (C) 1999 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000 Free Software Foundation, Inc.
 
-;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br>
-;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.com.br>
-;; Time-stamp:	<99/08/21 19:51:13 vinicius>
-;; Version: 1.3
-;; Keywords: internal
+;; Author:	Vinicius Jose Latorre <vinicius@cpqd.com.br>
+;; Maintainer:	Vinicius Jose Latorre <vinicius@cpqd.com.br>
+;; Time-stamp:	<2000/10/23 10:51:25 vinicius>
+;; Version:	2.0
+;; Keywords:	internal
+;; X-URL:	http://www.cpqd.com.br/~vinicius/emacs/
 
 ;; This file is part of GNU Emacs.
 
@@ -38,7 +39,7 @@
 ;;
 ;;	a	b	c	d
 ;;	aaaa	bb	ccc	ddddd
-;;	aaa	bbb	cccc   	dddd
+;;	aaa	bbb	cccc	dddd
 ;;	aa	bb	ccccccc	ddd
 ;;
 ;; And the following settings:
@@ -46,7 +47,11 @@
 ;;    (setq delimit-columns-str-before "[ ")
 ;;    (setq delimit-columns-str-after " ]")
 ;;    (setq delimit-columns-str-separator ", ")
+;;    (setq delimit-columns-before "")
+;;    (setq delimit-columns-after "")
 ;;    (setq delimit-columns-separator "\t")
+;;    (setq delimit-columns-format 'separator)
+;;    (setq delimit-columns-extra t)
 ;;
 ;; If you select the lines above and type:
 ;;
@@ -59,7 +64,7 @@
 ;;	[ aaa , bbb, cccc   , dddd  ]
 ;;	[ aa  , bb , ccccccc, ddd   ]
 ;;
-;; But if you select start from the very first b and the very last c and type:
+;; But if you select start from the very first b to the very last c and type:
 ;;
 ;;    M-x delimit-columns-rectangle RET
 ;;
@@ -70,12 +75,33 @@
 ;;	aaa	[ bbb, cccc    ]	dddd
 ;;	aa	[ bb , ccccccc ]	ddd
 ;;
+;; Now, if we change settings to:
+;;
+;;    (setq delimit-columns-before "<")
+;;    (setq delimit-columns-after ">")
+;;
+;; For the `delimit-columns-region' example above, the result is:
+;;
+;;	[ <a>   , <b>  , <c>      , <d>     ]
+;;	[ <aaaa>, <bb> , <ccc>    , <ddddd> ]
+;;	[ <aaa> , <bbb>, <cccc>   , <dddd>  ]
+;;	[ <aa>  , <bb> , <ccccccc>, <ddd>   ]
+;;
+;; And for the `delimit-columns-rectangle' example above, the result is:
+;;
+;;	a	[ <b>  , <c>       ]	d
+;;	aaaa	[ <bb> , <ccc>     ]	ddddd
+;;	aaa	[ <bbb>, <cccc>    ]	dddd
+;;	aa	[ <bb> , <ccccccc> ]	ddd
+;;
 ;; Note that `delimit-columns-region' operates over all text region
 ;; selected, extending the region start to the beginning of line and the
 ;; region end to the end of line.  While `delimit-columns-rectangle'
 ;; operates over the text rectangle selected which rectangle diagonal is
 ;; given by the region start and end.
 ;;
+;; See `delimit-columns-format' variable documentation for column formating.
+;;
 ;; `delimit-columns-region' is useful when you have columns of text that
 ;; are not well aligned, like:
 ;;
@@ -89,6 +115,8 @@
 ;;	horse	apple	bus
 ;;	dog	pineapple	car	EXTRA
 ;;	porcupine	strawberry	airplane
+;;
+;; Use `delimit-columns-customize' to customize delim-col package variables.
 
 ;;; Code:
 
@@ -96,17 +124,119 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; User Options:
 
-(defvar delimit-columns-str-before ""
-  "*Specify a string to be inserted before all columns.")
+(defgroup columns nil
+  "Prettify columns"
+  :link '(emacs-library-link :tag "Source Lisp File" "delim-col.el")
+  :prefix "delimit-columns-"
+  :group 'internal)
+
+(defcustom delimit-columns-str-before ""
+  "*Specify a string to be inserted before all columns."
+  :type '(string :tag "Before All Columns")
+  :group 'columns)
+
+(defcustom delimit-columns-str-separator ", "
+  "*Specify a string to be inserted between each column."
+  :type '(string :tag "Between Each Column")
+  :group 'columns)
+
+(defcustom delimit-columns-str-after ""
+  "*Specify a string to be inserted after all columns."
+  :type '(string :tag "After All Columns")
+  :group 'columns)
+
+(defcustom delimit-columns-before ""
+  "*Specify a string to be inserted before each column."
+  :type '(string :tag "Before Each Column")
+  :group 'columns)
 
-(defvar delimit-columns-str-separator ", "
-  "*Specify a string to be inserted between each column.")
+(defcustom delimit-columns-after ""
+  "*Specify a string to be inserted after each column."
+  :type '(string :tag "After Each Column")
+  :group 'columns)
+
+(defcustom delimit-columns-separator "\t"
+  "*Specify a regexp which separates each column."
+  :type '(regexp :tag "Column Separator")
+  :group 'columns)
+
+(defcustom delimit-columns-format t
+  "*Specify how to format columns.
+
+For examples below, consider:
+
+   + columns `ccc' and `dddd',
+   + the maximum column length for each column is 6,
+   + and the following settings:
+      (setq delimit-columns-before \"<\")
+      (setq delimit-columns-after \">\")
+      (setq delimit-columns-separator \":\")
+
+Valid values are:
+
+   nil		no formating.  That is, `delimit-columns-after' is followed by
+		`delimit-columns-separator'.
+		For example, the result is: \"<ccc>:<dddd>:\"
 
-(defvar delimit-columns-str-after ""
-  "*Specify a string to be inserted after all columns.")
+   t		align columns.  That is, `delimit-columns-after' is followed by
+		`delimit-columns-separator' and then followed by spaces.
+		For example, the result is: \"<ccc>:   <dddd>:  \"
+
+   'separator	align separators.  That is, `delimit-columns-after' is followed
+		by spaces and then followed by `delimit-columns-separator'.
+		For example, the result is: \"<ccc>   :<dddd>  :\"
+
+   'padding	format column by filling with spaces before
+		`delimit-columns-after'.  That is, spaces are followed by
+		`delimit-columns-after' and then followed by
+		`delimit-columns-separator'.
+		For example, the result is: \"<ccc   >:<dddd  >:\"
+
+Any other value is treated as t."
+  :type '(choice :menu-tag "Column Formating"
+		 :tag "Column Formating"
+		 (const :tag "No Formating" nil)
+		 (const :tag "Column Alignment" t)
+		 (const :tag "Separator Aligment" separator)
+		 (const :tag "Column Padding" padding))
+  :group 'columns)
+
+(defcustom delimit-columns-extra t
+  "*Non-nil means that lines will have the same number of columns.
+
+This has effect only when there are lines with different number of columns."
+  :type '(boolean :tag "Lines With Same Number Of Column")
+  :group 'columns)
 
-(defvar delimit-columns-separator "\t"
-  "*Specify a regexp which separates each column.")
+(defcustom delimit-columns-start 0
+  "*Specify column number to start prettifing.
+
+See also `delimit-columns-end' for documentation.
+
+The following relation must hold:
+   0 <= delimit-columns-start <= delimit-columns-end
+
+The column number start from 0 and it's relative to the beginning of selected
+region.  So if you selected a text region, the first column (column 0) is
+located at beginning of line.  If you selected a text rectangle, the first
+column (column 0) is located at left corner."
+  :type '(integer :tag "Column Start")
+  :group 'columns)
+
+(defcustom delimit-columns-end 1000000
+  "*Specify column number to end prettifing.
+
+See also `delimit-columns-start' for documentation.
+
+The following relation must hold:
+   0 <= delimit-columns-start <= delimit-columns-end
+
+The column number start from 0 and it's relative to the beginning of selected
+region.  So if you selected a text region, the first column (column 0) is
+located at beginning of line.  If you selected a text rectangle, the first
+column (column 0) is located at left corner."
+  :type '(integer :tag "Column End")
+  :group 'columns)
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -114,6 +244,13 @@
 
 
 ;;;###autoload
+(defun delimit-columns-customize ()
+  "Customization of `columns' group."
+  (interactive)
+  (customize-group 'columns))
+
+
+;;;###autoload
 (defun delimit-columns-region (start end)
   "Prettify all columns in a text region.
 
@@ -131,30 +268,49 @@
 	 (if (stringp delimit-columns-str-after)
 	     delimit-columns-str-after
 	   ""))
+	(delimit-columns-before
+	 (if (stringp delimit-columns-before)
+	     delimit-columns-before
+	   ""))
+	(delimit-columns-after
+	 (if (stringp delimit-columns-after)
+	     delimit-columns-after
+	   ""))
+	(delimit-columns-start
+	 (if (and (integerp delimit-columns-start)
+		  (>= delimit-columns-start 0))
+	     delimit-columns-start
+	   0))
+	(delimit-columns-end
+	 (if (integerp delimit-columns-end)
+	     delimit-columns-end
+	   1000000))
 	(delimit-columns-limit (make-marker))
 	(the-end (copy-marker end))
 	delimit-columns-max)
-    (save-excursion
-      (goto-char start)
-      (beginning-of-line)
-      ;; get maximum length for each column
+    (when (<= delimit-columns-start delimit-columns-end)
       (save-excursion
+	(goto-char start)
+	(beginning-of-line)
+	;; get maximum length for each column
+	(and delimit-columns-align-columns
+	     (save-excursion
+	       (while (< (point) the-end)
+		 (delimit-columns-rectangle-max
+		  (prog1
+		      (point)
+		    (end-of-line)))
+		 (forward-char 1))))
+	;; prettify columns
 	(while (< (point) the-end)
-	  (delimit-columns-rectangle-max
+	  (delimit-columns-rectangle-line
 	   (prog1
 	       (point)
 	     (end-of-line)))
-	  (forward-char 1)))
-      ;; prettify columns
-      (while (< (point) the-end)
-	(delimit-columns-rectangle-line
-	 (prog1
-	     (point)
-	   (end-of-line)))
-	(forward-char 1))
-      ;; nullify markers
-      (set-marker delimit-columns-limit nil)
-      (set-marker the-end nil))))
+	  (forward-char 1))
+	;; nullify markers
+	(set-marker delimit-columns-limit nil)
+	(set-marker the-end nil)))))
 
 
 (require 'rect)
@@ -178,20 +334,39 @@
 	 (if (stringp delimit-columns-str-after)
 	     delimit-columns-str-after
 	   ""))
+	(delimit-columns-before
+	 (if (stringp delimit-columns-before)
+	     delimit-columns-before
+	   ""))
+	(delimit-columns-after
+	 (if (stringp delimit-columns-after)
+	     delimit-columns-after
+	   ""))
+	(delimit-columns-start
+	 (if (and (integerp delimit-columns-start)
+		  (>= delimit-columns-start 0))
+	     delimit-columns-start
+	   0))
+	(delimit-columns-end
+	 (if (integerp delimit-columns-end)
+	     delimit-columns-end
+	   1000000))
 	(delimit-columns-limit (make-marker))
 	(the-end (copy-marker end))
 	delimit-columns-max)
-    ;; get maximum length for each column
-    (save-excursion
-      (operate-on-rectangle 'delimit-columns-rectangle-max
-			    start the-end t))
-    ;; prettify columns
-    (save-excursion
-      (operate-on-rectangle 'delimit-columns-rectangle-line
-			    start the-end t))
-    ;; nullify markers
-    (set-marker delimit-columns-limit nil)
-    (set-marker the-end nil)))
+    (when (<= delimit-columns-start delimit-columns-end)
+      ;; get maximum length for each column
+      (and delimit-columns-align-columns
+	   (save-excursion
+	     (operate-on-rectangle 'delimit-columns-rectangle-max
+				   start the-end nil)))
+      ;; prettify columns
+      (save-excursion
+	(operate-on-rectangle 'delimit-columns-rectangle-line
+			      start the-end nil))
+      ;; nullify markers
+      (set-marker delimit-columns-limit nil)
+      (set-marker the-end nil))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -237,33 +412,81 @@
 
 
 (defun delimit-columns-rectangle-line (startpos &optional ignore ignore)
-  (let ((ncol 0)
-	(len (length delimit-columns-max))
+  (let ((len  (length delimit-columns-max))
+	(ncol 0)
 	origin)
     (set-marker delimit-columns-limit (point))
     (goto-char startpos)
-    (insert delimit-columns-str-before)
+    ;; skip initial columns
+    (while (and (< ncol delimit-columns-start)
+		(< (point) delimit-columns-limit)
+		(re-search-forward delimit-columns-separator
+				   delimit-columns-limit 'move))
+      (setq ncol (1+ ncol)))
+    ;; insert first formating
+    (insert delimit-columns-str-before delimit-columns-before)
     ;; Adjust all columns but last one
     (while (progn
 	     (setq origin (current-column))
 	     (and (< (point) delimit-columns-limit)
 		  (re-search-forward delimit-columns-separator
-				     delimit-columns-limit 'move)))
+				     delimit-columns-limit 'move)
+		  (or (< ncol delimit-columns-end)
+		      (progn
+			(goto-char (match-beginning 0))
+			nil))))
       (delete-region (match-beginning 0) (point))
-      (insert (make-string (- (aref delimit-columns-max ncol)
-			      (- (current-column) origin))
-			   ?\ )
-	      delimit-columns-str-separator)
+      (delimit-columns-format
+       (and delimit-columns-format
+	    (make-string (- (aref delimit-columns-max ncol)
+			    (- (current-column) origin))
+			 ?\ )))
       (setq ncol (1+ ncol)))
-    ;; Adjust last column
-    (insert (make-string (- (aref delimit-columns-max ncol)
-			    (- (current-column) origin))
-			 ?\ ))
-    ;; Adjust extra columns, if needed
-    (while (< (setq ncol (1+ ncol)) len)
-      (insert delimit-columns-str-separator
-	      (make-string (aref delimit-columns-max ncol) ?\ )))
-    (insert delimit-columns-str-after)))
+    ;; Prepare last column spaces
+    (let ((spaces (and delimit-columns-format
+		       (make-string (- (aref delimit-columns-max ncol)
+				       (- (current-column) origin))
+				    ?\ ))))
+      ;; Adjust extra columns, if needed
+      (and delimit-columns-extra
+	   (while (and (< (setq ncol (1+ ncol)) len)
+		       (<= ncol delimit-columns-end))
+	     (delimit-columns-format spaces)
+	     (setq spaces (and delimit-columns-format
+			       (make-string (aref delimit-columns-max ncol)
+					    ?\ )))))
+      ;; insert last formating
+      (cond ((null delimit-columns-format)
+	     (insert delimit-columns-after delimit-columns-str-after))
+	    ((eq delimit-columns-format 'padding)
+	     (insert spaces delimit-columns-after delimit-columns-str-after))
+	    (t
+	     (insert delimit-columns-after spaces delimit-columns-str-after))
+	    ))
+    (goto-char (max (point) delimit-columns-limit))))
+
+
+(defun delimit-columns-format (spaces)
+  (cond ((null delimit-columns-format)
+	 (insert delimit-columns-after
+		 delimit-columns-str-separator
+		 delimit-columns-before))
+	((eq delimit-columns-format 'separator)
+	 (insert delimit-columns-after
+		 spaces
+		 delimit-columns-str-separator
+		 delimit-columns-before))
+	((eq delimit-columns-format 'padding)
+	 (insert spaces
+		 delimit-columns-after
+		 delimit-columns-str-separator
+		 delimit-columns-before))
+	(t
+	 (insert delimit-columns-after
+		 delimit-columns-str-separator
+		 spaces
+		 delimit-columns-before))
+	))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;