Fix the last change.
[elisp/lsdb.git] / lsdb.el
diff --git a/lsdb.el b/lsdb.el
index c27b756..75bd9ea 100644 (file)
--- a/lsdb.el
+++ b/lsdb.el
@@ -229,6 +229,11 @@ Bourne shell or its equivalent \(not tcsh) is needed for \"2>\"."
   :group 'lsdb
   :type 'string)
 
+(defcustom lsdb-verbose t
+  "If non-nil, confirm user to submit changes to lsdb-hash-table."
+  :type 'boolean
+  :group 'lsdb)
+
 ;;;_. Faces
 (defface lsdb-header-face
   '((t (:underline t)))
@@ -366,24 +371,31 @@ This is the current number of slots in HASH-TABLE, whether occupied or not."
        (save-excursion
         (goto-char marker)
         (if (looking-at "^#s(")
-            (with-temp-buffer
-              (buffer-disable-undo)
-              (insert-buffer-substring (marker-buffer marker) marker)
-              (goto-char (point-min))
-              (delete-char 2)
-              (let ((object (read (current-buffer)))
-                    hash-table data)
-                (if (eq 'hash-table (car object))
-                    (progn
-                      (setq hash-table
-                            (lsdb-make-hash-table
-                             :size (plist-get (cdr object) 'size)
-                             :test 'equal)
-                            data (plist-get (cdr object) 'data))
-                      (while data
-                        (lsdb-puthash (pop data) (pop data) hash-table))
-                      hash-table)
-                  object)))))))))
+            (let ((end-marker
+                   (progn
+                     (forward-char 2)  ;skip "#s"
+                     (forward-sexp)    ;move to the left paren
+                     (point-marker))))
+              (with-temp-buffer
+                (buffer-disable-undo)
+                (insert-buffer-substring (marker-buffer marker)
+                                         marker end-marker)
+                (goto-char (point-min))
+                (delete-char 2)
+                (let ((object (read (current-buffer)))
+                      hash-table data)
+                  (if (eq 'hash-table (car object))
+                      (progn
+                        (setq hash-table
+                              (lsdb-make-hash-table
+                               :size (plist-get (cdr object) 'size)
+                               :test 'equal)
+                              data (plist-get (cdr object) 'data))
+                        (while data
+                          (lsdb-puthash (pop data) (pop data) hash-table))
+                        hash-table)
+                    object))))
+          (read marker)))))))
 
 (defun lsdb-load-hash-tables ()
   "Read the contents of `lsdb-file' into the internal hash tables."
@@ -416,7 +428,8 @@ This is the current number of slots in HASH-TABLE, whether occupied or not."
          " test equal data (")
   (lsdb-maphash
    (lambda (key value)
-     (insert (prin1-to-string key) " " (prin1-to-string value) " "))
+     (let (print-level print-length)
+       (insert (prin1-to-string key) " " (prin1-to-string value) " ")))
    hash-table)
   (insert "))"))
 
@@ -973,6 +986,14 @@ Modify whole identification by side effect."
     (unless (equal entry-name "")
       (intern (downcase entry-name)))))
 
