;; Author: "Francis J. Wright" <F.J.Wright@qmul.ac.uk>
;; Time-stamp: <23 August 2004>
-;; Version: 1.5
+;; Version: 1.6
;; Keywords: convenience
;; This package is free software; you can redistribute it and/or modify
(defcustom csv-field-quotes '("\"")
"Field quotes: a list of *single-character* strings.
-For example: (\"\\\"\"), the default, or (\"\\\"\" \"'\" \"`\").
+For example: (\"\\\"\"), the default, or (\"\\\"\" \"\\='\" \"\\=`\").
A field can be delimited by a pair of any of these characters.
All must be different from the field separators, `csv-separators'."
:type '(repeat string)
(set-default 'csv-comment-start value)))
(defcustom csv-align-style 'left
- "Aligned field style: one of 'left, 'centre, 'right or 'auto.
+ "Aligned field style: one of `left', `centre', `right' or `auto'.
Alignment style used by `csv-align-fields'.
Auto-alignment means left align text and right align numbers."
:type '(choice (const left) (const centre)
(defun csv-interactive-args (&optional type)
"Get arg or field(s) and region interactively, offering sensible defaults.
Signal an error if the buffer is read-only.
-If TYPE is noarg then return a list `(beg end)'.
-Otherwise, return a list `(arg beg end)', where arg is:
+If TYPE is noarg then return a list (beg end).
+Otherwise, return a list (arg beg end), where arg is:
the raw prefix argument by default\;
a single field index if TYPE is single\;
a list of field indices or index ranges if TYPE is multiple.
;;; Aligning fields
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun csv--make-overlay (beg end &optional buffer front-advance rear-advance props)
+ (let ((o (make-overlay beg end buffer front-advance rear-advance)))
+ (overlay-put o 'csv t)
+ (while props
+ (overlay-put o (pop props) (pop props)))
+ o))
+
+(defun csv--delete-overlay (o)
+ (and (overlay-get o 'csv) (delete-overlay o)))
+
(defun csv--column-widths ()
(let ((widths '()))
;; Construct list of column widths:
;; in Emacs 21.3, neighbouring overlays
;; conflict, so use the following only
;; with hard alignment:
- (let ((ol (make-overlay (point) (1+ (point)) nil t)))
- (overlay-put ol 'invisible t)
- (overlay-put ol 'evaporate t))
+ (csv--make-overlay (point) (1+ (point)) nil t nil
+ '(invisible t evaporate t))
(forward-char))) ; skip separator
;; Soft alignment...
(when (> left-padding 0)
;; Display spaces before first field
;; by overlaying first character:
- (overlay-put
- (make-overlay beg (1+ beg))
- 'before-string
- (make-string left-padding ?\ )))
+ (csv--make-overlay
+ beg (1+ beg) nil nil nil
+ `(before-string ,(make-string left-padding ?\ ))))
;; Display separator as spaces:
(with-silent-modifications
(put-text-property
(setq column (+ column column-width align-padding)))
(t ;; Do not hide separators...
- (let ((overlay (make-overlay beg (point) nil nil t)))
+ (let ((overlay (csv--make-overlay beg (point) nil nil t)))
(when (> left-padding 0) ; Pad on the left.
;; Display spaces before field:
(overlay-put overlay 'before-string
(list (region-beginning) (region-end))
(list (point-min) (point-max)))))
;; Remove any soft alignment:
- (mapc 'delete-overlay (overlays-in beg end))
+ (mapc #'csv--delete-overlay (overlays-in beg end))
(with-silent-modifications
(remove-list-of-text-properties beg end '(display)))
(when hard
rows columns)
;; Remove soft alignment if necessary:
(when align
- (mapc 'delete-overlay align)
+ (mapc 'csv--delete-overlay align)
(setq align t))
(while (not (eobp))
(if (csv-not-looking-at-record)