branch: externals/objed
commit 7e25c5029695a03539525fc7daff4a6cca5e24f0
Author: Clemens Radermacher <[email protected]>
Commit: Clemens Radermacher <[email protected]>
Add forward slurp/barf sexp commands
---
objed-objects.el | 15 +++++++++++++++
objed.el | 34 +++++++++++++++++++++++++++++++++-
2 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/objed-objects.el b/objed-objects.el
index dfd5090..51e89c3 100644
--- a/objed-objects.el
+++ b/objed-objects.el
@@ -1007,6 +1007,21 @@ current object position data."
(setq objed--current-obj range))))
+(defun objed--markify-current-object ()
+ "Convert current object into marker object."
+ (unless (markerp (objed--beg))
+ (objed--update-current-object
+ (objed-make-object
+ :ibeg (set-marker (make-marker)
+ (objed--ibeg))
+ :beg (set-marker (make-marker)
+ (objed--obeg))
+ :iend (set-marker (make-marker)
+ (objed--iend))
+ :end (set-marker (make-marker)
+ (objed--oend))))))
+
+
(defun objed--switch-to (o &optional state odata)
"Switch to object O.
diff --git a/objed.el b/objed.el
index 0d918dd..a620617 100644
--- a/objed.el
+++ b/objed.el
@@ -731,7 +731,6 @@ selected one."
(define-key map (kbd "<end>") 'objed-bottom-object)
(define-key map "<" 'objed-top-object)
(define-key map ">" 'objed-bottom-object)
-
;; block expansions
(define-key map "h" 'objed-expand-block)
(define-key map "a" 'objed-beg-of-block)
@@ -822,7 +821,11 @@ selected one."
(objed-define-op nil objed-duplicate-down))
(define-key map (kbd "<C-M-return>")
'objed-insert-new-object)
+ ;; sp functionality
(define-key map "^" 'objed-raise)
+ (define-key map (kbd "<C-left>") 'objed-forward-barf-sexp)
+ (define-key map (kbd "<C-right>") 'objed-forward-slurp-sexp)
+
(define-key map "!" 'objed-execute)
map)
@@ -3492,6 +3495,35 @@ If nil ‘eval-region’ is used instead.")
:end (save-excursion (insert istring)
(point))))))
+(defun objed-forward-slurp-sexp ()
+ "Slurp following sexp into current object."
+ (interactive)
+ (objed--markify-current-object)
+ (let ((iend (objed--iend))
+ (oend (objed--oend)))
+ (goto-char oend)
+ (let ((sexp (delete-and-extract-region
+ (point)
+ (scan-sexps (point) 1))))
+ (goto-char iend)
+ (insert sexp)
+ (set-marker iend (point))
+ (goto-char oend))))
+
+(defun objed-forward-barf-sexp ()
+ "Barf last sexp out of current object."
+ (interactive)
+ (objed--markify-current-object)
+ (let ((iend (objed--iend))
+ (oend (objed--oend)))
+ (goto-char iend)
+ (let ((sexp (delete-and-extract-region
+ (point)
+ (scan-sexps (point) -1))))
+ (goto-char oend)
+ (save-excursion
+ (insert sexp)))))
+
(defun objed-execute ()
"Execute object contents as shell commands."