Hi all,

I think we can improve the support for LaTeX3 programming in
style/expl3.  I had a brief look at interfaces.pdf and there is not much
code needed to get completion support for macro defining commands.  My
initial approach on this is attached.

Reg. fontification: My current thinking is to do this for top-level
macros and the name of the new macro, leaving out the rest, e.g.:
What do people think, is it worth the trouble?

Best, Arash
diff --git a/style/expl3.el b/style/expl3.el
index d130a66b..22d7d0db 100644
--- a/style/expl3.el
+++ b/style/expl3.el
@@ -44,6 +44,35 @@
     (modify-syntax-entry ?\: "_" st)
     st))
 
+(defun TeX-arg-expl3-macro (_optional &optional prompt definition no-param)
+  "Read and insert an expl3 macro."
+  (let* ((macro (completing-read
+                 (TeX-argument-prompt nil prompt
+                                      (concat "Function: " TeX-esc)
+                                      t)
+                 (TeX-symbol-list)))
+         (params (progn
+                   (when (string-empty-p macro)
+                     (error "%s" "Function name missing"))
+                   (if no-param
+                       ""
+                     (TeX-read-string
+                      (TeX-argument-prompt t nil "Parameter")))))
+         (TeX-arg-opening-brace "")
+         (TeX-arg-closing-brace ""))
+    (when (and definition (not (string-empty-p macro)))
+      (TeX-add-symbols macro))
+    (just-one-space)
+    (TeX-argument-insert macro nil TeX-esc)
+    (just-one-space)
+    (unless (string-empty-p params)
+      (TeX-argument-insert params nil)
+      (just-one-space))))
+
+(defun TeX-arg-expl3-define-macro (optional &optional prompt no-param)
+  "Define a expl3 macro."
+  (TeX-arg-expl3-macro optional prompt t no-param))
+
 (TeX-add-style-hook
  "expl3"
  (lambda ()
@@ -55,6 +84,8 @@
      (add-to-list 'font-latex-match-simple-include-list ":" t))
 
    (TeX-add-symbols
+
+    ;; 2.1 Using the LaTeX3 modules
     '("ExplSyntaxOn" 0)
     '("ExplSyntaxOff" 0)
 
@@ -68,7 +99,108 @@
 
     '("ProvidesExplPackage"
       (TeX-arg-file-name-sans-extension "Package name")
-      TeX-arg-date TeX-arg-version "Description"))
+      TeX-arg-date TeX-arg-version "Description")
+
+    '("GetIdInfo"
+      (TeX-arg-literal " $Id: ")
+      (TeX-arg-free "SVN info field")
+      (TeX-arg-literal " $ ") "Description")
+
+    '("ExplFileName" 0)
+    '("ExplFileDate" 0)
+    '("ExplFileVersion" 0)
+    '("ExplFileDescription" 0)
+
+    ;; 4.1 No operation functions
+    "prg_do_nothing:" "scan_stop:"
+
+    ;; 4.2 Grouping material
+    "group_begin:" "group_end:"
+    "group_insert_after:N"
+    "group_show_list:" "group_log_list:"
+
+    ;; 4.3.2 Defining new functions using parameter text
+    '("cs_new:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_new:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_new:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_new:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_new:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_new:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_new_nopar:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_new_nopar:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_new_nopar:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_new_nopar:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_new_nopar:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_new_nopar:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected_nopar:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected_nopar:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected_nopar:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected_nopar:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected_nopar:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_new_protected_nopar:cpx" TeX-arg-expl3-define-macro t)
+
+    '("cs_set:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_set:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_set:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_set:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_set:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_set:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_set_nopar:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_set_nopar:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_set_nopar:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_set_nopar:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_set_nopar:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_set_nopar:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected_nopar:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected_nopar:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected_nopar:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected_nopar:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected_nopar:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_set_protected_nopar:cpx" TeX-arg-expl3-define-macro t)
+
+    '("cs_gset:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_gset:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_gset:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_gset:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_gset:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_gset:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_gset_nopar:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_gset_nopar:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_gset_nopar:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_gset_nopar:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_gset_nopar:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_gset_nopar:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected:cpx" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected_nopar:Npn" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected_nopar:cpn" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected_nopar:Npe" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected_nopar:cpe" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected_nopar:Npx" TeX-arg-expl3-define-macro t)
+    '("cs_gset_protected_nopar:cpx" TeX-arg-expl3-define-macro t)
+
+    ;; 4.3.3 Defining new functions using the signature
+    '("cs_new:Nn" TeX-arg-expl3-define-macro t)
+    '("cs_new:cn" TeX-arg-expl3-define-macro t)
+    '("cs_new:Ne" TeX-arg-expl3-define-macro t)
+    '("cs_new:ce" TeX-arg-expl3-define-macro t)
+    )
 
    ;; Fontification
    (when (and (featurep 'font-latex)
@@ -78,7 +210,90 @@
                               'warning)
      (font-latex-add-keywords '(("ProvidesExplClass"   "{{{{")
                                 ("ProvidesExplFile"    "{{{{")
-                                ("ProvidesExplPackage" "{{{{"))
+                                ("ProvidesExplPackage" "{{{{")
+                                ("GetIdInfo"           "")
+
+                                ("cs_new:Npn" "\\")
+                                ("cs_new:cpn" "\\")
+                                ("cs_new:Npe" "\\")
+                                ("cs_new:cpe" "\\")
+                                ("cs_new:Npx" "\\")
+                                ("cs_new:cpx" "\\")
+                                ("cs_new_nopar:Npn" "\\")
+                                ("cs_new_nopar:cpn" "\\")
+                                ("cs_new_nopar:Npe" "\\")
+                                ("cs_new_nopar:cpe" "\\")
+                                ("cs_new_nopar:Npx" "\\")
+                                ("cs_new_nopar:cpx" "\\")
+                                ("cs_new_protected:Npn" "\\")
+                                ("cs_new_protected:cpn" "\\")
+                                ("cs_new_protected:Npe" "\\")
+                                ("cs_new_protected:cpe" "\\")
+                                ("cs_new_protected:Npx" "\\")
+                                ("cs_new_protected:cpx" "\\")
+                                ("cs_new_protected_nopar:Npn" "\\")
+                                ("cs_new_protected_nopar:cpn" "\\")
+                                ("cs_new_protected_nopar:Npe" "\\")
+                                ("cs_new_protected_nopar:cpe" "\\")
+                                ("cs_new_protected_nopar:Npx" "\\")
+                                ("cs_new_protected_nopar:cpx" "\\")
+
+                                ("cs_set:Npn" "\\")
+                                ("cs_set:cpn" "\\")
+                                ("cs_set:Npe" "\\")
+                                ("cs_set:cpe" "\\")
+                                ("cs_set:Npx" "\\")
+                                ("cs_set:cpx" "\\")
+                                ("cs_set_nopar:Npn" "\\")
+                                ("cs_set_nopar:cpn" "\\")
+                                ("cs_set_nopar:Npe" "\\")
+                                ("cs_set_nopar:cpe" "\\")
+                                ("cs_set_nopar:Npx" "\\")
+                                ("cs_set_nopar:cpx" "\\")
+                                ("cs_set_protected:Npn" "\\")
+                                ("cs_set_protected:cpn" "\\")
+                                ("cs_set_protected:Npe" "\\")
+                                ("cs_set_protected:cpe" "\\")
+                                ("cs_set_protected:Npx" "\\")
+                                ("cs_set_protected:cpx" "\\")
+                                ("cs_set_protected_nopar:Npn" "\\")
+                                ("cs_set_protected_nopar:cpn" "\\")
+                                ("cs_set_protected_nopar:Npe" "\\")
+                                ("cs_set_protected_nopar:cpe" "\\")
+                                ("cs_set_protected_nopar:Npx" "\\")
+                                ("cs_set_protected_nopar:cpx" "\\")
+
+                                ("cs_gset:Npn" "\\")
+                                ("cs_gset:cpn" "\\")
+                                ("cs_gset:Npe" "\\")
+                                ("cs_gset:cpe" "\\")
+                                ("cs_gset:Npx" "\\")
+                                ("cs_gset:cpx" "\\")
+                                ("cs_gset_nopar:Npn" "\\")
+                                ("cs_gset_nopar:cpn" "\\")
+                                ("cs_gset_nopar:Npe" "\\")
+                                ("cs_gset_nopar:cpe" "\\")
+                                ("cs_gset_nopar:Npx" "\\")
+                                ("cs_gset_nopar:cpx" "\\")
+                                ("cs_gset_protected:Npn" "\\")
+                                ("cs_gset_protected:cpn" "\\")
+                                ("cs_gset_protected:Npe" "\\")
+                                ("cs_gset_protected:cpe" "\\")
+                                ("cs_gset_protected:Npx" "\\")
+                                ("cs_gset_protected:cpx" "\\")
+                                ("cs_gset_protected_nopar:Npn" "\\")
+                                ("cs_gset_protected_nopar:cpn" "\\")
+                                ("cs_gset_protected_nopar:Npe" "\\")
+                                ("cs_gset_protected_nopar:cpe" "\\")
+                                ("cs_gset_protected_nopar:Npx" "\\")
+                                ("cs_gset_protected_nopar:cpx" "\\")
+
+                                ("cs_new:Nn" "\\")
+                                ("cs_new:cn" "\\")
+                                ("cs_new:Ne" "\\")
+                                ("cs_new:ce" "\\")
+
+                                )
                               'function)))
  TeX-dialect)
 

Reply via email to