]> git.eshelyaron.com Git - emacs.git/commitdiff
Add a lisp-data-mode for editing non-code lisp data
authorJoão Távora <joaotavora@gmail.com>
Sat, 18 Apr 2020 01:46:04 +0000 (02:46 +0100)
committerJoão Távora <joaotavora@gmail.com>
Sat, 18 Apr 2020 01:59:03 +0000 (02:59 +0100)
To provide a cleaner implementation remove arguments from the
auxiliary routine lisp-mode-variables.  The modes/functions that need
to do some something special adjustment do them in their own bodies.

* lisp/chistory.el (command-history-mode): Don't pass nil to
lisp-mode-variables.

* lisp/files.el (auto-mode-alist): Add entry for ".dir-locals".

* lisp/help-fns.el (describe-variable): Don't pass useless args to
lisp-mode-variables.

* lisp/emacs-lisp/pp.el (pp-to-string): Don't pass useless args to
lisp-mode-variables.

* lisp/emacs-lisp/lisp-mode.el (lisp-mode-variables):
Simplify.  Always set same variables.
(lisp-data-mode): New major mode.
(lisp-mode): Inherit from lisp-data-mode.  Set special lisp-mode
stuff here.

* lisp/progmodes/elisp-mode.el (emacs-lisp-mode): Inherit from
lisp-data-mode.
(emacs-lisp-mode): Simplify.

* lisp/progmodes/inf-lisp.el (inferior-lisp-mode): Set the needed
syntax table here, not through other function.

lisp/chistory.el
lisp/emacs-lisp/lisp-mode.el
lisp/emacs-lisp/pp.el
lisp/files.el
lisp/help-fns.el
lisp/progmodes/elisp-mode.el
lisp/progmodes/inf-lisp.el

index c9aa927b94f4863497115ace268de18fce450609..485515d07bbc62ae74cf3bf6d9ff6e0eea741a3f 100644 (file)
@@ -139,7 +139,7 @@ The buffer is left in Command History mode."
 
 Keybindings:
 \\{command-history-mode-map}"
-  (lisp-mode-variables nil)
+  (lisp-mode-variables)
   (set (make-local-variable 'revert-buffer-function) 'command-history-revert)
   (set-syntax-table emacs-lisp-mode-syntax-table))
 
index 3b0f5493eebb220d34914f9c24b74b6904234b98..8f7e6c0431b7bd9f087619311bfa306a869cc8cb 100644 (file)
@@ -611,15 +611,8 @@ Value for `adaptive-fill-function'."
   ;; a single docstring.  Let's fix it here.
   (if (looking-at "\\s-+\"[^\n\"]+\"\\s-*$") ""))
 
-(defun lisp-mode-variables (&optional lisp-syntax keywords-case-insensitive
-                                      elisp)
-  "Common initialization routine for lisp modes.
-The LISP-SYNTAX argument is used by code in inf-lisp.el and is
-\(uselessly) passed from pp.el, chistory.el, gnus-kill.el and
-score-mode.el.  KEYWORDS-CASE-INSENSITIVE non-nil means that for
-font-lock keywords will not be case sensitive."
-  (when lisp-syntax
-    (set-syntax-table lisp-mode-syntax-table))
+(defun lisp-mode-variables ()
+  "Common initialization routine for lisp modes."
   (setq-local paragraph-ignore-fill-prefix t)
   (setq-local fill-paragraph-function 'lisp-fill-paragraph)
   (setq-local adaptive-fill-function #'lisp-adaptive-fill)
@@ -643,21 +636,24 @@ font-lock keywords will not be case sensitive."
   (setq-local multibyte-syntax-as-symbol t)
   ;; (setq-local syntax-begin-function 'beginning-of-defun)  ;;Bug#16247.
   (setq font-lock-defaults
-       `(,(if elisp '(lisp-el-font-lock-keywords
-                       lisp-el-font-lock-keywords-1
-                       lisp-el-font-lock-keywords-2)
-             '(lisp-cl-font-lock-keywords
-               lisp-cl-font-lock-keywords-1
-               lisp-cl-font-lock-keywords-2))
-         nil ,keywords-case-insensitive nil nil
-         (font-lock-mark-block-function . mark-defun)
-          (font-lock-extra-managed-props help-echo)
-         (font-lock-syntactic-face-function
-          . lisp-font-lock-syntactic-face-function)))
+       (list nil nil nil nil nil
+              '(font-lock-mark-block-function . mark-defun)
+              '(font-lock-extra-managed-props help-echo)
+              '(font-lock-syntactic-face-function
+                . lisp-font-lock-syntactic-face-function)))
   (setq-local prettify-symbols-alist lisp-prettify-symbols-alist)
   (setq-local electric-pair-skip-whitespace 'chomp)
   (setq-local electric-pair-open-newline-between-pairs nil))
 
