Mercurial > emacs
changeset 25761:605bd4f82d45
Initial revision
author | Dave Love <fx@gnu.org> |
---|---|
date | Sun, 19 Sep 1999 21:17:17 +0000 |
parents | d051dc68801d |
children | 515645780a5a |
files | lisp/delim-col.el |
diffstat | 1 files changed, 274 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/delim-col.el Sun Sep 19 21:17:17 1999 +0000 @@ -0,0 +1,274 @@ +;;; delim-col.el --- Prettify all columns in a region or rectangle. + +;; Copyright (C) 1999 Vinicius Jose Latorre <vinicius@cpqd.com.br> + +;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br> +;; Time-stamp: <99/08/21 19:51:13 vinicius> +;; Version: 1.3 +;; Keywords: internal + +;; This file is part of GNU Emacs. + +;; This 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. + +;; This program 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., 59 Temple Place - Suite 330, Boston, MA +;; 02111-1307, USA. + +;;; Commentary: + +;; delim-col helps to prettify columns in a text region or rectangle. +;; +;; To use it, make sure that this file is in load-path and insert in your +;; .emacs: +;; +;; (require 'delim-col) +;; +;; If you have, for example, the following columns: +;; +;; a b c d +;; aaaa bb ccc ddddd +;; aaa bbb cccc dddd +;; aa bb ccccccc ddd +;; +;; And the following settings: +;; +;; (setq delimit-columns-str-before "[ ") +;; (setq delimit-columns-str-after " ]") +;; (setq delimit-columns-str-separator ", ") +;; (setq delimit-columns-separator "\t") +;; +;; If you select the lines above and type: +;; +;; M-x delimit-columns-region RET +;; +;; You obtain the following result: +;; +;; [ a , b , c , d ] +;; [ aaaa, bb , ccc , ddddd ] +;; [ 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: +;; +;; M-x delimit-columns-rectangle RET +;; +;; You obtain the following result: +;; +;; 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. +;; +;; `delimit-columns-region' is useful when you have columns of text that +;; are not well aligned, like: +;; +;; horse apple bus +;; dog pineapple car +;; porcupine strawberry airplane +;; +;; `delimit-columns-region' and `delimit-columns-rectangle' handle lines +;; with different number of columns, like: +;; +;; horse apple bus +;; dog pineapple car EXTRA +;; porcupine strawberry airplane + +;;; Code: + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; User Options: + +(defvar delimit-columns-str-before "" + "*Specify a string to be inserted before all columns.") + +(defvar delimit-columns-str-separator ", " + "*Specify a string to be inserted between each column.") + +(defvar delimit-columns-str-after "" + "*Specify a string to be inserted after all columns.") + +(defvar delimit-columns-separator "\t" + "*Specify a regexp which separates each column.") + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; User Commands: + + +;;;###autoload +(defun delimit-columns-region (start end) + "Prettify all columns in a text region. + +START and END delimits the text region." + (interactive "*r") + (let ((delimit-columns-str-before + (if (stringp delimit-columns-str-before) + delimit-columns-str-before + "")) + (delimit-columns-str-separator + (if (stringp delimit-columns-str-separator) + delimit-columns-str-separator + " ")) + (delimit-columns-str-after + (if (stringp delimit-columns-str-after) + delimit-columns-str-after + "")) + (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 + (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-line + (prog1 + (point) + (end-of-line))) + (forward-char 1)) + ;; nullify markers + (set-marker delimit-columns-limit nil) + (set-marker the-end nil)))) + + +(require 'rect) + + +;;;###autoload +(defun delimit-columns-rectangle (start end) + "Prettify all columns in a text rectangle. + +START and END delimits the corners of text rectangle." + (interactive "*r") + (let ((delimit-columns-str-before + (if (stringp delimit-columns-str-before) + delimit-columns-str-before + "")) + (delimit-columns-str-separator + (if (stringp delimit-columns-str-separator) + delimit-columns-str-separator + " ")) + (delimit-columns-str-after + (if (stringp delimit-columns-str-after) + delimit-columns-str-after + "")) + (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))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Internal Variables and Functions: + + +;; to avoid compilation gripes +(defvar delimit-columns-max nil) +(defvar delimit-columns-limit nil) + + +(defun delimit-columns-rectangle-max (startpos &optional ignore ignore) + (set-marker delimit-columns-limit (point)) + (goto-char startpos) + (let ((ncol 1) + origin values) + ;; get current column length + (while (progn + (setq origin (current-column)) + (re-search-forward delimit-columns-separator + delimit-columns-limit 'move)) + (save-excursion + (goto-char (match-beginning 0)) + (setq values (cons (- (current-column) origin) + values))) + (setq ncol (1+ ncol))) + (setq values (cons (- (current-column) origin) + values)) + ;; extend delimit-columns-max, if needed + (let ((index (length delimit-columns-max))) + (and (> ncol index) + (let ((extend (make-vector ncol 0))) + (while (> index 0) + (setq index (1- index)) + (aset extend index (aref delimit-columns-max index))) + (setq delimit-columns-max extend)))) + ;; get maximum column length + (while values + (setq ncol (1- ncol)) + (aset delimit-columns-max ncol (max (aref delimit-columns-max ncol) + (car values))) + (setq values (cdr values))))) + + +(defun delimit-columns-rectangle-line (startpos &optional ignore ignore) + (let ((ncol 0) + (len (length delimit-columns-max)) + origin) + (set-marker delimit-columns-limit (point)) + (goto-char startpos) + (insert delimit-columns-str-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))) + (delete-region (match-beginning 0) (point)) + (insert (make-string (- (aref delimit-columns-max ncol) + (- (current-column) origin)) + ?\ ) + delimit-columns-str-separator) + (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))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +(provide 'delim-col) + + +;;; delim-col.el ends here