]> code.delx.au - dotemacs/blobdiff - lisp/my-editing-defuns.el
major config refactor
[dotemacs] / lisp / my-editing-defuns.el
diff --git a/lisp/my-editing-defuns.el b/lisp/my-editing-defuns.el
new file mode 100644 (file)
index 0000000..1799fde
--- /dev/null
@@ -0,0 +1,68 @@
+;;; -*- lexical-binding: t -*-
+
+(defun my/comment-dwim (arg)
+  "Toggles the comment on for the active region if present or the current line otherwise."
+  (interactive "*p")
+  (cond
+   ((and mark-active transient-mark-mode)
+    (let ((start (save-excursion (goto-char (region-beginning)) (line-beginning-position)))
+          (end (save-excursion (goto-char (region-end)) (line-end-position))))
+      (comment-or-uncomment-region start end)))
+   (t
+    (comment-or-uncomment-region (line-beginning-position) (line-end-position arg))
+    (forward-line arg))))
+
+(defun my/copy-line (arg)
+  "Copy the current line into the kill ring. With ARG copies that many lines."
+  (interactive "*p")
+  (kill-ring-save (line-beginning-position 1)
+                  (line-beginning-position (+ 1 arg)))
+  (message "Copied %d lines" arg))
+
+(defun my/duplicate-line (arg)
+  "Duplicate current line, leaving point in lower line. With ARG duplicates the line that many lines."
+  (interactive "*p")
+  (kill-ring-save (line-beginning-position 1)
+                  (line-beginning-position 2))
+  (forward-line)
+  (dotimes (ignored arg)
+    (yank))
+  (forward-line (- arg))
+  (back-to-indentation))
+
+(defun my/open-line-above (arg)
+  "Open a new line above point with indentation. With ARG insert that many lines."
+  (interactive "*p")
+  (beginning-of-line)
+  (newline arg)
+  (forward-line (- arg))
+  (indent-for-tab-command))
+
+(defun my/open-line-below (arg)
+  "Open a new line below point with indentation. With ARG insert that many lines."
+  (interactive "*p")
+  (end-of-line)
+  (newline arg)
+  (indent-for-tab-command))
+
+(defun my/substitute-line (arg)
+  "Kill the current line and leave point at correct indentation level. With ARG kill that many lines first."
+  (interactive "*P")
+  (beginning-of-line)
+  (if (not (and (null arg) (equal (line-beginning-position) (line-end-position))))
+      (kill-line arg))
+  (if (not (string-equal major-mode "fundamental-mode"))
+      (indent-for-tab-command)))
+
+(defun my/yank (arg)
+  "If the text to be yanked has a newline then move to beginning of line before yanking. Otherwise same as normal `yank'."
+  (interactive "*P")
+  (advice-add 'insert-for-yank :around #'my/yank/advice)
+  (unwind-protect
+      (yank arg)
+    (advice-remove 'insert-for-yank #'my/yank/advice)))
+
+(defun my/yank/advice (original-function string)
+  (if (string-match-p "\n" string)
+      (beginning-of-line))
+  (funcall original-function string))