From f9c4bb6bd7da4f551ebe84978d0ef50c8ebc15f9 Mon Sep 17 00:00:00 2001 From: derped Date: Mon, 1 Jun 2020 02:28:36 +0200 Subject: [PATCH] emacs: stop polluting my kill-ring (still needs some adjustments) --- pkgsets/emacs.nix | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/pkgsets/emacs.nix b/pkgsets/emacs.nix index 2e86b6d..a7a21a8 100644 --- a/pkgsets/emacs.nix +++ b/pkgsets/emacs.nix @@ -100,6 +100,65 @@ in rec { ;; Fix keyboard input of 'dead-keys' (require 'iso-transl) + + + + ;; Some small helper functions + ;; These are based on the already existing 'kill' versions of the function + ;; It's literally just a M-x r-str kill delete (and getting rid of tabs) + (defun delete-word (arg) + "Delete characters forward until encountering the end of a word. + With argument ARG, do this that many times." + (interactive "p") + (delete-region (point) (progn (forward-word arg) (point)))) + (define-key global-map [remap kill-word] 'delete-word) + ;; (define-key global-map (kbd <>) 'kill-word) + + (defun backward-delete-word (arg) + "Delete characters backward until encountering the beginning of a word. + With argument ARG, do this that many times." + (interactive "p") + (delete-word (- arg))) + (define-key global-map [remap backward-kill-word] 'backward-delete-word) + + (defun delete-whole-line (&optional arg) + "Delete current line. + With prefix ARG, delete that many lines starting from the current line. + If ARG is negative, delete backward. Also delete the preceding newline. + \(This is meant to make \\[repeat] work well with negative arguments.) + If ARG is zero, delete current line but exclude the trailing newline." + (interactive "p") + (or arg (setq arg 1)) + (if (and (> arg 0) (eobp) (save-excursion (forward-visible-line 0) (eobp))) + (signal 'end-of-buffer nil)) + (if (and (< arg 0) (bobp) (save-excursion (end-of-visible-line) (bobp))) + (signal 'beginning-of-buffer nil)) + (unless (eq last-command 'delete-region) + (delete-new "") + (setq last-command 'delete-region)) + (cond ((zerop arg) + ;; We need to delete in two steps, because the previous command + ;; could have been a delete command, in which case the text + ;; before point needs to be prepended to the current delete + ;; ring entry and the text after point appended. Also, we + ;; need to use save-excursion to avoid copying the same text + ;; twice to the delete ring in read-only buffers. + (save-excursion + (delete-region (point) (progn (forward-visible-line 0) (point)))) + (delete-region (point) (progn (end-of-visible-line) (point)))) + ((< arg 0) + (save-excursion + (delete-region (point) (progn (end-of-visible-line) (point)))) + (delete-region (point) + (progn (forward-visible-line (1+ arg)) + (unless (bobp) (backward-char)) + (point)))) + (t + (save-excursion + (delete-region (point) (progn (forward-visible-line 0) (point)))) + (delete-region (point) + (progn (forward-visible-line arg) (point)))))) + (define-key global-map [remap kill-whole-line] 'delete-whole-line) ''; };