[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/objed ceeff84 057/166: Allow defining objects by regex
From: |
Clemens Radermacher |
Subject: |
[elpa] externals/objed ceeff84 057/166: Allow defining objects by regex |
Date: |
Sun, 29 Dec 2019 08:21:00 -0500 (EST) |
branch: externals/objed
commit ceeff84ca38431433b9b28d6c195758fb3eeef1f
Author: Clemens Radermacher <address@hidden>
Commit: Clemens Radermacher <address@hidden>
Allow defining objects by regex
---
objed-objects.el | 144 ++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 101 insertions(+), 43 deletions(-)
diff --git a/objed-objects.el b/objed-objects.el
index 9ca6a7b..dfd5090 100644
--- a/objed-objects.el
+++ b/objed-objects.el
@@ -68,38 +68,91 @@
(eval-and-compile
+ (defun objed--get-regex-object (bregex eregex)
+ "Return regex object if point is within region limited by BREGEX, EREGEX."
+ (let* ((obounds ())
+ (ibounds ())
+ (opos (point)))
+ (save-mark-and-excursion
+ (when (and (re-search-forward eregex nil t) ; possibly exit start
+ (goto-char (or (match-beginning 1)
+ (match-beginning 0)))
+ ;; goto possible start
+ (re-search-backward bregex nil t)
+ (push (or (match-end 1)
+ (match-end 0))
+ ibounds)
+ (push (or (match-beginning 1)
+ (match-beginning 0))
+ obounds)
+ ;; goto possible end
+ (goto-char (or (match-end 1)
+ (match-end 0)))
+ (re-search-forward eregex nil t)
+ (push (or (match-beginning 1)
+ (match-beginning 0))
+ ibounds)
+ (push (or (match-end 1)
+ (match-end 0))
+ obounds)
+ ;; when point was within start and end
+ (<= (cadr obounds) opos (car obounds)))
+ (list (nreverse obounds)
+ (nreverse ibounds))))))
+
(defun objed--transform-pos-data (plist)
- (let ((np nil)
- (alt nil)
- (make nil)
- (skip nil))
- (unless (and (plist-get plist :beg)
- (plist-get plist :end))
- (user-error "Malformed macro"))
- (dolist (item plist)
- (if (memq item '(:beg :ibeg :end :iend))
- (progn (push item alt)
- (setq skip t))
- (if (and skip
- (not (keywordp item)))
- (push item alt)
- (push item np)
- (setq skip nil))))
-
- (setq np (nreverse np))
- (setq alt (nreverse alt))
- (dolist (el alt)
- (when (keywordp el)
- (progn
- (push el make)
- (push (plist-get alt el) make))))
- (setq make (nreverse make))
- (push 'objed-make-object make)
- (append np (list :get-obj)
- ;; TODO:save-mark-and-excursion still needed?
- ;; is wrapped already?
- (list (append (list 'save-mark-and-excursion)
- (list make))))))
+ (cond ((and (plist-get plist :beg)
+ (plist-get plist :end))
+ (let ((np nil)
+ (alt nil)
+ (skip nil))
+ ;; filter :beg :end keywords
+ (dolist (item plist)
+ (if (memq item '(:beg :ibeg :end :iend))
+ (progn (push item alt)
+ (setq skip t))
+ (if (and skip
+ (not (keywordp item)))
+ (push item alt)
+ (push item np)
+ (setq skip nil))))
+ ;; new and alternate plists
+ (setq np (nreverse np))
+ (setq alt (nreverse alt))
+
+ ;; merge ... :get-obj "regex search"
+ (if (and (stringp (plist-get plist :beg))
+ (stringp (plist-get plist :end)))
+ (let ((bregex (plist-get plist :beg))
+ (eregex (plist-get plist :end)))
+ (append np
+ (list :try-prev)
+ (list `(when (re-search-backward ,eregex)
+ (goto-char (match-beginning 0))))
+ (list :try-next)
+ (list `(when (re-search-forward ,bregex)
+ (goto-char (match-end 0))))
+ (list :get-obj)
+ (list
+ `(objed--get-regex-object ,bregex
+ ,eregex))))
+ ;; merge ... :get-obj (objed-make-object :beg ... :end...)
+ (let ((make nil))
+ (dolist (el alt)
+ (when (keywordp el)
+ (progn
+ (push el make)
+ (push (plist-get alt el) make))))
+ (setq make (nreverse make))
+ (push 'objed-make-object make)
+ (append np
+ (list :get-obj)
+ ;; TODO:save-mark-and-excursion still needed?
+ ;; is wrapped already?
+ (list (append (list 'save-mark-and-excursion)
+ (list make))))))))
+ (t
+ (user-error "Malformed macro"))))
(defun objed--get-arg-plist (keylst valid &optional wrapped)
"Wraps any forms of keys in keylst in `progn' and returns property list.
@@ -118,18 +171,23 @@ property list where each key has an associated progn."
(push (pop keylst) forms))
(push keyw wrapped)
;; allowed to move point
- (if (memq vkeyw '(:try-next :try-prev :ref))
- (push `(let ((objed--block-p t)) ,@(nreverse forms))
- wrapped)
- (if (memq vkeyw '(:beg :end :ibeg :iend))
- (push `(let ((objed--block-p t))
- ,@(nreverse forms))
- wrapped)
- ;; objed--block-p: dont run objeds advices here...
- (push `(let ((objed--block-p t))
- (save-mark-and-excursion
- ,@(nreverse forms)))
- wrapped)))
+ (cond ((memq vkeyw '(:try-next :try-prev :ref))
+ (push `(let ((objed--block-p t)) ,@(nreverse forms))
+ wrapped))
+ ((memq vkeyw '(:beg :end :ibeg :iend))
+ (if (and (not (cdr forms))
+ (stringp (car forms)))
+ (push (car forms) wrapped)
+ (push `(let ((objed--block-p t))
+ ,@(nreverse forms))
+ wrapped)))
+ (t
+ ;; objed--block-p: dont run objeds advices here...
+ (push `(let ((objed--block-p t))
+ (save-mark-and-excursion
+ ,@(nreverse forms)))
+ wrapped)))
+
(objed--get-arg-plist keylst valid wrapped))
(keylst
(error "Malformed Object. Keyword %s not recognized" keyw))
- [elpa] externals/objed 74204af 037/166: Add ability to jump to objects inside current one, (continued)
- [elpa] externals/objed 74204af 037/166: Add ability to jump to objects inside current one, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 87cdeee 039/166: Improve toggle state, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 6ae9bff 042/166: When repeating backward/forward until proceed to object boundary, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 1b50645 048/166: Update docstring, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed db01e08 046/166: Undo last commit, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 25714dc 060/166: Don't try to be smart with electric wrap, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 06f4abc 043/166: Improve repeat behavior for backward/forward until context, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 2a634b8 054/166: Make append mode global, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 828037d 045/166: Improve init/reset checks, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 7d51f03 058/166: Merge branch 'master' of github.com:clemera/objed, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed ceeff84 057/166: Allow defining objects by regex,
Clemens Radermacher <=
- [elpa] externals/objed 72592a9 062/166: Change bindings for barf/slurp sexps, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed c086dce 069/166: Make [/] context independent by default, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed a7b8c48 070/166: Update docs, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 890b8b7 044/166: Add init function for hooks, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 963841d 025/166: Improve continuation object, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 09cca2c 028/166: Allow numeric prefix arg for kill/delete op, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 6f06795 034/166: Add commands which move to prev/next object, ignoring context, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 73b99ed 036/166: Improve objed-ace, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed 7930c68 038/166: Make word movement aware of object state, Clemens Radermacher, 2019/12/29
- [elpa] externals/objed bea49a2 051/166: Fix word object at eob, too., Clemens Radermacher, 2019/12/29