+;;;###autoload
+(define-derived-mode lisp-data-mode prog-mode "Lisp-Data"
+  "Major mode for buffers holding data written in Lisp syntax."
+  :group 'lisp
+  (lisp-mode-variables)
+  (set-syntax-table lisp-mode-syntax-table)
+  (setq-local electric-quote-string t)
+  (setq imenu-case-fold-search nil))
+
 (defun lisp-outline-level ()
   "Lisp mode `outline-level' function."
   (let ((len (- (match-end 0) (match-beginning 0))))
@@ -737,7 +733,7 @@ font-lock keywords will not be case sensitive."
   "Keymap for ordinary Lisp mode.
 All commands in `lisp-mode-shared-map' are inherited by this map.")
 
-(define-derived-mode lisp-mode prog-mode "Lisp"
+(define-derived-mode lisp-mode lisp-data-mode "Lisp"
   "Major mode for editing Lisp code for Lisps other than GNU Emacs Lisp.
 Commands:
 Delete converts tabs to spaces as it moves back.
@@ -746,7 +742,11 @@ Blank lines separate paragraphs.  Semicolons start comments.
 \\{lisp-mode-map}
 Note that `run-lisp' may be used either to start an inferior Lisp job
 or to switch back to an existing one."
-  (lisp-mode-variables nil t)
+  (setf
+   (nth 0 font-lock-defaults) '(lisp-cl-font-lock-keywords
+                                lisp-cl-font-lock-keywords-1
+                                lisp-cl-font-lock-keywords-2)
+   (nth 2 font-lock-defaults) t)
   (setq-local lisp-indent-function 'common-lisp-indent-function)
   (setq-local find-tag-default-function 'lisp-find-tag-default)
   (setq-local comment-start-skip
index 3df7b0e368e3628b76a5e93a38457d0d73757120..4d8bf52934f7c75d8c13423bfd6e1902db593e70 100644 (file)
@@ -42,7 +42,7 @@
 OBJECT can be any Lisp object.  Quoting characters are used as needed
 to make output that `read' can handle, whenever this is possible."
   (with-temp-buffer
-    (lisp-mode-variables nil)
+    (lisp-mode-variables)
     (set-syntax-table emacs-lisp-mode-syntax-table)
     (let ((print-escape-newlines pp-escape-newlines)
           (print-quoted t))
index fa72e51c4977dc7b9b32274e0c42b3a3f5be9e6c..a769d061f94abb1d2993b9a9e2edbd477573afad 100644 (file)
@@ -2657,6 +2657,9 @@ since only a single case-insensitive search through the alist is made."
      ("\\.ltx\\'" . latex-mode)
      ("\\.dtx\\'" . doctex-mode)
      ("\\.org\\'" . org-mode)
+     ;; .dir-locals.el is not really elisp.  Can't use the
+     ;; `dir-locals-file' constant since that is defined below.
+     (".dir-locals.el" . lisp-data-mode)
      ("\\.el\\'" . emacs-lisp-mode)
      ("Project\\.ede\\'" . emacs-lisp-mode)
      ("\\.\\(scm\\|stk\\|ss\\|sch\\)\\'" . scheme-mode)
index 0a99b8d6a3608643e54b0385ecf22195334fd55d..dbf2cb807b87d1f33d274e3b42834781031d0b32 100644 (file)
@@ -1000,7 +1000,7 @@ it is displayed along with the global value."
                    (terpri)
                     (let ((buf (current-buffer)))
                       (with-temp-buffer
-                        (lisp-mode-variables nil)
+                        (lisp-mode-variables)
                         (set-syntax-table emacs-lisp-mode-syntax-table)
                         (insert print-rep)
                         (pp-buffer)
index f85fd771ca80f27453500aa3db133cbd680d5931..2f231781ba1ebed7ebd9683e843055135b550586 100644 (file)
@@ -250,7 +250,7 @@ Comments in the form will be lost."
     map))
 
 ;;;###autoload
-(define-derived-mode emacs-lisp-mode prog-mode
+(define-derived-mode emacs-lisp-mode lisp-data-mode
   `("ELisp"
     (lexical-binding (:propertize "/l"
                       help-echo "Using lexical-binding mode")
@@ -268,35 +268,26 @@ Blank lines separate paragraphs.  Semicolons start comments.
 \\{emacs-lisp-mode-map}"
   :group 'lisp
   (defvar project-vc-external-roots-function)
-  (lisp-mode-variables nil nil 'elisp)
+  (setcar font-lock-defaults
+          '(lisp-el-font-lock-keywords
+            lisp-el-font-lock-keywords-1
+            lisp-el-font-lock-keywords-2))
+  (set-syntax-table emacs-lisp-mode-syntax-table)
   (add-hook 'after-load-functions #'elisp--font-lock-flush-elisp-buffers)
   (if (boundp 'electric-pair-text-pairs)
       (setq-local electric-pair-text-pairs
                   (append '((?\` . ?\') (?\‘ . ?\’))
                           electric-pair-text-pairs))
     (add-hook 'electric-pair-mode-hook #'emacs-lisp-set-electric-text-pairs))
-  (setq-local electric-quote-string t)
-  (setq imenu-case-fold-search nil)
   (add-hook 'eldoc-documentation-functions
             #'elisp-eldoc-documentation-function nil t)
   (add-hook 'xref-backend-functions #'elisp--xref-backend nil t)
   (setq-local project-vc-external-roots-function #'elisp-load-path-roots)
   (add-hook 'completion-at-point-functions
             #'elisp-completion-at-point nil 'local)
-  ;; .dir-locals.el and lock files will cause the byte-compiler and
-  ;; checkdoc emit spurious warnings, because they don't follow the
-  ;; conventions of Emacs Lisp sources.  Until we have a better fix,
-  ;; like teaching elisp-mode about files that only hold data
-  ;; structures, we disable the ELisp Flymake backend for these files.
-  (unless
-      (let* ((bfname (buffer-file-name))
-             (fname (and (stringp bfname) (file-name-nondirectory bfname))))
-        (and (stringp fname)
-             (or (string-match "\\`\\.#" fname)
-                 (string-equal dir-locals-file fname))))
-    (add-hook 'flymake-diagnostic-functions #'elisp-flymake-checkdoc nil t)
-    (add-hook 'flymake-diagnostic-functions
-              #'elisp-flymake-byte-compile nil t)))
+  (add-hook 'flymake-diagnostic-functions #'elisp-flymake-checkdoc nil t)
+  (add-hook 'flymake-diagnostic-functions
+              #'elisp-flymake-byte-compile nil t))
 
 ;; Font-locking support.
 
index 9f34a377f4a036c2a48c1cd6ef4b0746e2903f9b..aa6c7180413a1d5ad792c69bf7f83e8a5875fc85 100644 (file)
@@ -274,7 +274,8 @@ If you accidentally suspend your process, use \\[comint-continue-subjob]
 to continue it."
   (setq comint-prompt-regexp inferior-lisp-prompt)
   (setq mode-line-process '(":%s"))
-  (lisp-mode-variables t)
+  (set-syntax-table lisp-mode-syntax-table)
+  (lisp-mode-variables)
   (setq comint-get-old-input (function lisp-get-old-input))
   (setq comint-input-filter (function lisp-input-filter)))