[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/el-search 3370594 060/332: el-search: New pattern type
From: |
Stefan Monnier |
Subject: |
[elpa] externals/el-search 3370594 060/332: el-search: New pattern type `l' |
Date: |
Tue, 1 Dec 2020 15:48:11 -0500 (EST) |
branch: externals/el-search
commit 3370594095b057a8608f9186c4bdbfa0f38f318e
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>
el-search: New pattern type `l'
---
el-search.el | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git a/el-search.el b/el-search.el
index 22a20a4..4157887 100644
--- a/el-search.el
+++ b/el-search.el
@@ -659,6 +659,59 @@ matches any of these expressions:
"argument not a string or vector")
`(pred (el-search--match-key-sequence ,key-sequence)))
+(defun el-search--s (expr)
+ (cond
+ ((symbolp expr) `(symbol ,(symbol-name expr)))
+ ((stringp expr) `(string ,expr))
+ (t expr)))
+
+(el-search-defpattern l (&rest lpats)
+ "Alternative pattern type for matching lists.
+Match any list with subsequent elements matched by all LPATS in
+order.
+
+The idea is to be able to search for pieces of code (i.e. lists)
+with very brief input by using a specialized syntax.
+
+An LPAT can take the following forms:
+
+SYMBOL Matches any symbol matched by SYMBOL's name interpreted as
+ a regexp
+STRING Matches any string matched by STRING interpreted as a
+ regexp
+_ Matches any list element
+__ Matches any number of list elements (including zero)
+^ Matches zero elements, but only at the beginning of a list
+$ Matches zero elements, but only at the end of a list
+PAT Anything else is interpreted as a normal pcase pattern, and
+ matches one list element matched by it
+
+^ is only valid as the first, $ as the last of the LPATS.
+
+Example: To match defuns that contain \"hl\" in their name and
+have at least one mandatory, but also optional arguments, you
+could use this pattern:
+
+ (l ^ 'defun hl (l _ &optional))"
+ (let ((match-start nil) (match-end nil))
+ (when (eq (car-safe lpats) '^)
+ (setq match-start t)
+ (cl-callf cdr lpats))
+ (when (eq (car-safe (last lpats)) '$)
+ (setq match-end t)
+ (cl-callf butlast lpats 1))
+ `(append ,@(if match-start '() '(_))
+ ,@(mapcar
+ (lambda (elt)
+ (pcase elt
+ ('__ '_)
+ ('_ '`(,_))
+ ('_? '(or '() `(,_))) ;FIXME: useful - document? or should
we provide a (? PAT)
+ ;thing?
+ (_ `(,'\` ((,'\, ,(el-search--s elt)))))))
+ lpats)
+ ,@(if match-end '() '(_)))))
+
;;;; Highlighting
- [elpa] externals/el-search daa7f92 039/332: improve docs; new: el-search-defpattern; add some pattern types, (continued)
- [elpa] externals/el-search daa7f92 039/332: improve docs; new: el-search-defpattern; add some pattern types, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e14236a 038/332: fix whitespace, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 00d6af1 040/332: remove search wrapping functionality, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 3b5cce3 043/332: fix compiler errors and warnings, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 06af085 044/332: edit TODO list, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search ec0c3e8 053/332: el-search: new pattern type `not', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 0809f99 072/332: New user option: el-search-use-sloppy-strings, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search ba82854 022/332: rename a local variable, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 1222012 046/332: prerequisites to allow replace with multiple expressions, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 0af261a 050/332: el-search: some cleanup, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 3370594 060/332: el-search: New pattern type `l',
Stefan Monnier <=
- [elpa] externals/el-search b936a28 062/332: Go to isearch left end when starting replace, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 59c6139 064/332: Complete and document what a SYMBOL in `l' matches, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 2c1cdeb 066/332: factor out minibuffer setup hook fun; treat empty input, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 02168e0 068/332: Tweak docstring of el-search--ensure-sexp-start, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search d6ae854 070/332: Minor change in `string' pattern, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search a0b44dd 078/332: Improve documentation and argument names of el-search-query-replace, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 1864f4a 077/332: Comment and whitespace changes only, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search b5b6d83 089/332: Make query-replace accept FROM -> TO style input, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 68f10d7 091/332: Reduce duration of a `sit-for', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 29d6f46 090/332: Rename a local variable, Stefan Monnier, 2020/12/01