[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[AUCTeX-diffs] [elpa] externals/auctex 2ccd88a 3/4: Update style/xparse.
From: |
Tassilo Horn |
Subject: |
[AUCTeX-diffs] [elpa] externals/auctex 2ccd88a 3/4: Update style/xparse.el to package dated 2020-03-06 |
Date: |
Mon, 29 Jun 2020 15:17:24 -0400 (EDT) |
branch: externals/auctex
commit 2ccd88ac3e5f00fa3a1f7b98ad4b6da23021336e
Author: Arash Esbati <arash@gnu.org>
Commit: Arash Esbati <arash@gnu.org>
Update style/xparse.el to package dated 2020-03-06
* style/xparse.el: Update style to package version 2020-03-06
incl. auto-parsing capabilities. Fix fontification of provided
macros.
---
style/xparse.el | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 216 insertions(+), 24 deletions(-)
diff --git a/style/xparse.el b/style/xparse.el
index 271ec61..79ab604 100644
--- a/style/xparse.el
+++ b/style/xparse.el
@@ -1,9 +1,9 @@
-;;; xparse.el --- AUCTeX style for `xparse.sty' version 4467.
+;;; xparse.el --- AUCTeX style for `xparse.sty' version 2020-03-06
-;; Copyright (C) 2013, 2018 Free Software Foundation, Inc.
+;; Copyright (C) 2013, 2020 Free Software Foundation, Inc.
;; Maintainer: auctex-devel@gnu.org
-;; Author: Mosè Giordano <giordano.mose@libero.it>
+;; Author: Mosè Giordano <mose@gnu.org>
;; Keywords: tex
;; This file is part of AUCTeX.
@@ -25,8 +25,13 @@
;;; Commentary:
-;; This file adds basic support for `xparse.sty' version 4467. It
-;; doesn't parse argument specification of macros and environments.
+;; This file adds basic support for `xparse.sty' version 2020-03-06.
+;; It parses argument specification of macros and environments.
+
+;; Currently, this style doesn't parse the embellishments specifiers
+;; `e' and `E'. The "yet not more supported" specifiers `l', `u', `g'
+;; and `G' are ignored completely and may lead to wrong parsing
+;; results.
;;; Code:
@@ -35,33 +40,206 @@
"font-latex"
(keywords class))
+;; Needed for auto-parsing.
+(require 'tex)
+
+(TeX-auto-add-type "xparse-macro" "LaTeX")
+
(defvar LaTeX-xparse-macro-regexp
- (concat "\\\\\\(?:Declare\\|New\\|Renew\\|Provide\\|DeclareExpandable\\)"
- "DocumentCommand[ \t\n\r]*{?[ \t\n\r]*\\\\\\([A-Za-z]+\\)[ \t\n\r]*}?"
- ;; The following is the opening brace of argument specification and is
- ;; needed to skip internal macros containing `:' or `_'.
- "[ \t\n\r]*{")
+ `(,(concat
+ (regexp-quote TeX-esc)
+ "\\(?:New\\|Renew\\|Provide\\|Declare\\)"
+ "\\(?:Expandable\\)?"
+ "DocumentCommand"
+ "[ \t\n\r]*"
+ "{?"
+ "[ \t\n\r]*"
+ (regexp-quote TeX-esc)
+ "\\([A-Za-z]+\\)"
+ "[ \t\n\r]*"
+ "}?"
+ "[ \t\n\r]*"
+
"{\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}")
+ (1 2) LaTeX-auto-xparse-macro)
"Matches macros by xparse package.")
+(TeX-auto-add-type "xparse-environment" "LaTeX")
+
(defvar LaTeX-xparse-environment-regexp
- (concat "\\\\\\(?:Declare\\|New\\|Renew\\|Provide\\)DocumentEnvironment"
- "[ \t\n\r]*{[ \t\n\r]*\\([A-Za-z]+\\)[ \t\n\r]*}")
+ `(,(concat
+ (regexp-quote TeX-esc)
+ "\\(?:New\\|Renew\\|Provide\\|Declare\\)"
+ "DocumentEnvironment"
+ "[ \t\n\r]*"
+ "{"
+ "[ \t\n\r]*"
+ "\\([A-Za-z]+\\)"
+ "[ \t\n\r]*"
+ "}"
+ "[ \t\n\r]*"
+
"{\\([^}{]*\\({[^}{]*\\({[^}{]*\\({[^}{]*}[^}{]*\\)*}[^}{]*\\)*}[^}{]*\\)*\\)}")
+ (1 2) LaTeX-auto-xparse-environment)
"Matches environments by xparse package.")
+(defun LaTeX-arg-xparse-query (optional op-brace cl-brace &optional prompt)
+ "Special query function for parsed elements from xparse package.
+If OPTIONAL is non-nil, indicate it in minibuffer. OP-BRACE sets
+the opening brace, CL-BRACE sets the closing one. PROMPT
+replaces the standard one."
+ (let ((TeX-arg-opening-brace op-brace)
+ (TeX-arg-closing-brace cl-brace))
+ (TeX-argument-insert
+ (TeX-read-string (TeX-argument-prompt optional prompt "Text"))
+ optional)))
+
+(defun LaTeX-xparse-macro-parse (type)
+ "Process parsed macro and environment definitions.
+TYPE is one of the symobols mac or env."
+ (dolist (xcmd (if (eq type 'mac)
+ (LaTeX-xparse-macro-list)
+ (LaTeX-xparse-environment-list)))
+ (let ((name (car xcmd))
+ (spec (cadr xcmd))
+ args opt-star opt-token)
+ (with-temp-buffer
+ (set-syntax-table LaTeX-mode-syntax-table)
+ ;; This one is probably not really needed?
+ (goto-char (point-min))
+ (insert (replace-regexp-in-string "[ \t\r\n%]" "" spec))
+ (goto-char (point-min))
+ (while (looking-at-p "[+!>bmrRvodODsteE]")
+ (cond (;; + or !: Long argument or space aware: Move over
+ ;; them. b is special; only available for
+ ;; enviroments
+ (looking-at-p "[+!b]")
+ (forward-char 1))
+ ((looking-at-p ">")
+ ;; Argument processors: Move over > and a balanced
+ ;; {}
+ (forward-char 1)
+ (forward-sexp))
+ ;; Mandatory arguments:
+ ;; m: Ask for input with "Text" as prompt
+ ((looking-at-p "m")
+ (forward-char 1)
+ (push "Text" args))
+ ;; r<token1><token2>
+ ((looking-at-p "r")
+ (re-search-forward "r\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t)
+ (push `(LaTeX-arg-xparse-query
+ ,(match-string-no-properties 1)
+ ,(match-string-no-properties 2))
+ args))
+ ;; R<token1><token2>{default}
+ ((looking-at-p "R")
+ (re-search-forward "R\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t)
+ (forward-sexp)
+ (push `(LaTeX-arg-xparse-query
+ ,(match-string-no-properties 1)
+ ,(match-string-no-properties 2))
+ args))
+ ;; v: Use `TeX-arg-verb-delim-or-brace'
+ ((looking-at-p "v")
+ (forward-char 1)
+ (push 'TeX-arg-verb-delim-or-brace args))
+ ;; Optional arguments:
+ ;; o standard LaTeX optional in square brackets
+ ((looking-at-p "o")
+ (forward-char 1)
+ (push (vector "Text") args))
+ ;; d<token1><token2>
+ ((looking-at-p "d")
+ (re-search-forward "d\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t)
+ (push (vector 'LaTeX-arg-xparse-query
+ (match-string-no-properties 1)
+ (match-string-no-properties 2))
+ args))
+ ;; O{default}
+ ((looking-at-p "O")
+ (forward-char 1)
+ (forward-sexp)
+ (push (vector "Text") args))
+ ;; D<token1><token2>{default}
+ ((looking-at-p "D")
+ (re-search-forward "D\\(?:\\(.\\)\\(.\\)\\)" (+ (point) 3) t)
+ (forward-sexp)
+ (push (vector 'LaTeX-arg-xparse-query
+ (match-string-no-properties 1)
+ (match-string-no-properties 2))
+ args))
+ ;; s: optional star
+ ((looking-at-p "s")
+ (forward-char 1)
+ (setq opt-star t))
+ ;; t: optional <token>
+ ((looking-at-p "t")
+ (re-search-forward "t\\(.\\)" (+ (point) 2) t)
+ (setq opt-token (match-string-no-properties 1)))
+ ;; e & E are currently ignored. e: If looking at a
+ ;; {, move one balanced expression, otherwise only
+ ;; one character.
+ ((looking-at-p "e")
+ (forward-char)
+ (if (looking-at-p TeX-grop)
+ (forward-sexp)
+ (forward-char)))
+ ;; E
+ ((looking-at-p "E")
+ (forward-char)
+ (if (looking-at-p TeX-grop)
+ (forward-sexp)
+ (forward-char))
+ (if (looking-at-p TeX-grop)
+ (forward-sexp)
+ (forward-char)))
+ ;; Finished:
+ (t nil))))
+ (if (eq type 'env)
+ (LaTeX-add-environments `(,name
+ LaTeX-env-args
+ ,@(reverse (copy-sequence args))))
+ (TeX-add-symbols (cons name
+ (reverse (copy-sequence args))))
+ (when opt-star
+ (TeX-add-symbols (cons (concat name "*")
+ (reverse (copy-sequence args)))))
+ (when opt-token
+ (TeX-add-symbols (cons (concat name opt-token)
+ (reverse (copy-sequence args)))))))))
+
+(defun LaTeX-xparse-auto-prepare ()
+ "Clear various `LaTeX-auto-xparse-*' variables before parsing."
+ (setq LaTeX-auto-xparse-macro nil
+ LaTeX-auto-xparse-environment nil))
+
+(defun LaTeX-xparse-auto-cleanup ()
+ "Process parsed elements for xparse package."
+ (LaTeX-xparse-macro-parse 'mac)
+ (LaTeX-xparse-macro-parse 'env))
+
+(add-hook 'TeX-auto-prepare-hook #'LaTeX-xparse-auto-prepare t)
+(add-hook 'TeX-auto-cleanup-hook #'LaTeX-xparse-auto-cleanup t)
+(add-hook 'TeX-update-style-hook #'TeX-auto-parse t)
+
(TeX-add-style-hook
"xparse"
(lambda ()
- (TeX-auto-add-regexp `(,LaTeX-xparse-macro-regexp 1 TeX-auto-symbol))
- (TeX-auto-add-regexp
- `(,LaTeX-xparse-environment-regexp 1 LaTeX-auto-environment))
+ (TeX-auto-add-regexp LaTeX-xparse-macro-regexp)
+ (TeX-auto-add-regexp LaTeX-xparse-environment-regexp)
(TeX-run-style-hooks
"expl3")
(TeX-add-symbols
+ ;; Declaring commands
+ '("DeclareDocumentCommand"
+ TeX-arg-define-macro "Argument specification" t)
+ '("NewDocumentCommand"
+ TeX-arg-define-macro "Argument specification" t)
+ '("RenewDocumentCommand"
+ TeX-arg-macro "Argument specification" t)
+ '("ProvideDocumentCommand"
+ TeX-arg-define-macro "Argument specification" t)
+
;; Declaring commands and environments
- '("DeclareDocumentCommand" TeX-arg-define-macro "Argument specification" t)
- '("NewDocumentCommand" TeX-arg-define-macro "Argument specification" t)
- '("RenewDocumentCommand" TeX-arg-macro "Argument specification" t)
- '("ProvideDocumentCommand" TeX-arg-define-macro "Argument specification" t)
'("DeclareDocumentEnvironment" TeX-arg-define-environment
"Argument specification" t t)
'("NewDocumentEnvironment" TeX-arg-define-environment
@@ -70,9 +248,17 @@
"Argument specification" t t)
'("ProvideDocumentEnvironment" TeX-arg-define-environment
"Argument specification" t t)
+
;; Fully-expandable document commands
'("DeclareExpandableDocumentCommand"
TeX-arg-define-macro "Argument specification" t)
+ '("NewExpandableDocumentCommand"
+ TeX-arg-define-macro "Argument specification" t)
+ '("RenewExpandableDocumentCommand"
+ TeX-arg-macro "Argument specification" t)
+ '("ProvideExpandableDocumentCommand"
+ TeX-arg-define-macro "Argument specification" t)
+
;; Testing special values
'("IfBooleanTF" 3)
'("IfBooleanT" 3)
@@ -97,18 +283,24 @@
'("GetDocumentEnvironmmentArgSpec" TeX-arg-environment)
'("ShowDocumentCommandArgSpec" TeX-arg-macro)
'("ShowDocumentEnvironmentArgSpec" TeX-arg-environment))
+
;; Fontification
(when (and (featurep 'font-latex)
(eq TeX-install-font-lock 'font-latex-setup))
(font-latex-add-keywords '(("DeclareDocumentCommand" "|{\\{{")
- ("NewDocumentCommand" "|{\\{{")
- ("RenewDocumentCommand" "|{\\{{")
+ ("NewDocumentCommand" "|{\\{{")
("ProvideDocumentCommand" "|{\\{{")
+ ("RenewDocumentCommand" "|{\\{{")
+ ;;
("DeclareExpandableDocumentCommand" "|{\\{{")
+ ("NewExpandableDocumentCommand" "|{\\{{")
+ ("ProvideExpandableDocumentCommand" "|{\\{{")
+ ("RenewExpandableDocumentCommand" "|{\\{{")
+ ;;
("DeclareDocumentEnvironment" "{{{{")
- ("NewDocumentEnvironment" "{{{{")
- ("RenewDocumentEnvironment" "{{{{")
- ("ProvideDocumentEnvironment" "{{{{"))
+ ("NewDocumentEnvironment" "{{{{")
+ ("ProvideDocumentEnvironment" "{{{{")
+ ("RenewDocumentEnvironment" "{{{{"))
'function)))
LaTeX-dialect)