dotfiles

my shiny new dotfiles
git clone git://git.jakekoroman.com/dotfiles
Log | Files | Refs | README

commit 97228875b9f38006cdfa65802c6f09de0409c054
parent f7a6cdd62396f445802a6872f126b6e53111cf35
Author: Jake Koroman <jakekoroman@gmail.com>
Date:   Tue,  5 Mar 2024 18:26:48 -0500

emacs changes

Diffstat:
M.emacs | 10++++++----
A.emacs.local/odin-mode.el | 310+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdevice-specific/laptop/emacs.el | 2+-
3 files changed, 317 insertions(+), 5 deletions(-)

diff --git a/.emacs b/.emacs @@ -1,11 +1,13 @@ ;;; https://github.com/hrs/dotfiles/blob/main/emacs/.config/emacs/configuration.org - + (setq custom-file (concat user-emacs-directory "custom.el")) (add-to-list 'load-path "~/.emacs.local") (add-to-list 'custom-theme-load-path "~/.emacs.local") (when (file-exists-p custom-file) (load custom-file)) +(load "odin-mode.el") + ;;; Appearance and basic functionality (menu-bar-mode -1) (tool-bar-mode -1) @@ -206,9 +208,9 @@ :ensure :config (setq hl-todo-keyword-faces - '(("TODO" . "#FF0000") - ("NOTE" . "#00FF00") - ("IMPORTANT" . "#FFFF00"))) + '(("TODO" . "#f43841") + ("NOTE" . "#73c936") + ("IMPORTANT" . "#2ea3f2"))) :init (global-hl-todo-mode)) diff --git a/.emacs.local/odin-mode.el b/.emacs.local/odin-mode.el @@ -0,0 +1,310 @@ +;;; odin-mode.el --- A minor mode for odin + +;; Author: Ethan Morgan +;; Keywords: odin, language, languages, mode +;; Package-Requires: ((emacs "24.1")) +;; Homepage: https://github.com/glassofethanol/odin-mode + +;; This file is NOT part of GNU Emacs. + +;;; Code: + +(require 'cl-lib) +(require 'rx) +(require 'js) + +(defgroup odin nil + "Odin mode" + :group 'languages) + +;; `compilation-mode' configuration + +(eval-after-load 'compile + '(add-to-list 'compilation-error-regexp-alist '("^\\(.*?\\)(\\([0-9]+\\):\\([0-9]+\\).*" 1 2 3))) + +(defconst odin-mode-syntax-table + (let ((table (make-syntax-table))) + (modify-syntax-entry ?\" "\"" table) + (modify-syntax-entry ?\\ "\\" table) + + ;; additional symbols + (modify-syntax-entry ?' "\"" table) + (modify-syntax-entry ?` "\"" table) + (modify-syntax-entry ?: "." table) + (modify-syntax-entry ?+ "." table) + (modify-syntax-entry ?- "." table) + (modify-syntax-entry ?% "." table) + (modify-syntax-entry ?& "." table) + (modify-syntax-entry ?| "." table) + (modify-syntax-entry ?^ "." table) + (modify-syntax-entry ?! "." table) + (modify-syntax-entry ?$ "." table) + (modify-syntax-entry ?= "." table) + (modify-syntax-entry ?< "." table) + (modify-syntax-entry ?> "." table) + (modify-syntax-entry ?? "." table) + + ;; Need this for #directive regexes to work correctly + (modify-syntax-entry ?# "_" table) + + ;; Modify some syntax entries to allow nested block comments + (modify-syntax-entry ?/ ". 124b" table) + (modify-syntax-entry ?* ". 23n" table) + (modify-syntax-entry ?\n "> b" table) + (modify-syntax-entry ?\^m "> b" table) + + table)) + +(defconst odin-builtins + '("len" "cap" + "typeid_of" "type_info_of" + "swizzle" "complex" "real" "imag" "quaternion" "conj" + "jmag" "kmag" + "min" "max" "abs" "clamp" + "expand_to_tuple" + + "init_global_temporary_allocator" + "copy" "pop" "unordered_remove" "ordered_remove" "clear" "reserve" + "resize" "new" "new_clone" "free" "free_all" "delete" "make" + "clear_map" "reserve_map" "delete_key" "append_elem" "append_elems" + "append" "append_string" "clear_dynamic_array" "reserve_dynamic_array" + "resize_dynamic_array" "incl_elem" "incl_elems" "incl_bit_set" + "excl_elem" "excl_elems" "excl_bit_set" "incl" "excl" "card" + "assert" "panic" "unimplemented" "unreachable")) + +(defconst odin-keywords + '("import" "foreign" "package" + "where" "when" "if" "else" "for" "switch" "in" "notin" "do" "case" + "break" "continue" "fallthrough" "defer" "return" "proc" + "struct" "union" "enum" "bit_field" "bit_set" "map" "dynamic" + "auto_cast" "cast" "transmute" "distinct" "opaque" + "using" "inline" "no_inline" + "size_of" "align_of" "offset_of" "type_of" + + "context" + ;; "_" + + ;; Reserved + "macro" "const")) + +(defconst odin-constants + '("nil" "true" "false" + "ODIN_OS" "ODIN_ARCH" "ODIN_ENDIAN" "ODIN_VENDOR" + "ODIN_VERSION" "ODIN_ROOT" "ODIN_DEBUG")) + +(defconst odin-typenames + '("bool" "b8" "b16" "b32" "b64" + + "int" "i8" "i16" "i32" "i64" + "i16le" "i32le" "i64le" + "i16be" "i32be" "i64be" + "i128" "u128" + "i128le" "u128le" + "i128be" "u128be" + + "uint" "u8" "u16" "u32" "u64" + "u16le" "u32le" "u64le" + "u16be" "u32be" "u64be" + + "f32" "f64" + "complex64" "complex128" + + "quaternion128" "quaternion256" + + "rune" + "string" "cstring" + + "uintptr" "rawptr" + "typeid" "any" + "byte")) + +(defconst odin-attributes + '("builtin" + "export" + "static" + "deferred_in" "deferred_none" "deferred_out" + "require_results" + "default_calling_convention" "link_name" "link_prefix" + "deprecated" "private" "thread_local")) + + +(defconst odin-proc-directives + '("#force_inline" + "#force_no_inline" + "#type") + "Directives that can appear before a proc declaration") + +(defconst odin-directives + (append '("#align" "#packed" + "#any_int" + "#raw_union" + "#no_nil" + "#complete" + "#no_alias" + "#c_vararg" + "#assert" + "#file" "#line" "#location" "#procedure" "#caller_location" + "#load" + "#defined" + "#bounds_check" "#no_bounds_check" + "#partial") odin-proc-directives)) + +(defun odin-wrap-word-rx (s) + (concat "\\<" s "\\>")) + +(defun odin-wrap-keyword-rx (s) + (concat "\\(?:\\S.\\_<\\|\\`\\)" s "\\_>")) + +(defun odin-wrap-directive-rx (s) + (concat "\\_<" s "\\>")) + +(defun odin-wrap-attribute-rx (s) + (concat "[[:space:]\n]*@[[:space:]\n]*(?[[:space:]\n]*" s "\\>")) + +(defun odin-keywords-rx (keywords) + "build keyword regexp" + (odin-wrap-keyword-rx (regexp-opt keywords t))) + +(defun odin-directives-rx (directives) + (odin-wrap-directive-rx (regexp-opt directives t))) + +(defun odin-attributes-rx (attributes) + (odin-wrap-attribute-rx (regexp-opt attributes t))) + +(defconst odin-identifier-rx "[[:word:][:multibyte:]_]+") +(defconst odin-hat-type-rx (rx (group (and "^" (1+ (any word "." "_")))))) +(defconst odin-dollar-type-rx (rx (group "$" (or (1+ (any word "_")) (opt "$"))))) +(defconst odin-number-rx + (rx (and + symbol-start + (or (and (+ digit) (opt (and (any "eE") (opt (any "-+")) (+ digit)))) + (and "0" (any "xX") (+ hex-digit))) + (opt (and (any "_" "A-Z" "a-z") (* (any "_" "A-Z" "a-z" "0-9")))) + symbol-end))) +(defconst odin-proc-rx (concat "\\(\\_<" odin-identifier-rx "\\_>\\)\\s *::\\s *\\(" (odin-directives-rx odin-proc-directives) "\\)?\\s *\\_<proc\\_>")) + +(defconst odin-type-rx (concat "\\_<\\(" odin-identifier-rx "\\)\\s *::\\s *\\(?:struct\\|enum\\|union\\|distinct\\)\\s *\\_>")) + + +(defconst odin-font-lock-defaults + `( + ;; Types + (,odin-hat-type-rx 1 font-lock-type-face) + (,odin-dollar-type-rx 1 font-lock-type-face) + (,(odin-keywords-rx odin-typenames) 1 font-lock-type-face) + (,odin-type-rx 1 font-lock-type-face) + + ;; Hash directives + (,(odin-directives-rx odin-directives) 1 font-lock-preprocessor-face) + + ;; At directives + (,(odin-attributes-rx odin-attributes) 1 font-lock-preprocessor-face) + + ;; Keywords + (,(odin-keywords-rx odin-keywords) 1 font-lock-keyword-face) + + ;; single quote characters + ("'\\(\\\\.\\|[^']\\)'" . font-lock-constant-face) + + ;; Variables + (,(odin-keywords-rx odin-builtins) 1 font-lock-builtin-face) + + ;; Constants + (,(odin-keywords-rx odin-constants) 1 font-lock-constant-face) + + ;; Strings + ;; ("\\\".*\\\"" . font-lock-string-face) + + ;; Numbers + (,(odin-wrap-word-rx odin-number-rx) . font-lock-constant-face) + + ;; Procedures + (,odin-proc-rx 1 font-lock-function-name-face) + + ("---" . font-lock-constant-face) + ("\\.\\.<" . font-lock-constant-face) + ("\\.\\." . font-lock-constant-face) + )) + +;; add setq-local for older emacs versions +(unless (fboundp 'setq-local) + (defmacro setq-local (var val) + `(set (make-local-variable ',var) ,val))) + +(defconst odin--defun-rx "\(.*\).*\{") + +(defmacro odin-paren-level () + `(car (syntax-ppss))) + +(defun odin-line-is-defun () + "return t if current line begins a procedure" + (interactive) + (save-excursion + (beginning-of-line) + (let (found) + (while (and (not (eolp)) (not found)) + (if (looking-at odin--defun-rx) + (setq found t) + (forward-char 1))) + found))) + +(defun odin-beginning-of-defun (&optional count) + "Go to line on which current function starts." + (interactive) + (let ((orig-level (odin-paren-level))) + (while (and + (not (odin-line-is-defun)) + (not (bobp)) + (> orig-level 0)) + (setq orig-level (odin-paren-level)) + (while (>= (odin-paren-level) orig-level) + (skip-chars-backward "^{") + (backward-char)))) + (if (odin-line-is-defun) + (beginning-of-line))) + +(defun odin-end-of-defun () + "Go to line on which current function ends." + (interactive) + (let ((orig-level (odin-paren-level))) + (when (> orig-level 0) + (odin-beginning-of-defun) + (end-of-line) + (setq orig-level (odin-paren-level)) + (skip-chars-forward "^}") + (while (>= (odin-paren-level) orig-level) + (skip-chars-forward "^}") + (forward-char))))) + +(defalias 'odin-parent-mode + (if (fboundp 'prog-mode) 'prog-mode 'fundamental-mode)) + +;;;###autoload +(define-derived-mode odin-mode odin-parent-mode "Odin" + :syntax-table odin-mode-syntax-table + :group 'odin + (setq bidi-paragraph-direction 'left-to-right) + (setq-local require-final-newline mode-require-final-newline) + (setq-local parse-sexp-ignore-comments t) + (setq-local comment-start-skip "\\(//+\\|/\\*+\\)\\s *") + (setq-local comment-start "//") + (setq-local comment-end "") + (setq-local indent-line-function 'js-indent-line) + (setq-local font-lock-defaults '(odin-font-lock-defaults)) + (setq-local beginning-of-defun-function 'odin-beginning-of-defun) + (setq-local end-of-defun-function 'odin-end-of-defun) + (setq-local electric-indent-chars + (append "{}():;," electric-indent-chars)) + (setq imenu-generic-expression + `(("type" ,(concat "^" odin-type-rx) 1) + ("proc" ,(concat "^" odin-proc-rx) 1))) + + (font-lock-ensure)) + +;;;###autoload +(add-to-list 'auto-mode-alist '("\\.odin\\'" . odin-mode)) + +(provide 'odin-mode) + + +;;; odin-mode.el ends here diff --git a/device-specific/laptop/emacs.el b/device-specific/laptop/emacs.el @@ -5,5 +5,5 @@ ;; (toggle-frame-maximized) (set-default 'truncate-lines t) ;; (list-colors-display) for a color picker -(load-theme 'handmade t) +(load-theme 'gruber-darker t) (transparency 100)