* How To Use #+begin_src sh :results output scalar cp -r ~/.emacs.d chown -R ~/.emacs.d # ln -sf ~/.emacs.d #+end_src * Introduction *"Original" EMACS:* - 1976 - David A. Moon & Guy L. Steele Jr. - Set of macros for the TECO editor (char based editor) *Gosling Emacs:* - 1981 - James Gosling (the Java® guy) *GNU Emacs:* - 1984 - Richard Stallman aka. [[http://stallman.org/saint.html][Saint IGNUcius]] /(saint in the Church of Emacs)/ *Latest Release*: Emacs 30.1 *Released:* February, 2025 Emacs uses ~emacs-lisp~: - lisp dialect - functional (not pure though) - specially developed to configure Emacs ** Variables #+begin_src emacs-lisp :results output scalar (defvar my/var nil "My very own variable") (setq my/var "Hey Emacs!") (print my/var) ;; There are more... (setq-local, setq-default) #+end_src #+RESULTS: : " : \"Hey Emacs!\" : " ** Functions #+begin_src emacs-lisp :results output scalar (defun test () "Docstring" (interactive) (print my/var)) (test) #+end_src #+begin_src emacs-lisp :results output scalar (defun more (a b &optional c d &rest e) (interactive) ; 'a 'b 'c 'd '(...) (print (concat a b c d (mapconcat #'identity e "")))) (more "1" "2" "3" "4" "5" "6" "7") (more "1" "2" "3") #+end_src #+RESULTS: : " : \"1234567\" : : \"123\" : " #+begin_src emacs-lisp :results output scalar (defun print-name (&rest args) (interactive) (let ((first (plist-get args :first)) (last (or (plist-get args :last) "?"))) (princ last) (when first (princ ", ") (princ first)))) (print-name :first "Philip" :last "B1") #+end_src #+RESULTS: : "B1, Philip" ** Let Bindings #+begin_src emacs-lisp :results output scalar (defun another-test (a b) "Multiplies `A' times `B' and adds them afterwards" (interactive) (let* ((x a) (y (* x b))) (+ x y))) (print (another-test 2 4)) #+end_src #+RESULTS: : " : 10 : " ** Hooks #+begin_src emacs-lisp :results output scalar (defun my/fun () (message "Emacs is cool!")) (add-hook 'after-save-hook #'my/fun) ;; (remove-hook 'after-save-hook 'my/fun) #+end_src ** Package Management & Configuration *Package Manager* - https://github.com/radian-software/straight.el #+begin_src emacs-lisp :results output scalar ; Standard is package.el (straight-use-package 'nix-mode) #+end_src #+RESULTS: : "" *Configuration Macro* - https://github.com/jwiegley/use-package #+begin_src emacs-lisp :results output scalar (straight-use-package 'use-package) ;; Macro that provides syntactic sugar (use-package color-moccur ;; Creates autoloads for these commands ;; Defers loading of the module until command is used :commands (isearch-moccur isearch-all) ;; Keybindings :bind (("M-s O" . moccur) :map isearch-mode-map ("M-o" . isearch-moccur) ("M-O" . isearch-moccur-all)) ;; Before package is loaded :init (setq isearch-lazy-highlight t) ;; After package is loaded :config (use-package moccur-edit)) #+end_src ** Tour de Emacs Config .emacs.d/ ├── early-init.el ├── init.el └── cnf/ ├── app └── lang ** Tasks *** Keybinding - Create a new keybinding for the ~emacs-lisp-mode~ that executes ~eval-last-sexp~ with the binding ~SPC x e~ while in ~normal~ mode **** Possible Solution #+begin_src emacs-lisp :results output scalar (my-leader :keymaps 'emacs-lisp-mode-map :states 'normal "x" '(:ignore t :which-key "Eval") "x e" 'eval-last-sexp "x b" 'eval-buffer) #+end_src *** Package - Install a new package using straight, e.g. ~swiper~ (or something else) **** Possible Solution #+begin_src emacs-lisp :results output scalar (straight-use-package 'swiper) #+end_src