;;; -*- 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))