- (if hard
- ;; Hard alignment...
- (progn
- (when (> left-padding 0) ; pad on the left
- ;; Insert spaces before field:
- (if (= beg end) ; null field
- (insert (make-string left-padding ?\ ))
- (goto-char beg) ; beginning of current field
- (insert (make-string left-padding ?\ ))
- (goto-char end))) ; end of current field
- (unless (eolp)
- (if (> right-padding 0) ; pad on the right
- ;; Insert spaces after field:
- (insert (make-string right-padding ?\ )))
- ;; Make separator (potentially) invisible;
- ;; in Emacs 21.3, neighbouring overlays
- ;; conflict, so use the following only
- ;; with hard alignment:
- (overlay-put (make-overlay (point) (1+ (point)))
- ;; 'face 'secondary-selection) ; test
- 'invisible t)
- (forward-char))) ; skip separator
-
- ;; Soft alignment...
-
- (if buffer-invisibility-spec ; csv-hide-separators
-
- ;; Hide separators...
- (progn
- ;; Merge right-padding from previous field
- ;; with left-padding from this field:
- (setq padding (+ padding left-padding))
- (when (> padding 0)
- (goto-char beg) ; beginning of current field
- (if (bolp)
- ;; Display spaces before first field
- ;; by overlaying first character:
- (overlay-put
- (make-overlay (point) (1+ (point)))
- 'before-string
- (make-string padding ?\ ))
- ;; Display separator as spaces:
- (overlay-put
- (make-overlay (1- (point)) (point))
- ;; 'face 'secondary-selection)) ; test
- ;; 'display (make-string padding ?\ )))
- ;; Above 'display mangles buffer
- ;; horribly if any string is empty!
- 'display `(space :width ,padding)))
- (goto-char end)) ; end of current field
- (unless (eolp)
- (setq padding right-padding)
- (forward-char))) ; skip separator
-
- ;; Do not hide separators...
- (when (> left-padding 0) ; pad on the left
- ;; Display spaces before field:
- (setq overlay (make-overlay beg (point)))
- (overlay-put overlay 'before-string
- (make-string left-padding ?\ )))
- (unless (eolp)
- (if (> right-padding 0) ; pad on the right
- ;; Display spaces after field:
- (overlay-put
- (or overlay
- (make-overlay beg (point)))
- 'after-string (make-string right-padding ?\ )))
- (forward-char))) ; skip separator
+ (cond
+ (hard
+ ;; Hard alignment...
+ (when (> left-padding 0) ; Pad on the left.
+ ;; Insert spaces before field:
+ (if (= beg end) ; null field
+ (insert (make-string left-padding ?\ ))
+ (goto-char beg) ; beginning of current field
+ (insert (make-string left-padding ?\ ))
+ (goto-char end))) ; end of current field
+ (unless (eolp)
+ (if (> right-padding 0) ; pad on the right
+ ;; Insert spaces after field:
+ (insert (make-string right-padding ?\ )))
+ ;; Make separator (potentially) invisible;
+ ;; 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))
+ (forward-char))) ; skip separator
+
+ ;; Soft alignment...
+ ;; FIXME: Use (space :align-to ...) display property.
+
+ (buffer-invisibility-spec ; csv-hide-separators
+
+ ;; Hide separators...
+ ;; Merge right-padding from previous field
+ ;; with left-padding from this field:
+ (setq padding (+ padding left-padding))
+ (when (> padding 0)
+ (goto-char beg) ; beginning of current field
+ (if (bolp)
+ ;; Display spaces before first field
+ ;; by overlaying first character:
+ (overlay-put
+ (make-overlay (point) (1+ (point)))
+ 'before-string
+ (make-string padding ?\ ))
+ ;; Display separator as spaces:
+ (overlay-put
+ (make-overlay (1- (point)) (point) nil nil t)
+ ;; 'face 'secondary-selection)) ; test
+ ;; 'display (make-string padding ?\ )))
+ ;; Above 'display mangles buffer
+ ;; horribly if any string is empty!
+ 'display `(space :width ,padding)))
+ (goto-char end)) ; end of current field
+ (unless (eolp)
+ (setq padding right-padding)
+ (forward-char))) ; skip separator
+
+ (t ;; Do not hide separators...
+ (when (> left-padding 0) ; Pad on the left.
+ ;; Display spaces before field:
+ (setq overlay (make-overlay beg (point) nil nil t))
+ (overlay-put overlay 'before-string
+ (make-string left-padding ?\ )))
+ (unless (eolp)
+ (if (> right-padding 0) ; Pad on the right.
+ ;; Display spaces after field:
+ (overlay-put
+ (or overlay
+ (make-overlay beg (point) nil nil t))
+ 'after-string (make-string right-padding ?\ )))
+ (forward-char))) ; Skip separator.