Moving all of my Emacs-related files into their own directory at the root of this repository.
		
			
				
	
	
		
			95 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;;; macros.el --- Helpful variables for making my ELisp life more enjoyable -*- lexical-binding: t -*-
 | |
| ;; Authpr: William Carroll <wpcarro@gmail.com>
 | |
| 
 | |
| ;;; Commentary:
 | |
| ;; This file contains helpful variables that I use in my ELisp development.
 | |
| 
 | |
| ;; TODO: Consider a macro solution for mimmicking OCaml's auto resolution of
 | |
| ;; dependencies using `load-path' and friends.
 | |
| 
 | |
| ;;; Code:
 | |
| 
 | |
| (require 'f)
 | |
| (require 'string)
 | |
| (require 'symbol)
 | |
| 
 | |
| ;; TODO: Support `xi' lambda shorthand macro.
 | |
| 
 | |
| (defmacro enable (mode)
 | |
|   "Helper for enabling `MODE'.
 | |
| Useful in `add-hook' calls.  Some modes, like `linum-mode' need to be called as
 | |
| `(linum-mode 1)', so `(add-hook mode #'linum-mode)' won't work."
 | |
|   `#'(lambda nil (,mode 1)))
 | |
| 
 | |
| (defmacro disable (mode)
 | |
|   "Helper for disabling `MODE'.
 | |
| Useful in `add-hook' calls."
 | |
|   `#'(lambda nil (,mode -1)))
 | |
| 
 | |
| (defmacro add-hooks (modes callback)
 | |
|   "Add multiple `MODES' for the `CALLBACK'.
 | |
| Usage: (add-hooks '(one-mode-hook 'two-mode-hook) #'fn)"
 | |
|   `(dolist (mode ,modes)
 | |
|      (add-hook mode ,callback)))
 | |
| 
 | |
| (defmacro add-hook-before-save (mode f)
 | |
|   "Register a hook, `F', for a mode, `MODE' more conveniently.
 | |
| Usage: (add-hook-before-save 'reason-mode-hook #'refmt-before-save)"
 | |
|   `(add-hook ,mode
 | |
|              (lambda ()
 | |
|                (add-hook 'before-save-hook ,f))))
 | |
| 
 | |
| ;; TODO: Debug.
 | |
| (defmacro macros/ilambda (&rest body)
 | |
|   "Surrounds `BODY' with an interactive lambda function."
 | |
|   `(lambda ()
 | |
|      (interactive)
 | |
|      ,@body))
 | |
| 
 | |
| ;; TODO: Privatize?
 | |
| (defun namespace ()
 | |
|   "Return the namespace for a function based on the filename."
 | |
|   (->> (buffer-file-name)
 | |
|        f-filename
 | |
|        f-base))
 | |
| 
 | |
| (defmacro macros/comment (&rest _)
 | |
|   "Empty comment s-expresion where `BODY' is ignored."
 | |
|   `nil)
 | |
| 
 | |
| ;; NOTE: Not prepending the "macros" to this macro, since brevity is its goal.
 | |
| (defmacro >> (&rest forms)
 | |
|   "Compose a new, point-free function by composing FORMS together."
 | |
|   (let ((sym (gensym)))
 | |
|     `(lambda (,sym)
 | |
|        (->> ,sym ,@forms))))
 | |
| 
 | |
| ;; TOOD: Support this.
 | |
| (cl-defmacro macros/test
 | |
|     (&key function
 | |
|           test
 | |
|           args
 | |
|           expect
 | |
|           equality)
 | |
|   (let* ((namespace (namespace))
 | |
|          (test-name (string/->symbol
 | |
|                      (s-concat namespace
 | |
|                                "/"
 | |
|                                "test"
 | |
|                                "/"
 | |
|                                (s-chop-prefix
 | |
|                                 (s-concat namespace "/")
 | |
|                                 (symbol/to-string function))))))
 | |
|     `(ert-deftest ,test-name ()
 | |
|        ,test
 | |
|        (should (,equality (apply ,function ,args)
 | |
|                         ,expect)))))
 | |
| 
 | |
| (defmacro macros/support-file-extension (ext mode)
 | |
|   "Register MODE to automatically load with files ending with EXT extension.
 | |
| Usage: (macros/support-file-extension \"pb\" protobuf-mode)"
 | |
|   (let ((extension (string/format "\\.%s\\'" ext)))
 | |
|     `(add-to-list 'auto-mode-alist '(,extension . ,mode))))
 | |
| 
 | |
| (provide 'macros)
 | |
| ;;; macros.el ends here
 |