mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-28 07:45:00 +00:00
Summary: Improve sexp-based movement in message-mode
Works by giving citations and smileys a different syntax. This helps modes like `show-paren-mode', `electric-pair-mode', and C-M-* sexp-based movement. * lisp/gnus/message.el (message--syntax-propertize): New function. (message-mode): Set syntax-related vars. (message-smileys): New variable. * test/automated/message-mode-tests.el: New file
This commit is contained in:
parent
303797134f
commit
25449e7296
@ -2961,6 +2961,30 @@ See also `message-forbidden-properties'."
|
||||
|
||||
(autoload 'ecomplete-setup "ecomplete") ;; for Emacs <23.
|
||||
|
||||
(defvar message-smileys '(":-)" ":)"
|
||||
":-(" ":("
|
||||
";-)" ";)")
|
||||
"A list of recognized smiley faces in `message-mode'.")
|
||||
|
||||
(defun message--syntax-propertize (beg end)
|
||||
"Syntax-propertize certain message text specially."
|
||||
(let ((citation-regexp (concat "^" message-cite-prefix-regexp ".*$"))
|
||||
(smiley-regexp (regexp-opt message-smileys)))
|
||||
(goto-char beg)
|
||||
(while (search-forward-regexp citation-regexp
|
||||
end 'noerror)
|
||||
(let ((start (match-beginning 0))
|
||||
(end (match-end 0)))
|
||||
(add-text-properties start (1+ start)
|
||||
`(syntax-table ,(string-to-syntax "<")))
|
||||
(add-text-properties end (min (1+ end) (point-max))
|
||||
`(syntax-table ,(string-to-syntax ">")))))
|
||||
(goto-char beg)
|
||||
(while (search-forward-regexp smiley-regexp
|
||||
end 'noerror)
|
||||
(add-text-properties (match-beginning 0) (match-end 0)
|
||||
`(syntax-table ,(string-to-syntax "."))))))
|
||||
|
||||
;;;###autoload
|
||||
(define-derived-mode message-mode text-mode "Message"
|
||||
"Major mode for editing mail and news to be sent.
|
||||
@ -3063,7 +3087,13 @@ M-RET `message-newline-and-reformat' (break the line and reformat)."
|
||||
;; multibyte is not necessary at all. -- zsh
|
||||
(mm-enable-multibyte))
|
||||
(set (make-local-variable 'indent-tabs-mode) nil) ;No tabs for indentation.
|
||||
(mml-mode))
|
||||
(mml-mode)
|
||||
;; Syntactic fontification. Helps `show-paren-mode',
|
||||
;; `electric-pair-mode', and C-M-* navigation by syntactically
|
||||
;; excluding citations and other artifacts.
|
||||
;;
|
||||
(setq-local syntax-propertize-function 'message--syntax-propertize)
|
||||
(setq-local parse-sexp-ignore-comments t))
|
||||
|
||||
(defun message-setup-fill-variables ()
|
||||
"Setup message fill variables."
|
||||
|
55
test/automated/message-mode-tests.el
Normal file
55
test/automated/message-mode-tests.el
Normal file
@ -0,0 +1,55 @@
|
||||
;;; message-mode-tests.el --- Tests for message-mdoe -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2015 Free Software Foundation, Inc.
|
||||
|
||||
;; Author: João Távora <joaotavora@gmail.com>
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This file contains tests for message-mode.
|
||||
|
||||
;;; Code:
|
||||
(require 'ert)
|
||||
(require 'ert-x)
|
||||
|
||||
(ert-deftest message-mode-propertize ()
|
||||
(with-temp-buffer
|
||||
(unwind-protect
|
||||
(progn
|
||||
(message-mode)
|
||||
(insert "here's an opener (\n"
|
||||
"here's a sad face :-(\n"
|
||||
"> here's citing someone with an opener (\n"
|
||||
"and here's a closer ")
|
||||
(let ((last-command-event ?\)))
|
||||
(ert-simulate-command '(self-insert-command 1)))
|
||||
;; Syntax propertization doesn't kick in batch mode
|
||||
(when noninteractive
|
||||
(syntax-propertize (point-max)))
|
||||
(backward-sexp)
|
||||
(should (string= "here's an opener "
|
||||
(buffer-substring-no-properties
|
||||
(line-beginning-position)
|
||||
(point))))
|
||||
(forward-sexp)
|
||||
(should (string= "and here's a closer )"
|
||||
(buffer-substring-no-properties
|
||||
(line-beginning-position)
|
||||
(point)))))
|
||||
(set-buffer-modified-p nil))))
|
||||
|
||||
(provide 'message-mode-tests)
|
||||
;;; message-mode-tests.el ends here
|
Loading…
Reference in New Issue
Block a user