Subject: bug#20343: closed (Re: bug#20343: csv-mode fails if mode line is customized)

From: [email-masked] (GNU bug Tracking System)
Date: Thu, 16 Apr 2015 01:31:07 +0000

Your bug report

#20343: csv-mode fails if mode line is customized

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
20343: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=20343
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#20343: csv-mode fails if mode line is customized
From: Stefan Monnier <[email-masked]>
To: Peter Eisentraut <[email-masked]>
Cc: [email-masked]
Date: Wed, 15 Apr 2015 21:29:59 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

> The reason is that in the definition of csv-mode-line-format, the
> arguments of the `last' function are flipped:

> (defconst csv-mode-line-format
>   ;; See bindings.el for details of `mode-line-format' construction.
>   (let* ((ml (copy-sequence (default-value 'mode-line-format)))
>          (x (or (memq 'mode-line-position ml) (last 3 ml))))  ;; wrong

Oops, indeed.

> (I doubt that messing around with the mode line like that is current
> practice, but that might be a separate discussion.)

I've changed the code to make fewer assumptions.  See patch below,

        Stefan

diff --git a/packages/csv-mode/csv-mode.el b/packages/csv-mode/csv-mode.el
index a8ae4e4..e727027 100644
--- a/packages/csv-mode/csv-mode.el
+++ b/packages/csv-mode/csv-mode.el
@@ -249,16 +249,7 @@ Number of spaces used by `csv-align-fields' after separators."

 (defconst csv-mode-line-format
-  ;; See bindings.el for details of `mode-line-format' construction.
-  (let* ((ml (copy-sequence (default-value 'mode-line-format)))
-         (x (or (memq 'mode-line-position ml) (last 3 ml))))
-    (when x
-      (setcdr x (cons
-                 `(csv-field-index-string
-                   ("" csv-field-index-string
-                    ))
-                 (cdr x))))
-    ml)
+  '(csv-field-index-string ("" csv-field-index-string))
   "Mode line format string for CSV mode.")
 
 (defvar csv-mode-map
@@ -322,9 +313,13 @@ CSV mode provides the following specific keyboard key bindings:
   (setq
    ;; Font locking -- separator plus syntactic:
    font-lock-defaults '(csv-font-lock-keywords)
-   buffer-invisibility-spec csv-invisibility-default
-   ;; Mode line to support `csv-field-index-mode':
-   mode-line-format csv-mode-line-format)
+   buffer-invisibility-spec csv-invisibility-default)
+  ;; Mode line to support `csv-field-index-mode':
+  (set (make-local-variable 'mode-line-position)
+       (pcase mode-line-position
+         (`(,(or (pred consp) (pred stringp)) . ,_)
+          `(,@mode-line-position ,csv-mode-line-format))
+         (_ `("" ,mode-line-position ,csv-mode-line-format))))
   (set (make-local-variable 'truncate-lines) t)
   ;; Enable or disable `csv-field-index-mode' (could probably do this
   ;; a bit more efficiently):

Subject: csv-mode fails if mode line is customized
From: Peter Eisentraut <[email-masked]>
To: [email-masked]
Date: Wed, 15 Apr 2015 20:00:23 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

This is about csv-mode.el version 1.2 from elpa.gnu.org.

If the mode line has been customized in a certain way, calling csv-mode
will fail.

Example:

in ~/emacs.d/init.el

(setq-default mode-line-format '("%e"))

Install csv-mode.el.

Then run

emacs test.csv

This will produce a message like

(wrong-type-argument number-or-marker-p ("%e"))

The reason is that in the definition of csv-mode-line-format, the
arguments of the `last' function are flipped:

(defconst csv-mode-line-format
  ;; See bindings.el for details of `mode-line-format' construction.
  (let* ((ml (copy-sequence (default-value 'mode-line-format)))
         (x (or (memq 'mode-line-position ml) (last 3 ml))))  ;; wrong

(I doubt that messing around with the mode line like that is current
practice, but that might be a separate discussion.)