diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-05-13 16:58:28 +0530 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-05-13 17:01:03 +0530 |
commit | 8fcdfac6614e1ea84f2bfd100b5713ce7dce2db0 (patch) | |
tree | 2fb57d460a4be4c6d12d4ee579ed5fd56eb7bb87 /Emacs/.config/emacs/lang.org | |
parent | 5fee49b69d6605d3d695f2df56f2139c0b6ef11b (diff) | |
download | dotfiles-8fcdfac6614e1ea84f2bfd100b5713ce7dce2db0.tar.gz dotfiles-8fcdfac6614e1ea84f2bfd100b5713ce7dce2db0.tar.bz2 dotfiles-8fcdfac6614e1ea84f2bfd100b5713ce7dce2db0.zip |
(Emacs)~Merged app.org, lang.org and core.org back into config.org
Just makes it easier to profile and deal with compilation
Diffstat (limited to 'Emacs/.config/emacs/lang.org')
-rw-r--r-- | Emacs/.config/emacs/lang.org | 821 |
1 files changed, 0 insertions, 821 deletions
diff --git a/Emacs/.config/emacs/lang.org b/Emacs/.config/emacs/lang.org deleted file mode 100644 index 7242d6c..0000000 --- a/Emacs/.config/emacs/lang.org +++ /dev/null @@ -1,821 +0,0 @@ -#+title: Programming language configuration -#+author: Aryadev Chavali -#+description: Description -#+date: 2024-04-16 -#+property: header-args:emacs-lisp :tangle lang.el :comments link :results none -#+options: toc:nil -#+startup: noindent - -* Makefile -Defines an auto-insert for Makefiles. Assumes C but it's very easy to -change it for C++. -#+begin_src emacs-lisp -(use-package emacs - :auto-insert - (("[mM]akefile\\'" . "Makefile skeleton") - "" - "CC=gcc -CFLAGS=-Wall -Wextra -Werror -Wswitch-enum -ggdb -fsanitize=address -fsanitize=undefined -std=c11 -LIBS= - -ARGS= -OUT=main.out - -SRC=src -DIST=build -CODE=$(addprefix $(SRC)/, ) # add source files here -OBJECTS=$(CODE:$(SRC)/%.c=$(DIST)/%.o) -DEPDIR:=$(DIST)/dependencies -DEPFLAGS=-MT $@ -MMD -MP -MF -DEPS:=$(CODE:$(SRC)/%.c=$(DEPDIR):%.d) $(DEPDIR)/main.d - -.PHONY: all -all: $(OUT) - -$(OUT): $(DIST)/$(OUT) - -$(DIST)/$(OUT): $(OBJECTS) $(DIST)/main.o | $(DIST) - $(CC) $(CFLAGS) $^ -o $@ $(LIBS) - -$(DIST)/%.o: $(SRC)/%.c | $(DIST) $(DEPDIR) - $(CC) $(CFLAGS) $(DEPFLAGS) $(DEPDIR)/$*.d -c $< -o $@ $(LIBS) - -.PHONY: run -run: $(DIST)/$(OUT) - ./$^ $(ARGS) - -.PHONY: -clean: - rm -rfv $(DIST)/* - -$(DIST): - mkdir -p $(DIST) - -$(DEPDIR): - mkdir -p $(DEPDIR) - --include $(DEPS) -" - _)) -#+end_src -* PDF -I use PDFs mostly for reading reports or papers. Though Emacs isn't -my preferred application for viewing PDFs (I highly recommend -[[https://pwmt.org/projects/zathura/][Zathura]]), similar to most -things with Emacs, having a PDF viewer builtin can be a very useful -asset. - -For example if I were editing an org document which I was eventually -compiling into a PDF, my workflow would be much smoother with a PDF -viewer within Emacs that I can open on another pane. -** WAIT PDF tools -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -~pdf-tools~ provides the necessary functionality for viewing PDFs. -There is no proper PDF viewing without this package. -~evil-collection~ provides a setup for this mode, so use that. -#+begin_src emacs-lisp -(use-package pdf-tools - :mode ("\\.[pP][dD][fF]\\'" . pdf-view-mode) - :straight t - :display - ("^.*pdf$" - (display-buffer-same-window) - (inhibit-duplicate-buffer . t)) - :config - (pdf-tools-install-noverify) - (with-eval-after-load "evil-collection" - (evil-collection-pdf-setup))) -#+end_src -** WAIT PDF grep -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -PDF grep is a Linux tool that allows for searches against the text -inside of PDFs similar to standard grep. This cannot be performed by -standard grep due to how PDFs are encoded; they are not a clear text -format. -#+begin_src emacs-lisp -(use-package pdfgrep - :after pdf-tools - :hook (pdf-view-mode-hook . pdfgrep-mode) - :general - (nmap - :keymaps 'pdf-view-mode-map - "M-g" #'pdfgrep)) -#+end_src -* WAIT SQL -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -The default SQL package provides support for connecting to common -database types (sqlite, mysql, etc) for auto completion and query -execution. I don't use SQL currently but whenever I need it it's -there. -#+begin_src emacs-lisp -(use-package sql - :defer t - :straight nil - :init - (setq sql-display-sqli-buffer-function nil)) -#+end_src -* WAIT Ada -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -Check out [[file:elisp/ada-mode.el][ada-mode]], my custom ~ada-mode~ -that replaces the default one. This mode just colourises stuff, and -uses eglot and a language server to do the hard work. - -#+begin_src emacs-lisp -(use-package ada-mode - :straight nil - :load-path "elisp/" - :defer t - :config - (with-eval-after-load "eglot" - (add-hook 'ada-mode-hook #'eglot))) -#+end_src -* NHexl -Hexl-mode is the inbuilt package within Emacs to edit hex and binary -format buffers. There are a few problems with hexl-mode though, -including an annoying prompt on /revert-buffer/. - -Thus, nhexl-mode! It comes with a few other improvements. Check out -the [[https://elpa.gnu.org/packages/nhexl-mode.html][page]] yourself. -#+begin_src emacs-lisp -(use-package nhexl-mode - :straight t - :mode ("\\.bin" "\\.out")) -#+end_src -* C/C++ -Setup for C and C++ modes, using Emacs' default package: cc-mode. -** cc-mode -Tons of stuff, namely: -+ ~auto-fill-mode~ for 80 char limit -+ Some keybindings to make evil statement movement is easy -+ Lots of pretty symbols -+ Indenting options and a nice (for me) code style for C (though - aggressive indent screws with this a bit) -+ Auto inserts to get a C file going -#+begin_src emacs-lisp -(use-package cc-mode - :defer t - :hook - (c-mode-hook . auto-fill-mode) - (c++-mode-hook . auto-fill-mode) - :general - (:keymaps '(c-mode-map c++-mode-map) - :states '(normal motion visual) - "(" #'c-beginning-of-statement - ")" #'c-end-of-statement) - :pretty - (c-mode-hook - ("puts" . "φ") - ("fputs" . "ϕ") - ("printf" . "ω") - ("fprintf" . "Ω") - ("NULL" . "Ø") - ("true" . "⊨") - ("false" . "⊭") - ("!" . "¬") - ("&&" . "∧") - ("||" . "∨") - ("for" . "∀") - ("return" . "⟼")) - (c++-mode-hook - ("nullptr" . "Ø") - ("string" . "𝕊") - ("vector" . "ℓ") - ("puts" . "φ") - ("fputs" . "ϕ") - ("printf" . "ω") - ("fprintf" . "Ω") - ("NULL" . "Ø") - ("true" . "⊨") - ("false" . "⊭") - ("!" . "¬") - ("&&" . "∧") - ("||" . "∨") - ("for" . "∀") - ("return" . "⟼")) - :init - (setq-default c-basic-offset 2) - (setq-default c-auto-newline nil) - (setq-default c-default-style '((other . "user"))) - (defun +cc/copyright-notice () - (let* ((lines (split-string (+license/copyright-notice) "\n")) - (copyright-line (car lines)) - (rest (cdr lines))) - (concat - "* " - copyright-line - "\n" - (mapconcat - #'(lambda (x) - (if (string= x "") - "" - (concat " * " x))) - rest - "\n")))) - - :auto-insert - (("\\.c\\'" . "C skeleton") - "" - "/" (+cc/copyright-notice) "\n\n" - " * Created: " (format-time-string "%Y-%m-%d") "\n" - " * Author: " user-full-name "\n" - " * Description: " _ "\n" - " */\n" - "\n") - (("\\.cpp\\'" "C++ skeleton") - "" - "/" (+cc/copyright-notice) "\n\n" - " * Created: " (format-time-string "%Y-%m-%d") "\n" - " * Author: " user-full-name "\n" - " * Description: " _ "\n" - " */\n" - "\n") - (("\\.\\([Hh]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'" . "C / C++ header") - (replace-regexp-in-string "[^A-Z0-9]" "_" - (string-replace "+" "P" - (upcase - (file-name-nondirectory buffer-file-name)))) - "/" (+cc/copyright-notice) "\n\n" - " * Created: " (format-time-string "%Y-%m-%d") "\n" - " * Author: " user-full-name "\n" - " * Description: " _ "\n" - " */\n\n" - "#ifndef " str n "#define " str "\n\n" "\n\n#endif") - :config - (c-add-style - "user" - '((c-basic-offset . 2) - (c-comment-only-line-offset . 0) - (c-hanging-braces-alist (brace-list-open) - (brace-entry-open) - (substatement-open after) - (block-close . c-snug-do-while) - (arglist-cont-nonempty)) - (c-cleanup-list brace-else-brace) - (c-offsets-alist - (statement-block-intro . +) - (substatement-open . 0) - (access-label . -) - (inline-open . 0) - (label . 0) - (statement-cont . +))))) -#+end_src -** Clang format -Clang format comes inbuilt with clang, so download that before using -this. Formats C/C++ files depending on a format (checkout the Clang -format [[file:~/Dotfiles/ClangFormat/.clang-format][config file]] in -my dotfiles). - -#+begin_src emacs-lisp -(use-package clang-format - :straight nil - :load-path "/usr/share/clang/" - :after cc-mode - :commands (+code/clang-format-region-or-buffer - clang-format-mode) - ;;; 2024-04-24: disabled as it's annoying on projects where a - ;;; .clang-format isn't defined. Furthermore, does it make sense - ;;; for *every* file you open and edit to have a format function run - ;;; right after? seems a bit slow. - ;; :hook - ;; (c-mode-hook . clang-format-mode) - ;; (c++-mode-hook . clang-format-mode) - :general - (code-leader - :keymaps '(c-mode-map c++-mode-map) - "f" #'+code/clang-format-region-or-buffer) - :config - (define-minor-mode clang-format-mode - "On save formats the current buffer via clang-format." - :lighter nil - (let ((save-func (proc (interactive) - (clang-format-buffer)))) - (if clang-format-mode - (add-hook 'after-save-hook save-func nil t) - (remove-hook 'after-save-hook save-func t)))) - (defun +code/clang-format-region-or-buffer () - (interactive) - (if (mark) - (clang-format-region (region-beginning) (region-end)) - (clang-format-buffer)))) -#+end_src -** cc org babel -To ensure org-babel executes language blocks of C/C++, I need to load -it as an option in ~org-babel-load-languages~. -#+begin_src emacs-lisp -(use-package org - :after cc-mode - :init - (org-babel-do-load-languages - 'org-babel-load-languages - '((C . t)))) -#+end_src -* WAIT D -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -D is a systems level programming language with C-style syntax. I -think it has some interesting ideas such as a toggleable garbage -collector. Here I just install the D-mode package, enable ~org-babel~ -execution of d-mode blocks and alias ~D-mode~ with ~d-mode~. - -#+begin_src emacs-lisp -(use-package d-mode - :defer t - :straight t - :config - (fset 'D-mode 'd-mode) - (with-eval-after-load "org-mode" - (setf (alist-get 'd org-babel-load-languages) t))) -#+end_src -* WAIT Rust -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -#+begin_src emacs-lisp -(use-package rust-mode - :straight t - :general - (code-leader - :keymaps 'rust-mode-map - "f" #'rust-format-buffer) - (local-leader - :keymaps 'rust-mode-map - "c" #'rust-run-clippy) - :init - (setq rust-format-on-save t) - (with-eval-after-load "eglot" - (add-to-list 'eglot-server-programs '(rust-mode "rust-analyzer")))) -#+end_src -* WAIT Racket -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -A scheme with lots of stuff inside it. Using it for a language design -book so it's useful to have some Emacs binds for it. -#+begin_src emacs-lisp -(use-package racket-mode - :straight t - :hook (racket-mode-hook . racket-xp-mode) - :display - ("\\*Racket.*" - (display-buffer-at-bottom) - (window-height . 0.25)) - :init - (setq racket-documentation-search-location 'local) - :general - (nmap - :keymaps 'racket-describe-mode-map - "q" #'quit-window) - (nmap - :keymaps 'racket-mode-map - "gr" #'racket-eval-last-sexp) - (local-leader - :keymaps '(racket-mode-map racket-repl-mode-map) - "d" #'racket-repl-describe) - (local-leader - :keymaps 'racket-mode-map - "r" #'racket-run - "i" #'racket-repl - "e" #'racket-send-definition - "sr" #'racket-send-region - "sd" #'racket-send-definition)) -#+end_src -* WAIT CSharp -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -Haven't used C# in a while, but Emacs is alright for it with -omnisharp. -#+begin_src emacs-lisp -(use-package csharp-mode - :defer t - :pretty - (csharp-mode-hook - ("null" . "∅") - ("string" . "𝕊") - ("List" . "ℓ") - ("WriteLine" . "φ") - ("Write" . "ω") - ("true" . "⊨") - ("false" . "⊭") - ("!" . "¬") - ("&&" . "∧") - ("||" . "∨") - ("for" . "∀") - ("return" . "⟼"))) -#+end_src -* WAIT Java -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -I kinda dislike Java, but if necessary I will code in it. Just setup -a style and some pretty symbols. You can use LSP to get cooler -features to be fair. -#+begin_src emacs-lisp -(use-package ob-java - :straight nil - :defer t - :pretty - (java-mode-hook - ("println" . "φ") - ("printf" . "ω") - ("null" . "Ø") - ("true" . "⊨") - ("false" . "⊭") - ("!" . "¬") - ("&&" . "∧") - ("||" . "∨") - ("for" . "∀") - ("return" . "⟼")) - :config - (with-eval-after-load "cc-mode" - (c-add-style - "java" - '((c-basic-offset . 4) - (c-comment-only-line-offset 0 . 0) - (c-offsets-alist - (inline-open . 0) - (topmost-intro-cont . +) - (statement-block-intro . +) - (knr-argdecl-intro . 5) - (substatement-open . 0) - (substatement-label . +) - (label . +) - (statement-case-open . +) - (statement-cont . +) - (arglist-intro . c-lineup-arglist-intro-after-paren) - (arglist-close . c-lineup-arglist) - (brace-list-intro first c-lineup-2nd-brace-entry-in-arglist c-lineup-class-decl-init-+ +) - (access-label . 0) - (inher-cont . c-lineup-java-inher) - (func-decl-cont . c-lineup-java-throws)))) - (add-to-list 'c-default-style '(java-mode . "java"))) - - (with-eval-after-load "abbrev" - (define-abbrev-table 'java-mode-abbrev-table nil) - (add-hook 'java-mode-hook - (proc (setq-local local-abbrev-table java-mode-abbrev-table))))) -#+end_src -* Haskell -Haskell is a static lazy functional programming language (what a -mouthful). It's quite a beautiful language and really learning it will -change the way you think about programming. However, my preferred -functional language is still unfortunately Lisp so no extra brownie -points there. - -Here I configure the REPL for Haskell via the -~haskell-interactive-mode~. I also load my custom package -[[file:elisp/haskell-multiedit.el][haskell-multiedit]] which allows a -user to create temporary ~haskell-mode~ buffers that, upon completion, -will run in the REPL. Even easier than making your own buffer. -#+begin_src emacs-lisp -(use-package haskell-mode - :hook - (haskell-mode-hook . haskell-indentation-mode) - (haskell-mode-hook . interactive-haskell-mode) - :custom - (haskell-interactive-prompt "[λ] ") - (haskell-interactive-prompt-cont "{λ} ") - (haskell-interactive-popup-errors nil) - (haskell-stylish-on-save nil) - (haskell-process-type 'auto) - :general - (shell-leader - "h" #'haskell-interactive-bring) - (local-leader - :keymaps 'haskell-mode-map - "l" #'haskell-process-load-or-reload - "t" #'haskell-process-do-type) - (local-leader - :keymaps 'haskell-interactive-mode-map - "c" #'haskell-interactive-mode-clear) - (imap - :keymaps 'haskell-interactive-mode-map - "M-k" #'haskell-interactive-mode-history-previous - "M-j" #'haskell-interactive-mode-history-next) - :display - ("\\*haskell.**\\*" - (display-buffer-at-bottom) - (window-height . 0.25)) - :config - (load (concat user-emacs-directory "elisp/haskell-multiedit.el"))) -#+end_src -* Python -Works well for python. If you have ~pyls~ it should be on your path, so -just run eglot if you need. But an LSP server is not necessary for a -lot of my time in python. Here I also setup org-babel for python -source code blocks. -#+begin_src emacs-lisp -(use-package python - :defer t - :straight nil - :pretty - (python-mode-hook - ("None" . "Ø") - ("list" . "ℓ") - ("List" . "ℓ") - ("str" . "𝕊") - ("True" . "⊨") - ("False" . "⊭") - ("!" . "¬") - ("&&" . "∧") - ("||" . "∨") - ("for" . "∀") - ("print" . "φ") - ("lambda" . "λ") - ("return" . "⟼") - ("yield" . "⟻")) - :init - (setq python-indent-offset 4) - :config - (with-eval-after-load "org-mode" - (setf (alist-get 'python org-babel-load-languages) t))) -#+end_src -** Python shell -Setup for python shell, including a toggle option -#+begin_src emacs-lisp -(use-package python - :straight nil - :commands +python/toggle-repl - :general - (shell-leader - "p" #'run-python) - :display - ("\\*Python\\*" - (display-buffer-at-bottom) - (window-height . 0.25))) -#+end_src -* YAML -YAML is a data language which is useful for config files. -#+begin_src emacs-lisp -(use-package yaml-mode - :straight t) -#+end_src -* HTML/CSS/JS -Firstly, web mode for consistent colouring of syntax. -#+begin_src emacs-lisp -(use-package web-mode - :mode ("\\.html" . web-mode) - :mode ("\\.js" . web-mode) - :mode ("\\.css" . web-mode) - :custom - ((web-mode-code-indent-offset 2) - (web-mode-markup-indent-offset 2) - (web-mode-css-indent-offset 2))) -#+end_src -** Emmet -Emmet for super speed code writing. -#+begin_src emacs-lisp -(use-package emmet-mode - :hook (web-mode-hook . emmet-mode) - :general - (imap - :keymaps 'emmet-mode-keymap - "TAB" #'emmet-expand-line - "M-j" #'emmet-next-edit-point - "M-k" #'emmet-prev-edit-point)) -#+end_src -** HTML Auto insert -#+begin_src emacs-lisp -(use-package web-mode - :defer t - :auto-insert - (("\\.html\\'" . "HTML Skeleton") - "" - "<!doctype html> -<html lang=''> - <head> - <meta charset='utf-8'> - <meta http-equiv='x-ua-compatible' content='ie=edge'> - <title>"(read-string "Enter title: ") | """</title> - <meta name='description' content='" (read-string "Enter description: ") | "" "'> - <meta name='author' content='"user-full-name"'/> - <meta name='viewport' content='width=device-width, initial-scale=1'> - - <link rel='apple-touch-icon' href='/apple-touch-icon.png'> - <link rel='shortcut icon' href='/favicon.ico'/> - <!-- Place favicon.ico in the root directory --> - - </head> - <body> - <!--[if lt IE 8]> - <p class='browserupgrade'> - You are using an <strong>outdated</strong> browser. Please - <a href='http://browsehappy.com/'>upgrade your browser</a> to improve - your experience. - </p> - <![endif]--> -" - _ - " </body> -</html>")) -#+end_src -** WAIT Typescript -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -A child language of javascript which compiles to it. -#+begin_src emacs-lisp -(use-package typescript-mode - :defer t - :init - (setq typescript-indent-level 2)) -#+end_src -* Common Lisp -Common Lisp is a dialect of Lisp, the most /common/ one around. Emacs -comes with builtin Lisp support of course, but a REPL would be nice. - -** WAIT Sly -Enter /SLY/. Sly is a fork of /SLIME/ and is *mandatory* for lisp -development on Emacs. - -#+begin_src emacs-lisp -(use-package sly - :straight t - :init - (setq inferior-lisp-program "sbcl") - :display - ("\\*sly-db" - (display-buffer-at-bottom) - (window-height . 0.5)) - ("\\*sly-" - (display-buffer-at-bottom) - (window-height . 0.25)) - :config - (evil-set-initial-state 'sly-db-mode 'emacs) - (with-eval-after-load "org" - (setq-default org-babel-lisp-eval-fn #'sly-eval)) - (with-eval-after-load "company" - (add-hook 'sly-mrepl-hook #'company-mode)) - :general - (shell-leader - "s" #'sly-mrepl) - (nmap - :keymaps '(lisp-mode-map sly-mrepl-mode-map) - "gr" #'sly-eval-buffer - "gd" #'sly-edit-definition - "gR" #'sly-who-calls) - (local-leader - :keymaps '(lisp-mode-map sly-mrepl-mode-map) - "s" #'+shell/toggle-sly - "c" #'sly-compile-file - "a" #'sly-apropos - "d" #'sly-describe-symbol - "D" #'sly-documentation-lookup - "S" #'sly-mrepl-sync - "E" #'sly-eval-defun) - (local-leader - :keymaps 'lisp-mode-map - :infix "e" - "b" #'sly-eval-buffer - "e" #'sly-eval-last-expression - "f" #'sly-eval-defun - "r" #'sly-eval-region) - (nmap - :keymaps 'sly-inspector-mode-map - "q" #'sly-inspector-quit)) -#+end_src -** Emacs lisp -#+begin_src emacs-lisp -(use-package elisp-mode - :straight nil - :pretty - (lisp-mode-hook - ("lambda" . "λ") - ("t" . "⊨") - ("nil" . "Ø") - ("and" . "∧") - ("or" . "∨") - ("defun" . "ƒ") - ("for" . "∀") - ("mapc" . "∀") - ("mapcar" . "∀")) - (emacs-lisp-mode-hook - ("lambda" . "λ") - ("t" . "⊨") - ("nil" . "Ø") - ("and" . "∧") - ("or" . "∨") - ("defun" . "ƒ") - ("for" . "∀") - ("mapc" . "∀") - ("mapcar" . "∀")) - :general - (:states '(normal motion visual) - :keymaps '(emacs-lisp-mode-map lisp-mode-map) - ")" #'sp-next-sexp - "(" #'sp-previous-sexp) - (nmmap - :keymaps '(emacs-lisp-mode-map lisp-interaction-mode-map) - "gr" #'eval-last-sexp) - (vmap - :keymaps '(emacs-lisp-mode-map lisp-interaction-mode-map) - "gr" #'eval-region)) -#+end_src -** WIP Hydra like Lispy -:PROPERTIES: -:header-args:emacs-lisp: :tangle no -:END: -A [[file:core.org::*Hydra][Hydra]] which uses the ~Lispy~ package (by -abo-abo) to create a set of motions that allow movement around a lisp -file easily. - -2024-04-18: Still working on this, quite rough around the edges. -#+begin_src emacs-lisp -(use-package lispy - :after (lisp-mode elisp-mode) - :hydra - (hydra-lispy - nil "Move around quickly in Lisp" - ("h" #'lispy-left) - ("j" ("t" #'lispy-teleport) - #'lispy-down) - ("k" #'lispy-up) - ("l" #'lispy-right) - ("d" #'lispy-different) - ("u" #'lispy-flow) - ("o" #'lispy-oneline) - ("m" #'lispy-multiline) - ("N" #'lispy-narrow) - ("W" #'lispy-widen) - ("c" #'lispy-clone) - ("fp" #'lispy-ace-paren) - ("fs" #'lispy-ace-symbol :exit t) - ("H" #'lispy-slurp) - ("L" #'lispy-barf) - ("M-h" #'lispy-move-left) - ("M-j" #'lispy-move-down) - ("M-k" #'lispy-move-up) - ("M-l" #'lispy-move-right) - ("C-g" nil)) - :general - (nmmap - :keymaps '(emacs-lisp-mode-map lisp-mode-map) - "." #'hydra-lispy/body)) -#+end_src -** Lisp indent function -Add a new lisp indent function which indents newline lists more -appropriately. -#+begin_src emacs-lisp -(use-package lisp-mode - :straight nil - :config - (defun +oreo/lisp-indent-function (indent-point state) - (let ((normal-indent (current-column)) - (orig-point (point))) - (goto-char (1+ (elt state 1))) - (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t) - (cond - ;; car of form doesn't seem to be a symbol, or is a keyword - ((and (elt state 2) - (or (not (looking-at "\\sw\\|\\s_")) - (looking-at ":"))) - (if (not (> (save-excursion (forward-line 1) (point)) - calculate-lisp-indent-last-sexp)) - (progn (goto-char calculate-lisp-indent-last-sexp) - (beginning-of-line) - (parse-partial-sexp (point) - calculate-lisp-indent-last-sexp 0 t))) - ;; Indent under the list or under the first sexp on the same - ;; line as calculate-lisp-indent-last-sexp. Note that first - ;; thing on that line has to be complete sexp since we are - ;; inside the innermost containing sexp. - (backward-prefix-chars) - (current-column)) - ((and (save-excursion - (goto-char indent-point) - (skip-syntax-forward " ") - (not (looking-at ":"))) - (save-excursion - (goto-char orig-point) - (looking-at ":"))) - (save-excursion - (goto-char (+ 2 (elt state 1))) - (current-column))) - (t - (let ((function (buffer-substring (point) - (progn (forward-sexp 1) (point)))) - method) - (setq method (or (function-get (intern-soft function) - 'lisp-indent-function) - (get (intern-soft function) 'lisp-indent-hook))) - (cond ((or (eq method 'defun) - (and (null method) - (> (length function) 3) - (string-match "\\`def" function))) - (lisp-indent-defform state indent-point)) - ((integerp method) - (lisp-indent-specform method state - indent-point normal-indent)) - (method - (funcall method indent-point state)))))))) - (setq-default lisp-indent-function #'+oreo/lisp-indent-function)) -#+end_src |