+(defun lsdb-delete-entry (record entry)
+  "Delete given ENTRY from RECORD."
+  (setcdr record (delq entry (cdr record)))
+  (lsdb-puthash (car record) (cdr record)
+               lsdb-hash-table)
+  (run-hook-with-args 'lsdb-update-record-functions record)
+  (setq lsdb-hash-tables-are-dirty t))
+
 (defun lsdb-mode-add-entry (entry-name)
   "Add an entry on the current line."
   (interactive
@@ -1007,42 +1028,41 @@ Modify whole identification by side effect."
                 (point))
               (list 'lsdb-record record)))))))))
 
-(defun lsdb-mode-delete-entry (&optional entry-name dont-update)
+(defun lsdb-mode-delete-entry-1 (entry)
+  "Delete text contents of the ENTRY from the current buffer."
+  (save-restriction
+    (lsdb-narrow-to-record)
+    (let ((case-fold-search t)
+         (inhibit-read-only t)
+         buffer-read-only)
+      (goto-char (point-min))
+      (if (re-search-forward
+          (concat "^\t" (capitalize (symbol-name (car entry))) ":")
+          nil t)
+         (delete-region (match-beginning 0)
+                        (if (re-search-forward
+                             "^\t[^\t][^:]+:" nil t)
+                            (match-beginning 0)
+                          (point-max)))))))
+
+(defun lsdb-mode-delete-entry ()
   "Delete the entry on the current line."
   (interactive)
   (let ((record (lsdb-current-record))
-       entry)
+       entry-name entry)
     (unless record
       (error "There is nothing to follow here"))
-    (unless entry-name
-      (setq entry-name (or (lsdb-current-entry)
-                          (lsdb-read-entry
-                           record "Which entry to delete: "))))
-    (setq entry (assq entry-name (cdr record)))
+    (setq entry-name (or (lsdb-current-entry)
+                        (lsdb-read-entry record "Which entry to delete: "))
+         entry (assq entry-name (cdr record)))
     (when (and entry
-              (not dont-update))
-      (setcdr record (delq entry (cdr record)))
-      (lsdb-puthash (car record) (cdr record)
-                   lsdb-hash-table)
-      (run-hook-with-args 'lsdb-update-record-functions record)
-      (setq lsdb-hash-tables-are-dirty t))
-    (save-restriction
-      (lsdb-narrow-to-record)
-      (let ((case-fold-search t)
-           (inhibit-read-only t)
-           buffer-read-only)
-       (goto-char (point-min))
-       (if (re-search-forward
-            (concat "^\t" (capitalize (symbol-name
-                                       (or entry-name
-                                           (lsdb-current-entry))))
-                    ":")
-            nil t)
-           (delete-region (match-beginning 0)
-                          (if (re-search-forward
-                               "^\t[^\t][^:]+:" nil t)
-                              (match-beginning 0)
-                            (point-max))))))))
+              (or (not (interactive-p))
+                  (not lsdb-verbose)
+                  (y-or-n-p
+                   (format "Do you really want to delete entry `%s' of `%s'?"
+                           entry-name (car record)))))
+      (lsdb-delete-entry record entry)
+      (lsdb-mode-delete-entry-1 entry))))
 
 (defun lsdb-mode-edit-entry ()
   "Edit the entry on the current line."
@@ -1072,7 +1092,7 @@ Modify whole identification by side effect."
              (setcdr entry form)
              (run-hook-with-args 'lsdb-update-record-functions record)
              (setq lsdb-hash-tables-are-dirty t)
-             (lsdb-mode-delete-entry ',entry-name t)
+             (lsdb-mode-delete-entry-1 entry)
              (beginning-of-line)
              (add-text-properties
               (point)
@@ -1088,6 +1108,7 @@ Modify whole identification by side effect."
       (message "(No changes need to be saved)")
     (when (or (interactive-p)
              dont-ask
+             (not lsdb-verbose)
              (y-or-n-p "Save the LSDB now? "))
       (lsdb-save-hash-tables)
       (setq lsdb-hash-tables-are-dirty nil)
@@ -1378,13 +1399,24 @@ always hide."
 
 ;;;_. Interface to Mew written by Hideyuki SHIRAI <shirai@meadowy.org>
 (eval-when-compile
-  (autoload 'mew-sinfo-get-disp-msg "mew")
-  (autoload 'mew-current-get-fld "mew")
-  (autoload 'mew-current-get-msg "mew")
-  (autoload 'mew-frame-id "mew")
-  (autoload 'mew-cache-hit "mew")
-  (autoload 'mew-xinfo-get-decode-err "mew")
-  (autoload 'mew-xinfo-get-action "mew"))
+  (condition-case nil
+      (progn
+       (require 'mew)
+       ;; Avoid macro `mew-cache-hit' expand (Mew 1.94.2 or earlier).
+       ;; Changed `mew-cache-hit' from macro to function at Mew 2.0.
+       (if (not (fboundp 'mew-current-get-fld))
+           (setq byte-compile-macro-environment
+                 (cons '(mew-cache-hit . nil)
+                       byte-compile-macro-environment))))
+    (error
+     ;; Silence byte compiler for environments where Mew does not installed.
+     (autoload 'mew-sinfo-get-disp-msg "mew")
+     (autoload 'mew-current-get-fld "mew")
+     (autoload 'mew-current-get-msg "mew")
+     (autoload 'mew-frame-id "mew")
+     (autoload 'mew-cache-hit "mew")
+     (autoload 'mew-xinfo-get-decode-err "mew")
+     (autoload 'mew-xinfo-get-action "mew"))))
 
 ;;;###autoload
 (defun lsdb-mew-insinuate ()