aboutsummaryrefslogtreecommitdiff
path: root/Emacs/.config/emacs/elisp/move.el
diff options
context:
space:
mode:
Diffstat (limited to 'Emacs/.config/emacs/elisp/move.el')
-rw-r--r--Emacs/.config/emacs/elisp/move.el80
1 files changed, 80 insertions, 0 deletions
diff --git a/Emacs/.config/emacs/elisp/move.el b/Emacs/.config/emacs/elisp/move.el
new file mode 100644
index 0000000..ed154fb
--- /dev/null
+++ b/Emacs/.config/emacs/elisp/move.el
@@ -0,0 +1,80 @@
+;;; move-line.el --- Move current line up or down -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2024 Aryadev Chavali
+
+;; Author: Aryadev Chavali <aryadev@aryadevchavali.com>
+;; Keywords:
+
+;; This is free and unencumbered software released into the public domain.
+
+;; Anyone is free to copy, modify, publish, use, compile, sell, or
+;; distribute this software, either in source code form or as a compiled
+;; binary, for any purpose, commercial or non-commercial, and by any
+;; means.
+
+;; In jurisdictions that recognize copyright laws, the author or authors
+;; of this software dedicate any and all copyright interest in the
+;; software to the public domain. We make this dedication for the benefit
+;; of the public at large and to the detriment of our heirs and
+;; successors. We intend this dedication to be an overt act of
+;; relinquishment in perpetuity of all present and future rights to this
+;; software under copyright law.
+
+;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+;; IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+;; OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+;; ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+;; OTHER DEALINGS IN THE SOFTWARE.
+
+;; For more information, please refer to <https://unlicense.org>
+
+;;; Commentary:
+
+;; Move the current line up or down. Shamelessly copied from
+;; https://emacsredux.com/blog/2013/04/02/move-current-line-up-or-down/ so
+
+;;; Code:
+
+(defmacro +move/create-move (name description &rest body)
+ `(defun ,name (&optional arg)
+ ,description
+ (interactive "P")
+ (let ((arg (if (or (null arg) (< arg 1)) 1 arg)))
+ (while (not (= arg 0))
+ ,@body
+ (setq arg (- arg 1))))))
+
+(+move/create-move
+ +move/line-up
+ "Move the current line up"
+ (transpose-lines 1)
+ (forward-line -2)
+ (indent-according-to-mode))
+
+(+move/create-move
+ +move/line-down
+ "Move the current line down"
+ (forward-line 1)
+ (transpose-lines 1)
+ (forward-line -1)
+ (indent-according-to-mode))
+
+(+move/create-move
+ +move/word-forward
+ "Move the current word forward"
+ (forward-word 1)
+ (transpose-words 1)
+ (forward-word -1)
+ (indent-according-to-mode))
+
+(+move/create-move
+ +move/word-backward
+ "Move the current word backward"
+ (transpose-words 1)
+ (forward-word -2)
+ (indent-according-to-mode))
+
+(provide 'move)
+;;; move.el ends here