all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Scan of regexp mistakes
@ 2019-03-03 18:01 Mattias Engdegård
  2019-03-05  2:04 ` Paul Eggert
  0 siblings, 1 reply; 16+ messages in thread
From: Mattias Engdegård @ 2019-03-03 18:01 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 528 bytes --]

Here is a sweep of potential mistakes in regexp strings in elisp code in the Emacs tree: obsolete syntax, questionable constructs, and so on.

Most of the warnings are harmless, but some look like outright bugs. Perhaps those with knowledge of the code would be interested in taking a look. Some of the cases are quite entertaining.

The errors were gathered by the rather hacky trawl.el, attached (in case you want to run it on other code). It only requires xr (1.4 or later). To use, run trawl-directory or trawl-file.


[-- Attachment #2: trawl.log --]
[-- Type: application/octet-stream, Size: 26979 bytes --]

;; Trawling ~/emacs  -*- compilation -*-
emacs/admin/admin.el:91: In call to re-search-forward: Unescaped literal `+' (pos 3): "^\\(+++ *\\|--- *\\)$"
emacs/admin/admin.el:91: In call to re-search-forward: Repetition of repetition (pos 5): "^\\(+++ *\\|--- *\\)$"
emacs/lisp/calc/calc-graph.el:1074: In call to re-search-backward: Escaped non-special character `}' (pos 7): ":\\(.*\\)\\}"
emacs/lisp/calc/calc-graph.el:1181: In call to looking-at: Unescaped literal `*' (pos 0): "*"
emacs/lisp/calc/calc-help.el:140: In call to string-match: Escaped non-special character `L' (pos 7): "\\(DEL\\|\\LFD\\|RET\\|SPC\\|TAB\\)"
emacs/lisp/calc/calc-lang.el:740: In call to string-match: Escaped non-special character `h' (pos 0): "\\hbox{"
emacs/lisp/calc/calc-lang.el:740: In call to string-match: Escaped non-special character `t' (pos 0): "\\text{"
emacs/lisp/calc/calc-lang.el:1129: In call to string-match: Unescaped literal `+' (pos 8): "->\\|<-\\|+-\\|\\\\dots\\|~\\|\\^"
emacs/lisp/calc/calc.el:2392: In call to looking-at: Unescaped literal `+' (pos 0): "+"
emacs/lisp/cedet/ede/makefile-edit.el:98: In call to re-search-forward: Repetition of repetition (pos 4): "\\s-**\\([-a-zA-Z0-9./_@$%(){}]+\\)\\s-*"
emacs/lisp/cedet/ede/speedbar.el:274: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/cedet/semantic/sb.el:279: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/cedet/semantic/sb.el:325: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/emacs-lisp/chart.el:698: In call to re-search-forward: Escaped non-special character `-' (pos 0): "\\-[A-Z][a-z][a-z] +\\(\\w+\\)@\\w+"
emacs/lisp/emacs-lisp/eieio-opt.el:327: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/emacs-lisp/eieio-speedbar.el:348: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/emacs-lisp/rx.el:607: In call to string-match: Unescaped literal `^' (pos 4): "\\`\\[^"
emacs/lisp/emacs-lisp/rx.el:759: In call to string-match: Unescaped literal `^' (pos 4): "\\`\\[^?]?\\(?:\\[:[a-z]+:]\\|[^]]\\)*\\]\\'"
emacs/lisp/emulation/viper-ex.el:399: In call to looking-at: Unescaped literal `+' (pos 0): "+[-+]"
emacs/lisp/emulation/viper-ex.el:399: In call to looking-at: Unescaped literal `+' (pos 0): "+[\n|]"
emacs/lisp/emulation/viper-ex.el:399: In call to looking-at: Unescaped literal `+' (pos 0): "+[0-9]"
emacs/lisp/emulation/viper-ex.el:399: In call to looking-back: Duplicated `\' inside character alternative (pos 3): "[^\\\\]\\(\\\\\\\\\\)*\\\\/"
emacs/lisp/emulation/viper-ex.el:399: In call to looking-back: Duplicated `\' inside character alternative (pos 3): "[^\\\\]\\(\\\\\\\\\\)*\\\\\\?"
emacs/lisp/emulation/viper-ex.el:730: In call to looking-at: Duplicated `\' inside character alternative (pos 3): "[^\\\\\n]"
emacs/lisp/emulation/viper-ex.el:1673: In call to string-match: Duplicated `\' inside character alternative (pos 5): "^[ \\t\\n]*$"
emacs/lisp/erc/erc-speedbar.el:142: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/erc/erc-speedbar.el:184: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/erc/erc-speedbar.el:287: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/erc/erc.el:4285: In call to string-match: Escaped non-special character `A' (pos 2): "^\001\\ACTION.*\001$"
emacs/lisp/erc/erc.el:4472: In call to string-match: Unescaped literal `+' (pos 1): "^+"
emacs/lisp/eshell/em-dirs.el:272: In call to looking-at: Duplicated `\' inside character alternative (pos 19): "\\([A-Za-z]:\\)\\([^/\\\\]\\|\\'\\)"
emacs/lisp/eshell/em-dirs.el:303: In call to string-match: Duplicated `\' inside character alternative (pos 13): "\\`[A-Za-z]:[\\\\/]\\'"
emacs/lisp/gnus/gnus-art.el:7380: In gnus-button-valid-localpart-regexp: Ranges `*-=' and `0-9' overlap (pos 10): "[a-z0-9$%(*-=?[_][^<>\")!;:,{}\n\t @]*"
emacs/lisp/gnus/gnus.el:3735: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/gnus/message.el:1279: In call to looking-at: Duplicated `\' inside character alternative (pos 37): "[ \t]\\|[][!\"#$%&'()*+,-./0-9;<=>?@A-Z\\\\^_`a-z{|}~]+:"
emacs/lisp/international/mule.el:2532: In call to re-search-forward: Reversed range `s-/' matches nothing (pos 101): "<meta\\s-+\\(http-equiv=[\"']?content-type[\"']?\\s-+content=[\"']text/\\sw+;\\s-*\\)?charset=[\"']?\\(.+?\\)[\"'\\s-/>]"
emacs/lisp/language/ethio-util.el:785: In call to re-search-forward: Duplicated `\' inside character alternative (pos 7): "\\ce[\273\\.\\?]\\|\253\\ce"
emacs/lisp/mail/rmail.el:2567: In call to looking-at: Unescaped literal `?' (pos 0): "?D"
emacs/lisp/mh-e/mh-alias.el:326: In call to string-match: Character `_' included in range `A-z' (pos 32): "^\\([-a-zA-Z0-9._]+\\)@[-a-zA-z0-9_]+\\.+[a-zA-Z0-9]+$"
emacs/lisp/mh-e/mh-comp.el:552: In call to re-search-forward: Unescaped literal `+' (pos 23): "^#forw \\[\\([^]]+\\)\\] \\(+\\S-+\\) \\(.*\\)$"
emacs/lisp/mh-e/mh-search.el:487: In call to re-search-backward: Unescaped literal `+' (pos 1): "^+"
emacs/lisp/mh-e/mh-search.el:487: In call to re-search-forward: Unescaped literal `+' (pos 1): "^+"
emacs/lisp/mh-e/mh-search.el:487: In call to re-search-backward: Unescaped literal `+' (pos 1): "^+"
emacs/lisp/mh-e/mh-search.el:487: In call to re-search-forward: Unescaped literal `+' (pos 1): "^+"
emacs/lisp/mh-e/mh-search.el:1425: In call to re-search-forward: Unescaped literal `+' (pos 1): "^+"
emacs/lisp/mh-e/mh-xface.el:190: In call to string-match: Unescaped literal `+' (pos 11): "\\([^+]*\\)\\(+.*\\)?@\\(.*\\)"
emacs/lisp/net/ange-ftp.el:2692: In call to string-match: Unescaped literal `*' (pos 0): "*\\'"
emacs/lisp/net/goto-addr.el:99: In goto-address-mail-regexp: Character `_' included in range `A-z' (pos 31): "[-a-zA-Z0-9=._+]+@\\([-a-zA-z0-9_]+\\.\\)+[a-zA-Z0-9]+"
emacs/lisp/net/goto-addr.el:245: In call to re-search-backward: Character `_' included in range `A-z' (pos 4): "[^-_A-z0-9.@]"
emacs/lisp/net/pop3.el:573: In call to looking-at: Unescaped literal `+' (pos 0): "+OK"
emacs/lisp/net/pop3.el:683: In call to string-match: Unescaped literal `+' (pos 0): "+OK"
emacs/lisp/net/pop3.el:690: In call to string-match: Unescaped literal `+' (pos 0): "+OK"
emacs/lisp/net/pop3.el:697: In call to string-match: Unescaped literal `+' (pos 0): "+OK"
emacs/lisp/net/tramp.el:873: In tramp-ipv6-regexp: Repetition of repetition (pos 22): "\\(?:\\(?:[a-zA-Z0-9]+\\)?:\\)+[a-zA-Z0-9.]+"
emacs/lisp/net/tramp.el:2082: In call to string-match: Unescaped literal `$' (pos 0): "$\\(\\w+\\)"
emacs/lisp/nxml/nxml-maint.el:32: In call to re-search-forward: Reversed range `a-F' matches nothing (pos 6): "^ *\\([a-FA-F0-9]\\{2\\}\\)[ \t]+"
emacs/lisp/nxml/nxml-maint.el:32: In call to re-search-forward: Reversed range `a-F' matches nothing (pos 3): "\\([a-FA-F0-9]\\{2\\}\\)-\\([a-FA-F0-9]\\{2\\}\\)\\|\\([a-FA-F0-9]\\{2\\}\\)"
emacs/lisp/nxml/nxml-maint.el:32: In call to re-search-forward: Reversed range `a-F' matches nothing (pos 24): "\\([a-FA-F0-9]\\{2\\}\\)-\\([a-FA-F0-9]\\{2\\}\\)\\|\\([a-FA-F0-9]\\{2\\}\\)"
emacs/lisp/nxml/nxml-maint.el:32: In call to re-search-forward: Reversed range `a-F' matches nothing (pos 46): "\\([a-FA-F0-9]\\{2\\}\\)-\\([a-FA-F0-9]\\{2\\}\\)\\|\\([a-FA-F0-9]\\{2\\}\\)"
emacs/lisp/nxml/rng-uri.el:43: In call to replace-regexp-in-string: Duplicated `n' inside character alternative (pos 4): "[:nonascii:]"
emacs/lisp/nxml/rng-uri.el:43: In call to replace-regexp-in-string: Duplicated `i' inside character alternative (pos 9): "[:nonascii:]"
emacs/lisp/nxml/rng-uri.el:43: In call to replace-regexp-in-string: Duplicated `:' inside character alternative (pos 10): "[:nonascii:]"
emacs/lisp/nxml/rng-xsd.el:362: In call to string-match: Repetition of repetition (pos 38): "\\`\\(?:[^%]\\|%[0-9a-fA-F][0-9a-fA-F]\\)?*\\'"
emacs/lisp/obsolete/pgg.el:570: In call to string-match: Duplicated `\' inside character alternative (pos 10): "^[a-zA-Z\\+\\.\\\\-]+:"
emacs/lisp/obsolete/pgg.el:570: In call to string-match: Duplicated `\' inside character alternative (pos 13): "^[a-zA-Z\\+\\.\\\\-]+:"
emacs/lisp/obsolete/vip.el:2163: In call to looking-at: Unescaped literal `+' (pos 0): "+"
emacs/lisp/obsolete/vip.el:2163: In call to looking-at: Unescaped literal `+' (pos 0): "+[-+]"
emacs/lisp/obsolete/vip.el:2163: In call to looking-at: Unescaped literal `+' (pos 0): "+[\n|]"
emacs/lisp/obsolete/vip.el:2163: In call to looking-at: Unescaped literal `+' (pos 0): "+[0-9]"
emacs/lisp/obsolete/vip.el:2504: In call to looking-at: Unescaped literal `+' (pos 0): "+"
emacs/lisp/org/ob-core.el:2955: In call to string-match: Escaped non-special character `"' (pos 0): "\\\"\\(.+\\)\\\""
emacs/lisp/org/ob-core.el:2955: In call to string-match: Escaped non-special character `"' (pos 8): "\\\"\\(.+\\)\\\""
emacs/lisp/org/org-agenda.el:9437: In call to re-search-forward: Unescaped literal `*' (pos 1): "^*[ \t]+Anniversaries"
emacs/lisp/org/org-element.el:2105: In call to looking-at: Repetition of repetition (pos 14): "[ \t]*#\\+\\(\\S-+*\\):"
emacs/lisp/org/org-list.el:2625: In call to string-match: Unescaped literal `*' (pos 0): "*"
emacs/lisp/org/org-mhe.el:141: In call to re-search-forward: Unescaped literal `+' (pos 3): "^\\(+.*\\)$"
emacs/lisp/org/org-mobile.el:773: In call to re-search-forward: Unescaped literal `*' (pos 1): "^** Old value[ \t]*$"
emacs/lisp/org/org-mobile.el:773: In call to re-search-forward: Unescaped literal `*' (pos 1): "^** New value[ \t]*$"
emacs/lisp/org/org-mouse.el:620: In call to looking-at: Unescaped literal `+' (pos 11): "\\(  \\|\t\\)\\(+:[0-9a-zA-Z_:]+\\)?\\(  \\|\t\\)+$"
emacs/lisp/org/org-plot.el:273: In call to re-search-forward: Unescaped literal `$' (pos 0): "$datafile"
emacs/lisp/org/org-protocol.el:306: In call to string-match: Ranges `A-z' and `a-z' overlap (pos 28): "^\\(.*\\)\\(org-protocol:/+[a-zA-z0-9][-_a-zA-z0-9]*:/+\\)\\(.*\\)"
emacs/lisp/org/org-protocol.el:306: In call to string-match: Character `_' included in range `A-z' (pos 41): "^\\(.*\\)\\(org-protocol:/+[a-zA-z0-9][-_a-zA-z0-9]*:/+\\)\\(.*\\)"
emacs/lisp/org/org-table.el:1120: In call to string-match: Repetition of repetition (pos 21): "\\([-+]\\)?\\(?:[0-9]+\\)?\\(?:.[0-9]+\\)?"
emacs/lisp/org/org-table.el:2309: In call to string-match: Unescaped literal `$' (pos 2): "\\`$[<>]"
emacs/lisp/org/org-table.el:2335: In call to string-match-p: Unescaped literal `$' (pos 2): "\\`$\\([0-9]+\\|[<>]+\\)\\'"
emacs/lisp/org/org-table.el:3178: In call to string-match: Unescaped literal `$' (pos 2): "\\`$[<>]"
emacs/lisp/org/org-table.el:3605: In call to string-match: Unescaped literal `$' (pos 2): "\\`$\\([0-9]+\\|[<>]+\\)\\'"
emacs/lisp/org/org.el:10456: In call to string-match: Repetition of repetition (pos 7): "^//\\(.?*\\)/\\(<.*>\\)$"
emacs/lisp/org/org.el:22836: In call to looking-at: Duplicated `\' inside character alternative (pos 12): "\\\\\\\\\\($\\|[^\\\\]\\)"
emacs/lisp/org/ox-ascii.el:1442: In call to replace-regexp-in-string: Unescaped literal `+' (pos 0): "+"
emacs/lisp/org/ox-ascii.el:1442: In call to replace-regexp-in-string: Unescaped literal `*' (pos 0): "*"
emacs/lisp/org/ox-latex.el:1614: In call to replace-regexp-in-string: Escaped non-special character `e' (pos 2): "\\(\\end{[A-Za-z0-9*]+}\\|^\\)[ \t]*\\\\\\\\[ \t]*$"
emacs/lisp/org/ox.el:3270: In call to string-match: Repetition of repetition (pos 23): ":lines +\"\\(\\(?:[0-9]+\\)?-\\(?:[0-9]+\\)?\\)\""
emacs/lisp/org/ox.el:3270: In call to string-match: Repetition of repetition (pos 37): ":lines +\"\\(\\(?:[0-9]+\\)?-\\(?:[0-9]+\\)?\\)\""
emacs/lisp/progmodes/ada-xref.el:411: In call to string-match: Unescaped literal `$' (pos 18): "\\(-[^-$IO]*[IO]\\)?${\\([^}]+\\)}"
emacs/lisp/progmodes/cc-awk.el:133: In c-awk-harmless-char-re: Duplicated `\' inside character alternative (pos 12): "[^_#/\"{}();\\\\\n\r]"
emacs/lisp/progmodes/cc-awk.el:144: In c-awk-harmless-line-char-re: Duplicated `\' inside character alternative (pos 7): "[^_#/\"\\\\\n\r]"
emacs/lisp/progmodes/cc-awk.el:253: In c-awk-_-harmless-nonws-char-re: Duplicated `\' inside character alternative (pos 6): "[^#/\"\\\\\n\r \t]"
emacs/lisp/progmodes/cc-engine.el:5064: In call to looking-at: Unescaped literal `*' (pos 0): "*/"
emacs/lisp/progmodes/cc-mode.el:1270: In call to looking-at: Escaped non-special character `\r' (pos 11): "\\(\\\\\\(.\\|\n|\\\r\\)\\|[^\"]\\)*"
emacs/lisp/progmodes/cfengine.el:845: In cfengine2-font-lock-keywords: Unescaped literal `$' (pos 0): "$(\\([[:alnum:]_]+\\))"
emacs/lisp/progmodes/cfengine.el:845: In cfengine2-font-lock-keywords: Unescaped literal `$' (pos 0): "${\\([[:alnum:]_]+\\)}"
emacs/lisp/progmodes/cperl-mode.el:3115: In call to re-search-forward: Duplicated `\' inside character alternative (pos 17): "\\=\\w+[ \t]*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*"
emacs/lisp/progmodes/cperl-mode.el:3115: In call to re-search-forward: Duplicated `\' inside character alternative (pos 26): "\\=\\w+[ \t]*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*"
emacs/lisp/progmodes/cperl-mode.el:3115: In call to re-search-forward: Duplicated `\' inside character alternative (pos 39): "\\=\\w+[ \t]*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*"
emacs/lisp/progmodes/cperl-mode.el:3115: In call to re-search-forward: Duplicated `\' inside character alternative (pos 48): "\\=\\w+[ \t]*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*"
emacs/lisp/progmodes/cperl-mode.el:3115: In call to re-search-forward: Duplicated `\' inside character alternative (pos 17): "\\=\\w+[ \t]*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*#"
emacs/lisp/progmodes/cperl-mode.el:3115: In call to re-search-forward: Duplicated `\' inside character alternative (pos 26): "\\=\\w+[ \t]*#\\([^\n\\\\#]\\|\\\\[\\\\#]\\)*#"
emacs/lisp/progmodes/cperl-mode.el:3555: In call to looking-at: Escaped non-special character `e' (pos 7): "\\(cut\\|\\end\\)\\>"
emacs/lisp/progmodes/cperl-mode.el:3555: In call to re-search-forward: Escaped non-special character `e' (pos 10): "^\n=\\(cut\\|\\end\\)\\>"
emacs/lisp/progmodes/cperl-mode.el:3555: In call to re-search-forward: Escaped non-special character `e' (pos 9): "\n=\\(cut\\|\\end\\)\\>"
emacs/lisp/progmodes/cperl-mode.el:4953: In call to looking-at: Escaped non-special character `e' (pos 16): "[ \t]*}?[ \t]*\\<\\(\\els\\(e\\|if\\)\\|continue\\|unless\\|if\\|while\\|for\\(each\\)?\\|until\\)\\>\\(\t*\\|[ \t][ \t]+\\)[^ \t\n#]"
emacs/lisp/progmodes/cperl-mode.el:4953: In call to looking-at: Escaped non-special character `e' (pos 20): "[ \t]*\\(}[ \t]*\\)?\\<\\(\\els\\(e\\|if\\)\\|continue\\|if\\|unless\\|while\\|for\\(each\\)?\\(\\([ \t]+\\(state\\|my\\|local\\|our\\)\\)?[ \t]*\\$[_a-zA-Z0-9]+\\)?\\|until\\)\\>\\([ \t]*(\\|[ \t\n]*{\\)\\|[ \t]*{"
emacs/lisp/progmodes/cperl-mode.el:7363: In call to re-search-backward: Character `-' included in range `,-.' (pos 17): "[-a-zA-Z0-9_:!&*+,-./<=>?\\\\^|~$%@]"
emacs/lisp/progmodes/cperl-mode.el:7363: In call to re-search-backward: Duplicated `\' inside character alternative (pos 26): "[-a-zA-Z0-9_:!&*+,-./<=>?\\\\^|~$%@]"
emacs/lisp/progmodes/cperl-mode.el:7363: In call to looking-at: Character `-' included in range `,-.' (pos 6): "[-!&*+,-./<=>?\\\\^|~]"
emacs/lisp/progmodes/cperl-mode.el:7363: In call to looking-at: Duplicated `\' inside character alternative (pos 15): "[-!&*+,-./<=>?\\\\^|~]"
emacs/lisp/progmodes/cperl-mode.el:8119: In call to re-search-forward: Duplicated `\' inside character alternative (pos 9): "\\(\\=\\|[^\\\\]\\)\\(\\\\\\\\\\)*[ \t\n#]"
emacs/lisp/progmodes/dcl-mode.el:1577: In call to re-search-forward: Unescaped literal `$' (pos 1): "^$[ \t]*"
emacs/lisp/progmodes/etags.el:1641: In call to looking-at: Repetition of repetition (pos 23): "[ \t()=,;]?\177\\(?:[0-9]+\\)?,\\(?:[0-9]+\\)?$"
emacs/lisp/progmodes/etags.el:1641: In call to looking-at: Repetition of repetition (pos 37): "[ \t()=,;]?\177\\(?:[0-9]+\\)?,\\(?:[0-9]+\\)?$"
emacs/lisp/progmodes/fortran.el:1991: In call to re-search-forward: Character `,' included in range `+-/' (pos 5): "[\t\n,'+-/*)=]"
emacs/lisp/progmodes/gdb-mi.el:1371: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/progmodes/gdb-mi.el:4146: In call to string-match: Escaped non-special character `0' (pos 0): "\\0x"
emacs/lisp/progmodes/grep.el:455: In grep-mode-font-lock-keywords: Ranges `A-z' and `a-z' overlap (pos 10): "^Grep[/a-zA-z]* started.*"
emacs/lisp/progmodes/grep.el:455: In grep-mode-font-lock-keywords: Ranges `A-z' and `a-z' overlap (pos 10): "^Grep[/a-zA-z]* finished with \\(?:\\(\\(?:[0-9]+ \\)?matches found\\)\\|\\(no matches found\\)\\).*"
emacs/lisp/progmodes/grep.el:455: In grep-mode-font-lock-keywords: Ranges `A-z' and `a-z' overlap (pos 10): "^Grep[/a-zA-z]* \\(exited abnormally\\|interrupt\\|killed\\|terminated\\)\\(?:.*with code \\([0-9]+\\)\\)?.*"
emacs/lisp/progmodes/gud.el:2226: In call to string-match: Unescaped literal `$' (pos 0): "$.*"
emacs/lisp/progmodes/js.el:1819: In call to looking-at: Unescaped literal `+' (pos 0): "+\\+\\|--\\|/[/*]"
emacs/lisp/progmodes/m4-mode.el:65: In m4-font-lock-keywords: Escaped non-special character `@' (pos 2): "\\$\\@"
emacs/lisp/progmodes/meta-mode.el:662: In call to re-search-forward: Duplicated `\' inside character alternative (pos 3): "[^\\\\\"]%\\|\n\\|\\'"
emacs/lisp/progmodes/mixal-mode.el:1039: In mixal-font-lock-keywords: Reversed range `O-9' matches nothing (pos 22): "^[A-Z0-9a-z]*[ \t]+[A-ZO-9a-z]+[ \t]+\\(=.*=\\)"
emacs/lisp/progmodes/opascal.el:1512: In call to string-match: Duplicated `\' inside character alternative (pos 9): "^\\(.+\\)[\\\\/]$"
emacs/lisp/progmodes/pascal.el:120: In pascal-progbeg-re: Escaped non-special character `p' (pos 2): "\\<\\program\\>"
emacs/lisp/progmodes/ruby-mode.el:105: In ruby-expression-expansion-re: Duplicated `\' inside character alternative (pos 34): "\\(?:[^\\]\\|\\=\\)\\(\\\\\\\\\\)*\\(#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\|\\$[^a-zA-Z \n]\\)\\)"
emacs/lisp/progmodes/ruby-mode.el:105: In ruby-expression-expansion-re: Duplicated `\' inside character alternative (pos 47): "\\(?:[^\\]\\|\\=\\)\\(\\\\\\\\\\)*\\(#\\({[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\|\\(\\$\\|@\\|@@\\)\\(\\w\\|_\\)+\\|\\$[^a-zA-Z \n]\\)\\)"
emacs/lisp/progmodes/ruby-mode.el:897: In call to looking-at: Character `_' included in range `A-z' (pos 18): "[a-zA-Z][a-zA-z0-9_]* +%[^ \t]"
emacs/lisp/progmodes/ruby-mode.el:897: In call to looking-at: Character `_' included in range `A-z' (pos 18): "[a-zA-Z][a-zA-z0-9_]* +/[^ \t]"
emacs/lisp/progmodes/ruby-mode.el:981: In call to looking-at: Unescaped literal `?' (pos 0): "?\\(\\\\C-\\|\\\\M-\\)*\\\\?."
emacs/lisp/progmodes/ruby-mode.el:1785: In call to replace-regexp-in-string: Duplicated `\' inside character alternative (pos 9): "\\(\\`\\|[^\\\\]\\)'"
emacs/lisp/progmodes/ruby-mode.el:1785: In call to replace-regexp-in-string: Duplicated `\' inside character alternative (pos 9): "\\(\\`\\|[^\\\\]\\)\""
emacs/lisp/progmodes/ruby-mode.el:2033: In ruby-font-lock-keywords: Duplicated `\' inside character alternative (pos 19): "\\$\\(?:[:\"!@;,/\\._><\\$?~=*&`'+0-9]\\|-[0adFiIlpvw]\\|\\(?:ARGV\\|C\\(?:HILD_STATUS\\|LASSPATH\\)\\|DE\\(?:BUG\\|FAULT_\\(?:\\(?:IN\\|OUT\\)PUT\\)\\)\\|E\\(?:NV_JAVA\\|RROR_\\(?:INFO\\|POSITION\\)\\)\\|F\\(?:I\\(?:ELD_SEPARATOR\\|LENAME\\)\\|S\\)\\|I\\(?:GNORECASE\\|NPUT_\\(?:\\(?:LINE_NUMBE\\|RECORD_SEPARATO\\)R\\)\\)\\|JRUBY_\\(?:\\(?:REVI\\|VER\\)SION\\)\\|L\\(?:AST_\\(?:MATCH_INFO\\|PAREN_MATCH\\|READ_LINE\\)\\|OAD\\(?:ED_FEATURES\\|_PATH\\)\\)\\|MATCH\\|NR\\|O\\(?:FS\\|RS\\|UTPUT_\\(?:\\(?:FIEL\\|RECOR\\)D_SEPARATOR\\)\\)\\|P\\(?:ID\\|OSTMATCH\\|R\\(?:EMATCH\\|O\\(?:CESS_ID\\|GRAM_NAME\\)\\)\\)\\|RS\\|SAFE\\|VERBOSE\\|std\\(?:err\\|in\\|out\\)\\)\\_>\\)"
emacs/lisp/progmodes/sql.el:3224: In call to string-match: Duplicated `\' inside character alternative (pos 11): "^\\(\\s-*\\)[\\\\][\\\\]FREE\\s-*$"
emacs/lisp/progmodes/sql.el:3224: In call to string-match: Duplicated `\' inside character alternative (pos 15): "^\\(\\s-*\\)[\\\\][\\\\]FREE\\s-*$"
emacs/lisp/progmodes/sql.el:3224: In call to string-match: Duplicated `\' inside character alternative (pos 11): "^\\(\\s-*\\)[\\\\][\\\\]NONFREE\\s-*$"
emacs/lisp/progmodes/sql.el:3224: In call to string-match: Duplicated `\' inside character alternative (pos 15): "^\\(\\s-*\\)[\\\\][\\\\]NONFREE\\s-*$"
emacs/lisp/progmodes/verilog-mode.el:2789: In verilog-coverpoint-re: Error: Unknown syntax code ‘*’: "\\w+\\s*:\\s*\\(coverpoint\\|cross\\constraint\\)"
emacs/lisp/progmodes/verilog-mode.el:6541: In call to looking-at: Escaped non-special character `/' (pos 0): "\\/\\*"
emacs/lisp/progmodes/verilog-mode.el:8936: In call to looking-at: Duplicated `\' inside character alternative (pos 21): "\\s-*[a-zA-Z0-9`_$({}\\\\][^,]*"
emacs/lisp/progmodes/verilog-mode.el:9315: In call to looking-at: Reversed range `|--' matches nothing (pos 29): "\\s-*\\.\\(\\([a-zA-Z0-9`_$+@^.*?|---]\\|[][]\\|\\\\[()|]\\)+\\)\\s-*(\\(.*\\))\\s-*\\(,\\|)\\s-*;\\)"
emacs/lisp/progmodes/vhdl-mode.el:2475: In call to string-match: Unescaped literal `$' (pos 6): "\\(.*\\)${?\\(\\(\\w\\|_\\)+\\)}?\\(.*\\)"
emacs/lisp/progmodes/vhdl-mode.el:15115: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/progmodes/vhdl-mode.el:15137: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/progmodes/vhdl-mode.el:15206: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/progmodes/vhdl-mode.el:15266: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/progmodes/vhdl-mode.el:15324: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/progmodes/vhdl-mode.el:15730: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/textmodes/dns-mode.el:116: In dns-mode-font-lock-keywords: Unescaped literal `$' (pos 1): "^$[a-z0-9A-Z]+"
emacs/lisp/textmodes/flyspell.el:907: In call to looking-at: Escaped non-special character `-' (pos 0): "\\-"
emacs/lisp/textmodes/flyspell.el:907: In call to looking-at: Escaped non-special character `-' (pos 0): "\\-"
emacs/lisp/textmodes/ispell.el:3398: In call to string-match: Duplicated `\' inside character alternative (pos 2): "[\\\\][]()[]\\|\\\\begin\\|\\$"
emacs/lisp/textmodes/reftex-cite.el:169: In call to re-search-forward: Escaped non-special character `e' (pos 11): "\\\\bibitem\\|\\end{thebibliography}"
emacs/lisp/textmodes/reftex-cite.el:442: In call to string-match: Duplicated `\' inside character alternative (pos 9): "[\\.a-zA-Z\\-]+\\.[ \t]*\\|,.*\\|[{}]+"
emacs/lisp/textmodes/reftex-ref.el:307: In call to string-match: Escaped non-special character `%' (pos 0): "\\%\\([a-zA-Z]\\)"
emacs/lisp/url/url-parse.el:111: In call to looking-at: Unescaped literal `?' (pos 0): "?"
emacs/lisp/url/url-util.el:496: In call to string-match: Unescaped literal `?' (pos 0): "?"
emacs/lisp/vc/diff-mode.el:974: In call to re-search-forward: Unescaped literal `+' (pos 1): "^+"
emacs/lisp/vc/vc-bzr.el:334: In vc-bzr-error-regexp-alist: Unescaped literal `+' (pos 11): "^\\( M[* ]\\|+N \\|-D \\|\\|  \\*\\|R[M ] \\) \\(.+\\)"
emacs/lisp/vc/vc-cvs.el:906: In call to looking-at: Unescaped literal `?' (pos 0): "? \\(.*\\)"
emacs/lisp/allout.el:5759: In call to string-match: Escaped non-special character `e' (pos 0): "\\end{verbatim}"
emacs/lisp/arc-mode.el:1536: In call to string-match: Duplicated `\' inside character alternative (pos 3): "[:\\\\/]"
emacs/lisp/arc-mode.el:2008: In call to re-search-forward: Repetition of repetition (pos 9): "^\\( +=+ ?+\\)+\n"
emacs/lisp/comint.el:3086: In call to string-match: Duplicated `\' inside character alternative (pos 6): "%\\([^\\\\/]*\\)%"
emacs/lisp/dired.el:328: In dired-re-inode-size: Duplicated ` ' inside character alternative (pos 5): "[0-9  \t]*[.,0-9]*[BkKMGTPEZY]?[ \t]*"
emacs/lisp/epg.el:1145: In call to string-match: Reversed range `a-F' matches nothing (pos 43): "\\`\\([DCS]\\) \\([0-9]+\\) \\([0-9]+\\) \\([0-9A-Fa-F][0-9A-Fa-F]\\) \\(.*\\) "
emacs/lisp/epg.el:1145: In call to string-match: Reversed range `a-F' matches nothing (pos 54): "\\`\\([DCS]\\) \\([0-9]+\\) \\([0-9]+\\) \\([0-9A-Fa-F][0-9A-Fa-F]\\) \\(.*\\) "
emacs/lisp/find-dired.el:129: In call to string-match: Unescaped literal `+' (pos 19): "\\`\\(.*\\) {} \\(\\\\;\\|+\\)\\'"
emacs/lisp/frame.el:1061: In call to string-match: Escaped non-special character `r' (pos 10): "^\\(xterm\\|\\rxvt\\|dtterm\\|eterm\\)"
emacs/lisp/generic-x.el:291: In define-generic-mode apache-log-generic-mode: Ranges `A-z' and `a-z' overlap (pos 8): "^\\([-a-zA-z0-9.]+\\) - [-A-Za-z]+ \\(\\[.*\\]\\)"
emacs/lisp/ibuffer.el:152: In call to string-match: Unescaped literal `*' (pos 1): "^*"
emacs/lisp/ido.el:3779: In call to string-match: Unescaped literal `$' (pos 0): "$\\'"
emacs/lisp/ido.el:3779: In call to string-match: Unescaped literal `$' (pos 0): "$\\'"
emacs/lisp/info-xref.el:71: In call to string-match: Escaped non-special character `/' (pos 6): "\\(\\`\\|\\/\\)\\.#"
emacs/lisp/info.el:1483: In call to re-search-forward: Unescaped literal `*' (pos 1): "^* \\([^:\n]+:\\(:\\|[^.\n]+\\).\\)"
emacs/lisp/info.el:1601: In call to string-match: Duplicated `\' inside character alternative (pos 14): "[^\\\"]*\\(\\\\\\)[\\\\\"]"
emacs/lisp/info.el:1613: In call to string-match: Duplicated `\' inside character alternative (pos 54): "\\s *\\([^=]+\\)=\\(?:\\([^\\s \"]+\\)\\|\\(?:\"\\(\\(?:[^\\\"]\\|\\\\[\\\\\"]\\)*\\)\"\\)\\)"
emacs/lisp/info.el:5202: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/isearch.el:2828: In call to string-match-p: Unescaped literal `^' (pos 1): "^^"
emacs/lisp/minibuffer.el:2310: In completion--embedded-envvar-re: Unescaped literal `$' (pos 24): "\\(?:^\\|[^$]\\(?:\\$\\$\\)*\\)$\\([[:alnum:]_]*\\|{\\([^}]*\\)\\)\\'"
emacs/lisp/speedbar.el:3351: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/speedbar.el:3400: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/speedbar.el:3442: In call to string-match: Unescaped literal `+' (pos 0): "+"
emacs/lisp/woman.el:2617: In call to looking-at: Error: Invalid \{\} syntax: "[ \t]*\\{"
emacs/lisp/woman.el:2631: In call to looking-at: Error: Invalid \{\} syntax: "[ \t]*\\{"
emacs/lisp/woman.el:3258: In call to re-search-forward: Escaped non-special character `f' (pos 14): "^[.'][ \t]*\\(\\(\\ft\\)\\|\\(.P\\)\\)\\|\\(\\\\f\\)"
emacs/lisp/xdg.el:117: In call to string-match: Unescaped literal `$' (pos 1): "^$HOME/"
emacs/test/lisp/emacs-lisp/edebug-resources/edebug-test-code.el:115: (invalid-read-syntax "#")
emacs/test/lisp/emacs-lisp/cl-print-tests.el:219: (invalid-read-syntax "#")
emacs/test/lisp/emacs-lisp/seq-tests.el:414: (invalid-read-syntax "#")
emacs/test/src/json-tests.el:54: (invalid-read-syntax "#")
Finished.

