Properly set a dynamic, syntactic mode name

Use mode-line-format constructs to properly set mode-name, rather than
use the very hacky solution that was filling-in for my lack of
knowledge of this feature.

* lisp/progmodes/js.el (js--update-mode-name)
(js--idly-update-mode-name): Remove.

(js--syntactic-mode-name-part): New helper function for mode-name.
(js-use-syntactic-mode-name): Helper to set up the dynamic mode-name.

(js-jsx-enable): Don’t need to call any extra functions now.
(js-mode): Use the new setup function rather than the old ones.

(js-jsx-mode): Use the same initial mode name as js-mode so the final
one is identical for both modes.
This commit is contained in:
Jackson Ray Hamilton 2019-04-07 18:12:26 -07:00
parent 7a9dac5c94
commit e48306f84f
No known key found for this signature in database
GPG key ID: B4771664B476B290

View file

@ -4288,33 +4288,27 @@ If one hasn't been set, or if it's stale, prompt for a new one."
(defvar js-syntactic-mode-name t
"If non-nil, print enabled syntaxes in the mode name.")
(defun js--update-mode-name ()
"Print enabled syntaxes if `js-syntactic-mode-name' is t."
(when js-syntactic-mode-name
(setq mode-name (concat "JavaScript"
(if js-jsx-syntax "+JSX" "")))))
(defun js--syntactic-mode-name-part ()
"Return a string like “[JSX]” when `js-jsx-syntax' is enabled."
(if js-syntactic-mode-name
(let (syntaxes)
(if js-jsx-syntax (push "JSX" syntaxes))
(if syntaxes
(concat "[" (mapconcat #'identity syntaxes ",") "]")
""))
""))
(defun js--idly-update-mode-name ()
"Update `mode-name' whenever Emacs goes idle.
In case `js-jsx-syntax' is updated, especially by features of
Emacs like .dir-locals.el or file variables, this ensures the
modeline eventually reflects which syntaxes are enabled."
(let (timer)
(setq timer
(run-with-idle-timer
0 t
(lambda (buffer)
(if (buffer-live-p buffer)
(with-current-buffer buffer
(js--update-mode-name))
(cancel-timer timer)))
(current-buffer)))))
(defun js-use-syntactic-mode-name ()
"Print enabled syntaxes if `js-syntactic-mode-name' is t.
Modes deriving from `js-mode' should call this to ensure that
their `mode-name' updates to show enabled syntax extensions."
(when (stringp mode-name)
(setq mode-name `(,mode-name (:eval (js--syntactic-mode-name-part))))))
(defun js-jsx-enable ()
"Enable JSX in the current buffer."
(interactive)
(setq-local js-jsx-syntax t)
(js--update-mode-name))
(setq-local js-jsx-syntax t))
(defvar js-jsx-regexps
(list "\\_<\\(?:var\\|let\\|const\\|import\\)\\_>.*?React")
@ -4395,8 +4389,7 @@ This function is intended for use in `after-change-functions'."
;; Syntax extensions
(unless (js-jsx--detect-and-enable)
(add-hook 'after-change-functions #'js-jsx--detect-after-change nil t))
(js--update-mode-name) ; If `js-jsx-syntax' was set from outside.
(js--idly-update-mode-name)
(js-use-syntactic-mode-name)
;; Imenu
(setq imenu-case-fold-search nil)
@ -4443,7 +4436,7 @@ This function is intended for use in `after-change-functions'."
)
;;;###autoload
(define-derived-mode js-jsx-mode js-mode "JavaScript+JSX"
(define-derived-mode js-jsx-mode js-mode "JavaScript"
"Major mode for editing JavaScript+JSX.
Simply makes `js-jsx-syntax' buffer-local and sets it to t.
@ -4456,7 +4449,8 @@ could set `js-jsx-syntax' to t in your init file, or in a
`js-jsx-enable' in `js-mode-hook'. You may be better served by
one of the aforementioned options instead of using this mode."
:group 'js
(js-jsx-enable))
(js-jsx-enable)
(js-use-syntactic-mode-name))
;;;###autoload (defalias 'javascript-mode 'js-mode)