* init.el(b/duplicate-line-or-region): New convenience function.
authorAmin Bandali <bandali@gnu.org>
Tue, 21 Apr 2020 04:53:18 +0000 (00:53 -0400)
committerAmin Bandali <bandali@gnu.org>
Tue, 21 Apr 2020 04:53:18 +0000 (00:53 -0400)
init.el

diff --git a/init.el b/init.el
index 824aa93..5d4b8b5 100644 (file)
--- a/init.el
+++ b/init.el
@@ -255,6 +255,30 @@ For disabling the behaviour for certain buffers and/or modes."
   (interactive)
   (join-line 1))
 
+(defun b/duplicate-line-or-region (&optional n)
+  "Duplicate the current line, or region (if active).
+Make N (default: 1) copies of the current line or region."
+  (interactive "*p")
+  (let ((u-r-p (use-region-p))          ; if region is active
+        (n1 (or n 1)))
+    (save-excursion
+      (let ((text
+             (if u-r-p
+                 (buffer-substring (region-beginning) (region-end))
+               (prog1 (thing-at-point 'line)
+                 (end-of-line)
+                 (if (eobp)
+                     (newline)
+                   (forward-line 1))))))
+        (dotimes (_ (abs n1))
+          (insert text))))
+    (let* ((beg (if u-r-p
+                    (region-beginning)
+                  (line-beginning-position)))
+           (end (if u-r-p
+                    (region-end)
+                  (line-end-position)))))))
+
 \f
 ;;; Defaults
 
@@ -508,6 +532,7 @@ For disabling the behaviour for certain buffers and/or modes."
 (bind-keys
  ("C-a"     . b/move-indentation-or-beginning-of-line)
  ("C-c a i" . ielm)
+ ("C-c d"   . b/duplicate-line-or-region)
 
  ("C-c e b" . eval-buffer)
  ("C-c e e" . eval-last-sexp)