[-- Attachment #3: trawl.el --]
[-- Type: application/octet-stream, Size: 9870 bytes --]

;;; -*- lexical-binding: t -*-

;; Scan elisp code for regexp errors.
;; License: GPL

(require 'xr)

(defconst trawl--error-buffer-name "*trawl-catch*")

(defun trawl--error-buffer ()
  (let ((buf (get-buffer trawl--error-buffer-name)))
    (or buf
        (let ((buf (get-buffer-create trawl--error-buffer-name)))
          (with-current-buffer buf
            (compilation-mode))
          buf))))

(defvar trawl--error-count)

(defun trawl--add-to-error-buffer (string)
  (with-current-buffer (trawl--error-buffer)
    (goto-char (point-max))
    (let ((inhibit-read-only t))
      (insert string))))

(defun trawl--report (file pos message)
  (let ((line
         (save-excursion
           (goto-char pos)
           (when (looking-at (rx (1+ (or blank "\n" "\f"
                                         (seq ";" (0+ nonl))))))
             (goto-char (match-end 0)))
           (line-number-at-pos (point) t))))
    (trawl--add-to-error-buffer
     (format "%s:%d: %s\n" file line message)))
  (setq trawl--error-count (1+ trawl--error-count)))

(defun trawl--quote-string (str)
  (concat "\""
          (replace-regexp-in-string
           (rx (any cntrl "\177-\377" ?\\ ?\"))
           (lambda (s)
             (let ((c (logand (string-to-char s) #xff)))
               (or (cdr (assq c
                              '((?\" . "\\\"")
                                (?\\ . "\\\\")
                                (?\b . "\\b")
                                (?\t . "\\t")
                                (?\n . "\\n")
                                (?\v . "\\v")
                                (?\f . "\\f")
                                (?\r . "\\r")
                                (?\e . "\\e"))))
                   (format "\\%03o" c))))
           str t t)
          "\""))

(defun trawl--check-re-string (re name file pos)
  (let ((complaints
         (condition-case err
	     (mapcar (lambda (warning)
                       (format "In %s: %s (pos %d): %s"
                               name (cdr warning) (car warning)
			       (trawl--quote-string re)))
		     (xr-lint re))
	   (error (list (format "In %s: Error: %s: %s"
				name  (cadr err)
                                (trawl--quote-string re)))))))
    (mapc (lambda (msg) (trawl--report file pos msg))
          complaints)))
  
(defun trawl--remove-comma (form)
  (cond
   ((not (consp form)) form)
   ((eq (car form) '\,) (trawl--remove-comma (cadr form)))
   (t
    (cons (trawl--remove-comma (car form))
          (trawl--remove-comma (cdr form))))))

;; Return a value peeled of irrelevancies.
(defun trawl--peel (form)
  (cond
   ((not (consp form)) form)
   ((eq (car form) 'list)
    (trawl--peel (cdr form)))
   ((memq (car form) '(quote purecopy))
    (trawl--peel (cadr form)))
   ((eq (car form) 'eval-when-compile)
    (trawl--peel (car (last form))))
   ((eq (car form) '\`)
    (trawl--peel (trawl--remove-comma (cadr form))))
   (t form)))

;; A list peeled of irrelevancies, or nil.
(defun trawl--peel-list (form)
  (let ((peeled (trawl--peel form)))
    (and (consp peeled) peeled)))

;; Convert something to a list of strings, or nil.
(defun trawl--get-string-list (form)
  (let ((parts (mapcar #'trawl--get-string (trawl--peel-list form))))
    (if (memq nil parts)
        nil
      parts)))

;; Convert something to a string, or nil.
(defun trawl--get-string (form)
  (setq form (trawl--peel form))
  (cond
   ((stringp form) form)
   ((not (consp form)) nil)
   ((eq (car form) 'concat)
    (let ((parts (trawl--get-string-list (cdr form))))
      (and parts (apply #'concat parts))))
   ((eq (car form) 'regexp-opt)
    (let ((arg (trawl--get-string-list (cadr form))))
      (and arg (regexp-opt arg))))
   ((eq (car form) 'regexp-quote)
    (let ((arg (trawl--get-string (cadr form))))
      (and arg (regexp-quote arg))))))

(defun trawl--check-re (form name file pos)
  (let ((re (trawl--get-string form)))
    (when re
      (trawl--check-re-string re name file pos))))

(defun trawl--check-list (form name file pos)
  (mapc (lambda (elem) (trawl--check-re-string elem name file pos))
        (trawl--get-string-list form)))

(defun trawl--check-list-car (form name file pos)
  (mapc (lambda (elem)
          (when (consp elem)
            (trawl--check-re (car elem) name file pos)))
        form))

(defun trawl--check-font-lock-keywords (form name file pos)
  (mapc (lambda (elem)
          (let* ((thing (trawl--peel elem))
                 (str (trawl--get-string thing)))
            (cond (str
                   (trawl--check-re-string str name file pos))
                  ((consp thing)
                   (trawl--check-re (car thing) name file pos)))))
        (trawl--peel-list form)))

(defun trawl--check-form-recursively (form file pos)
  (when (consp form)
    (pcase form
;      (`(apply ,(or `nconc `(quote nconc) `(function nconc)) (mapcar . ,_))
;       (trawl--report file pos
;                     "use mapcan instead of (apply nconc (mapcar...))"))
;      (`(lambda (,var1) (,_ ,var2))
;       (when (eq var1 var2)
;        (trawl--report file pos
;                       "lambda expression can be η-reduced")))
;      (`(lambda (,var1) ,var2)
;       (when (eq var1 var2)
;	 (trawl--report file pos
;			"lambda expression is #'identity")))
;      (`(defun ,name ,_ . ,body)
;       (let ((f body))
;         (while (and f (consp (car f)) (eq (caar f) 'declare))
;           (setq f (cdr f)))
;         (when (and f (consp (car f)))
;           (setq f (cdr f))
;           (while (cdr f)
;             (when (stringp (car f))
;               (trawl--report file pos
;			      (format "defun %s: misplaced doc string" name)))
;             (setq f (cdr f))))))
      (`(,(or `looking-at `re-search-forward `re-search-backward
              `string-match `string-match-p `looking-back `looking-at-p
              `replace-regexp-in-string 'replace-regexp
              `query-replace-regexp
              `posix-looking-at `posix-search-backward `posix-search-forward
              `posix-string-match)
         ,re-arg . ,_)
       (trawl--check-re re-arg (format "call to %s" (car form)) file pos))
      (`(,(or `defvar `defconst 'defcustom)
	 ,name ,re-arg . ,rest)
       (when (symbolp name)
         (cond
          ((string-match-p (rx (or "-regexp" "-re" "-regex" "-pattern") eos)
			   (symbol-name name))
	   (trawl--check-re re-arg name file pos))
          ((string-match-p (rx (or "-regexps" "-regexes" "-patterns") eos)
			   (symbol-name name))
           (trawl--check-list re-arg name file pos))
          ((string-match-p (rx "-font-lock-keywords" eos)
                           (symbol-name name))
           (trawl--check-font-lock-keywords re-arg name file pos))
          ;; special case
          ((eq name 'compilation-error-regexp-alist-alist)
           (mapc
            (lambda (elem)
	      (trawl--check-re (cadr elem)
                               (format "%s (%s)" name (car elem)) file pos))
            (trawl--peel-list re-arg)))
          ((string-match-p (rx (or "-regexp" "-re" "-regex" "-pattern")
                               "-alist" eos)
                           (symbol-name name))
           (trawl--check-list-car (trawl--peel-list re-arg) name file pos))
          ;; Doc string starting with "regexp"?
          ((and (stringp (car rest))
                (let ((case-fold-search t))
                  (string-match-p (rx bos "regexp") (car rest))))
	   (trawl--check-re re-arg name file pos))
          )))
      (`(define-generic-mode ,name ,_ ,_ ,font-lock-list ,auto-mode-list . ,_)
       (let ((origin (format "define-generic-mode %s" name)))
         (trawl--check-font-lock-keywords font-lock-list origin file pos)
         (trawl--check-list auto-mode-list origin file pos)))
      )
    (while (consp form)
      (trawl--check-form-recursively (car form) file pos)
      (setq form (cdr form)))))

(defun trawl--check-toplevel-form (form file pos)
  (trawl--check-form-recursively form file pos))
                      
(defun trawl--show-errors ()
  (let ((pop-up-windows t))
    (display-buffer (trawl--error-buffer))
    (sit-for 0)))

(defun trawl--single-file (file)
  (let ((errors-before trawl--error-count))
    (with-temp-buffer
      (insert-file-contents file)
      (goto-char (point-min))
      (let ((pos nil)
            (read-circle nil))
        (condition-case err
            (while t
              (setq pos (point))
              (let ((form (read (current-buffer))))
                (trawl--check-toplevel-form form file pos)))
          (end-of-file nil)
          (error (trawl--report file pos (prin1-to-string err))))))
    (when (> trawl--error-count errors-before)
      (trawl--show-errors))))
        
(defun trawl--init (file-or-dir dir)
  (with-current-buffer (trawl--error-buffer)
    (let ((inhibit-read-only t))
      (erase-buffer)
      (insert (format ";; Trawling %s  -*- compilation -*-\n" file-or-dir)))
    (setq trawl--error-count 0)
    (cd dir)))

(defun trawl--finish ()
  (trawl--add-to-error-buffer "Finished.\n")
  (let ((errors trawl--error-count))
    (message "trawl: %d error%s found." errors (if (= errors 1) "" "s"))))

(defun trawl-file (file)
  (interactive "fTrawl elisp file: ")
  (trawl--init file (file-name-directory file))
  (trawl--single-file file)
  (trawl--finish))
        
(defun trawl-directory (dir)
  (interactive "DTrawl directory: ")
  (trawl--init dir dir)
  (dolist (file (directory-files-recursively
                 dir (rx bos (not (any ".")) (* anything) ".el" eos)))
    (trawl--single-file file))
  (trawl--finish))

^ permalink raw reply	[flat|nested] 16+ messages in thread
[parent not found: <20190305112504.D97DD1EC@emma.svaha.wsnyder.org>]

end of thread, other threads:[~2019-03-11 14:20 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-03 18:01 Scan of regexp mistakes Mattias Engdegård
2019-03-05  2:04 ` Paul Eggert
2019-03-05  4:30   ` Clément Pit-Claudel
2019-03-05 15:06   ` Mattias Engdegård
2019-03-08  6:02     ` Stefan Monnier
2019-03-08 17:13     ` Paul Eggert
     [not found]       ` <1c44342f-01ab-1bc6-4b5c-3485a6f01fda@lanl.gov>
     [not found]         ` <61035fed-564a-8766-8982-0d05acea341c@cs.ucla.edu>
2019-03-08 20:46           ` bug#34789: " Davis Herring
2019-03-11 14:20             ` Eli Zaretskii
2019-03-09 12:36       ` Mattias Engdegård
2019-03-09 17:14         ` Paul Eggert
2019-03-09 13:09       ` Mattias Engdegård
2019-03-09 17:12         ` Paul Eggert
2019-03-09 20:16           ` Mattias Engdegård
     [not found] <20190305112504.D97DD1EC@emma.svaha.wsnyder.org>
2019-03-05 15:35 ` Wilson Snyder
2019-03-05 16:12   ` Mattias Engdegård
2019-03-07 17:39   ` Paul Eggert

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.