From f2653e0cf38f131e801a8af5d5a4c8d663b2dff3 Mon Sep 17 00:00:00 2001 From: Antonin Ruan Date: Mon, 27 Apr 2026 20:55:31 -0400 Subject: [PATCH] Switch to DOOM Emacs --- .config/doom/config.el | 178 +++++++++++++ .config/doom/init.el | 199 ++++++++++++++ .config/doom/packages.el | 61 +++++ .emacs | 514 ------------------------------------- .emacs.local/fasm-mode.el | 480 ---------------------------------- .emacs.local/llvm-mode.el | 292 --------------------- .emacs.local/simpc-mode.el | 111 -------- .emacs.rc/misc-rc.el | 137 ---------- .emacs.rc/rc.el | 34 --- MANIFEST | 4 +- 10 files changed, 439 insertions(+), 1571 deletions(-) create mode 100644 .config/doom/config.el create mode 100644 .config/doom/init.el create mode 100644 .config/doom/packages.el delete mode 100644 .emacs delete mode 100644 .emacs.local/fasm-mode.el delete mode 100644 .emacs.local/llvm-mode.el delete mode 100644 .emacs.local/simpc-mode.el delete mode 100644 .emacs.rc/misc-rc.el delete mode 100644 .emacs.rc/rc.el diff --git a/.config/doom/config.el b/.config/doom/config.el new file mode 100644 index 0000000..856920c --- /dev/null +++ b/.config/doom/config.el @@ -0,0 +1,178 @@ +;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- + +;; Place your private configuration here! Remember, you do not need to run 'doom +;; sync' after modifying this file! + + +;; Some functionality uses this to identify you, e.g. GPG configuration, email +;; clients, file templates and snippets. It is optional. +;; (setq user-full-name "John Doe" +;; user-mail-address "john@doe.com") + +;; Doom exposes five (optional) variables for controlling fonts in Doom: +;; +;; - `doom-font' -- the primary font to use +;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) +;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for +;; presentations or streaming. +;; - `doom-symbol-font' -- for symbols +;; - `doom-serif-font' -- for the `fixed-pitch-serif' face +;; +;; See 'C-h v doom-font' for documentation and more examples of what they +;; accept. For example: +;; +(setq doom-font (font-spec :family "Iosevka" :size 15 :weight 'semi-light) + doom-variable-pitch-font (font-spec :family "Iosevka" :size 13)) +;; +;; If you or Emacs can't find your font, use 'M-x describe-font' to look them +;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to +;; refresh your font settings. If Emacs still can't find your font, it likely +;; wasn't installed correctly. Font issues are rarely Doom issues! + +;; There are two ways to load a theme. Both assume the theme is installed and +;; available. You can either set `doom-theme' or manually load a theme with the +;; `load-theme' function. This is the default: +(setq doom-theme 'gruber-darker) + + +;; This determines the style of line numbers in effect. If set to `nil', line +;; numbers are disabled. For relative line numbers, set this to `relative'. +(setq display-line-numbers-type 'relative) + +;; If you use `org' and don't want your org files in the default location below, +;; change `org-directory'. It must be set before org loads! +(setq org-directory "~/org/") + + +;; Whenever you reconfigure a package, make sure to wrap your config in an +;; `with-eval-after-load' block, otherwise Doom's defaults may override your +;; settings. E.g. +;; +;; (with-eval-after-load 'PACKAGE +;; (setq x y)) +;; +;; The exceptions to this rule: +;; +;; - Setting file/directory variables (like `org-directory') +;; - Setting variables which explicitly tell you to set them before their +;; package is loaded (see 'C-h v VARIABLE' to look them up). +;; - Setting doom variables (which start with 'doom-' or '+'). +;; +;; Here are some additional functions/macros that will help you configure Doom. +;; +;; - `load!' for loading external *.el files relative to this one +;; - `add-load-path!' for adding directories to the `load-path', relative to +;; this file. Emacs searches the `load-path' when you load packages with +;; `require' or `use-package'. +;; - `map!' for binding new keys +;; +;; To get information about any of these functions/macros, move the cursor over +;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). +;; This will open documentation for it, including demos of how they are used. +;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, +;; etc). +;; +;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how +;; they are implemented. + +(defun toggle-window-split () + (interactive) + (if (= (count-windows) 2) + (let* ((this-win-buffer (window-buffer)) + (next-win-buffer (window-buffer (next-window))) + (this-win-edges (window-edges (selected-window))) + (next-win-edges (window-edges (next-window))) + (this-win-2nd (not (and (<= (car this-win-edges) + (car next-win-edges)) + (<= (cadr this-win-edges) + (cadr next-win-edges))))) + (splitter + (if (= (car this-win-edges) + (car (window-edges (next-window)))) + 'split-window-horizontally + 'split-window-vertically))) + (delete-other-windows) + (let ((first-win (selected-window))) + (funcall splitter) + (if this-win-2nd (other-window 1)) + (set-window-buffer (selected-window) this-win-buffer) + (set-window-buffer (next-window) next-win-buffer) + (select-window first-win) + (if this-win-2nd (other-window 1)))))) + +(global-set-key (kbd "C-t") 'toggle-window-split) + +(setq compile-command "") + +;; Comment +(map! "C-;" 'comment-dwim-2) + +;; Duplicate line + +(defun duplicate-line () + "Duplicate current line" + (interactive) + (let ((column (- (point) (pos-bol))) + (line (let ((s (thing-at-point 'line t))) + (if s (string-remove-suffix "\n" s) "")))) + (move-end-of-line 1) + (newline) + (insert line) + (move-beginning-of-line 1) + (forward-char column))) + +(global-set-key (kbd "C-,") 'duplicate-line) + +;; Magit +(map! :leader "m s" 'magit-status) + +;; Multi cursors +(map! "C-S-n" 'mc/mark-next-like-this) +(map! "C-S-p" 'mc/mark-previous-like-this) + +(setq tramp-auto-save-directory "/tmp") + +;; Move text +(map! "M-p" 'move-text-up) +(map! "M-n" 'move-text-down) + +;; LSP +(global-set-key (kbd "M-;") 'xref-find-definitions) + +(use-package lsp-mode + :hook ((c-mode + c++-mode + python-mode + rust-mode + tsx-ts-mode + typescript-ts-mode + )) + :custom + (lsp-keymap-prefix "s-i") + (lsp-keep-workspace-alive nil) + (lsp-enable-xref t) + (lsp-enable-on-type-formatting nil) + ) + +(setq gc-cons-threshold (* 100 1024 1024) + read-process-output-max (* 1024 1024) + treemacs-space-between-root-nodes nil + company-idle-delay 0.5 + company-minimum-prefix-length 1 + lsp-idle-delay 0.1) + +(with-eval-after-load 'lsp-mode + (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration) + (yas-global-mode)) + +;; Dired +;; (setq dired-omit-files +;; (concat dired-omit-files "\\|^\\..+$")) +(setq-default dired-dwim-target t) +(setq dired-listing-switches "-alh") + +;; Tree sitter +(after! treesit + (setq treesit-language-source-alist + '((typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src" nil nil) + (tsx "https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src" nil nil)))) diff --git a/.config/doom/init.el b/.config/doom/init.el new file mode 100644 index 0000000..9cfa6dd --- /dev/null +++ b/.config/doom/init.el @@ -0,0 +1,199 @@ +;;; init.el -*- lexical-binding: t; -*- + +;; This file controls what Doom modules are enabled and what order they load +;; in. Remember to run 'doom sync' after modifying it! + +;; NOTE: Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's +;; documentation. There you'll find a link to Doom's Module Index where all of +;; our modules are listed, including what flags they support. + +;; NOTE: Move your cursor over a module's name (or its flags) and press 'K' (or +;; 'C-c c k' for non-vim users) to view its documentation. This works on flags +;; as well (those symbols that start with a plus). +;; +;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its +;; directory (for easy access to its source code). + +(doom! :input + ;;bidi ; (tfel ot) thgir etirw uoy gnipleh + ;;chinese + ;;japanese + ;;layout ; auie,ctsrnm is the superior home row + + :completion + company ; the ultimate code completion backend + ;;(corfu +orderless) ; complete with cap(f), cape and a flying feather! + ;;helm ; the *other* search engine for love and life + ido ; the other *other* search engine... + ;;ivy ; a search engine for love and life + ;;vertico ; the search engine of the future + + :ui + ;;deft ; notational velocity for Emacs + doom ; what makes DOOM look the way it does + dashboard ; a nifty splash screen for Emacs + ;;doom-quit ; DOOM quit-message prompts when you quit Emacs + ;;(emoji +unicode) ; 🙂 + hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + ;;indent-guides ; highlighted indent columns + ;;ligatures ; ligatures and symbols to make your code pretty again + minimap ; show a map of the code on the side + modeline ; snazzy, Atom-inspired modeline, plus API + ;;nav-flash ; blink cursor line after big motions + neotree ; a project drawer, like NERDTree for vim + ophints ; highlight the region an operation acts on + (popup +defaults) ; tame sudden yet inevitable temporary windows + ;;smooth-scroll ; So smooth you won't believe it's not butter + ;;tabs ; a tab bar for Emacs + ;;treemacs ; a project drawer, like neotree but cooler + ;;unicode ; extended unicode support for various languages + (vc-gutter +pretty) ; vcs diff in the fringe + vi-tilde-fringe ; fringe tildes to mark beyond EOB + ;;window-select ; visually switch windows + workspaces ; tab emulation, persistence & separate workspaces + ;;zen ; distraction-free coding or writing + + :editor + ;; (evil +everywhere); come to the dark side, we have cookies + file-templates ; auto-snippets for empty files + fold ; (nigh) universal code folding + (format +onsave) ; automated prettiness + ;;god ; run Emacs commands without modifier keys + ;;lispy ; vim for lisp, for people who don't like vim + multiple-cursors ; editing in many places at once + ;;objed ; text object editing for the innocent + ;;parinfer ; turn lisp into python, sort of + ;;rotate-text ; cycle region at point between text candidates + snippets ; my elves. They type so I don't have to + (whitespace +guess +trim) ; a butler for your whitespace + ;;word-wrap ; soft wrapping with language-aware indent + + :emacs + ;;dired ; making dired pretty [functional] + electric ; smarter, keyword-based electric-indent + ;;eww ; the internet is gross + ;;ibuffer ; interactive buffer management + tramp ; remote files at your arthritic fingertips + undo ; persistent, smarter undo for your inevitable mistakes + vc ; version-control and Emacs, sitting in a tree + + :term + ;;eshell ; the elisp shell that works everywhere + ;;shell ; simple shell REPL for Emacs + ;;term ; basic terminal emulator for Emacs + ;;vterm ; the best terminal emulation in Emacs + + :checkers + syntax ; tasing you for every semicolon you forget + ;;(spell +flyspell) ; tasing you for misspelling mispelling + ;;grammar ; tasing grammar mistake every you make + + :tools + ansible + ;;biblio ; Writes a PhD for you (citation needed) + ;;collab ; buffers with friends + debugger ; stepping through code, to help you add bugs + ;;direnv + docker + editorconfig ; let someone else argue about tabs vs spaces + ;;ein ; tame Jupyter notebooks with emacs + (eval +overlay) ; run code, run (also, repls) + lookup ; navigate your code and its documentation + ;;llm ; when I said you needed friends, I didn't mean... + (lsp +eglot) ; M-x vscode + magit ; a git porcelain for Emacs + make ; run make tasks from Emacs + ;;pass ; password manager for nerds + ;;pdf ; pdf enhancements + terraform ; infrastructure as code + tmux ; an API for interacting with tmux + tree-sitter ; syntax and parsing, sitting in a tree... + upload ; map local to remote projects via ssh/ftp + + :os + (:if (featurep :system 'macos) macos) ; improve compatibility with macOS + ;;tty ; improve the terminal Emacs experience + + :lang + ;;ada ; In strong typing we (blindly) trust + ;;(agda +local) ; types of types of types of types... + ;;beancount ; mind the GAAP + (cc +lsp) ; C > C++ == 1 + ;;clojure ; java with a lisp + ;;common-lisp ; if you've seen one lisp, you've seen them all + ;;coq ; proofs-as-programs + ;;crystal ; ruby at the speed of c + ;;csharp ; unity, .NET, and mono shenanigans + data ; config/data formats + ;;(dart +flutter) ; paint ui and not much else + ;;dhall + ;;elixir ; erlang done right + ;;elm ; care for a cup of TEA? + emacs-lisp ; drown in parentheses + ;;erlang ; an elegant language for a more civilized age + ;;ess ; emacs speaks statistics + ;;factor + ;;faust ; dsp, but you get to keep your soul + ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) + ;;fsharp ; ML stands for Microsoft's Language + ;;fstar ; (dependent) types and (monadic) effects and Z3 + ;;gdscript ; the language you waited for + (go +lsp) ; the hipster dialect + ;;(graphql +lsp) ; Give queries a REST + ;;(haskell +lsp) ; a language that's lazier than I am + ;;hy ; readability of scheme w/ speed of python + ;;idris ; a language you can depend on + json ; At least it ain't XML + ;;janet ; Fun fact: Janet is me! + ;;(java +lsp) ; the poster child for carpal tunnel syndrome + (javascript +lsp +tree-sitter) ; all(hope(abandon(ye(who(enter(here)))))) + ;;julia ; a better, faster MATLAB + ;;kotlin ; a better, slicker Java(Script) + latex ; writing papers in Emacs has never been so fun + ;;lean ; for folks with too much to prove + ;;ledger ; be audit you can be + ;;lua ; one-based indices? one-based indices + markdown ; writing docs for people to ignore + ;;nim ; python + lisp at the speed of c + ;;nix ; I hereby declare "nix geht mehr!" + ;;ocaml ; an objective camel + ;;odin ; C, minus its footguns + org ; organize your plain life in plain text + ;;php ; perl's insecure younger brother + ;;plantuml ; diagrams for confusing people more + graphviz ; diagrams for confusing yourself even more + ;;purescript ; javascript, but functional + python ; beautiful is better than ugly + ;;qt ; the 'cutest' gui framework ever + ;;racket ; a DSL for DSLs + ;;raku ; the artist formerly known as perl6 + rest ; Emacs as a REST client + rst ; ReST in peace + (ruby) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} + (rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;;scala ; java, but good + ;;(scheme +guile) ; a fully conniving family of lisps + sh ; she sells {ba,z,fi}sh shells on the C xor + ;;sml + ;;solidity ; do you need a blockchain? No. + ;;swift ; who asked for emoji variables? + ;;terra ; Earth and Moon in alignment for performance. + ;;web ; the tubes + yaml ; JSON, but readable + ;;zig ; C, but simpler + + :email + ;;(mu4e +org +gmail) + ;;notmuch + ;;(wanderlust +gmail) + + :app + calendar + ;;emms + everywhere ; *leave* Emacs!? You must be joking + irc ; how neckbeards socialize + ;;(rss +org) ; emacs as an RSS reader + + :config + ;;literate + (default +bindings +smartparens)) diff --git a/.config/doom/packages.el b/.config/doom/packages.el new file mode 100644 index 0000000..880883b --- /dev/null +++ b/.config/doom/packages.el @@ -0,0 +1,61 @@ +;; -*- no-byte-compile: t; -*- +;;; $DOOMDIR/packages.el + +;; To install a package: +;; +;; 1. Declare them here in a `package!' statement, +;; 2. Run 'doom sync' in the shell, +;; 3. Restart Emacs. +;; +;; Use 'C-h f package\!' to look up documentation for the `package!' macro. + + +;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: +;; (package! some-package) + +;; To install a package directly from a remote git repo, you must specify a +;; `:recipe'. You'll find documentation on what `:recipe' accepts here: +;; https://github.com/radian-software/straight.el#the-recipe-format +;; (package! another-package +;; :recipe (:host github :repo "username/repo")) + +;; If the package you are trying to install does not contain a PACKAGENAME.el +;; file, or is located in a subdirectory of the repo, you'll need to specify +;; `:files' in the `:recipe': +;; (package! this-package +;; :recipe (:host github :repo "username/repo" +;; :files ("some-file.el" "src/lisp/*.el"))) + +;; If you'd like to disable a package included with Doom, you can do so here +;; with the `:disable' property: +;; (package! builtin-package :disable t) + +;; You can override the recipe of a built in package without having to specify +;; all the properties for `:recipe'. These will inherit the rest of its recipe +;; from Doom or MELPA/ELPA/Emacsmirror: +;; (package! builtin-package :recipe (:nonrecursive t)) +;; (package! builtin-package-2 :recipe (:repo "myfork/package")) + +;; Specify a `:branch' to install a package from a particular branch or tag. +;; This is required for some packages whose default branch isn't 'master' (which +;; our package manager can't deal with; see radian-software/straight.el#279) +;; (package! builtin-package :recipe (:branch "develop")) + +;; Use `:pin' to specify a particular commit to install. +;; (package! builtin-package :pin "1a2b3c4d5e") + + +;; Doom's packages are pinned to a specific commit and updated from release to +;; release. The `unpin!' macro allows you to unpin single packages... +;; (unpin! pinned-package) +;; ...or multiple packages +;; (unpin! pinned-package another-pinned-package) +;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) +;; (unpin! t) + +(package! gruber-darker-theme) +(package! comment-dwim-2) +(package! move-text) +(package! lsp-mode) +(package! lsp-treemacs) +(package! which-key) diff --git a/.emacs b/.emacs deleted file mode 100644 index 5e97ba8..0000000 --- a/.emacs +++ /dev/null @@ -1,514 +0,0 @@ -(setq custom-file "~/.emacs.custom.el") -(package-initialize) - -(add-to-list 'load-path "~/.emacs.local/") - -(load "~/.emacs.rc/rc.el") - -(load "~/.emacs.rc/misc-rc.el") - -;;; Appearance - -(add-to-list 'default-frame-alist `(font . "Iosevka-12")) - -(tool-bar-mode 0) -(menu-bar-mode 0) -(scroll-bar-mode 0) -(column-number-mode 1) -(show-paren-mode 1) - -(rc/require-theme 'gruber-darker) -;; (rc/require-theme 'zenburn) -;; (load-theme 'adwaita t) - -(rc/require 'all-the-icons 'all-the-icons-dired) - - -(eval-after-load 'zenburn - (set-face-attribute 'line-number nil :inherit 'default)) - -(defun toggle-window-split () - (interactive) - (if (= (count-windows) 2) - (let* ((this-win-buffer (window-buffer)) - (next-win-buffer (window-buffer (next-window))) - (this-win-edges (window-edges (selected-window))) - (next-win-edges (window-edges (next-window))) - (this-win-2nd (not (and (<= (car this-win-edges) - (car next-win-edges)) - (<= (cadr this-win-edges) - (cadr next-win-edges))))) - (splitter - (if (= (car this-win-edges) - (car (window-edges (next-window)))) - 'split-window-horizontally - 'split-window-vertically))) - (delete-other-windows) - (let ((first-win (selected-window))) - (funcall splitter) - (if this-win-2nd (other-window 1)) - (set-window-buffer (selected-window) this-win-buffer) - (set-window-buffer (next-window) next-win-buffer) - (select-window first-win) - (if this-win-2nd (other-window 1)))))) - -(global-set-key (kbd "C-t") 'toggle-window-split) -(global-set-key (kbd "C-") 'next-window-any-frame) -(global-set-key (kbd "C-") 'previous-window-any-frame) - -;;; ido -(rc/require 'smex 'ido-completing-read+) - -(require 'ido-completing-read+) - -(ido-mode 1) -(ido-everywhere 1) -(ido-ubiquitous-mode 1) -(setq ido-auto-merge-work-directories-length -1) - -(global-set-key (kbd "M-x") 'smex) -(global-set-key (kbd "C-c C-c M-x") 'execute-extended-command) - -(setq compile-command "") - -;;; comment - -(rc/require 'comment-dwim-2) - -(global-set-key (kbd "C-;") 'comment-dwim-2) - -;;; c-mode -(setq-default c-basic-offset 4 - c-default-style '((java-mode . "java") - (awk-mode . "awk") - (other . "bsd"))) - -(add-hook 'c-mode-hook (lambda () - (interactive) - (c-toggle-comment-style -1))) - -;;; Paredit -(rc/require 'paredit) - -(defun rc/turn-on-paredit () - (interactive) - (paredit-mode 1)) - -(add-hook 'emacs-lisp-mode-hook 'rc/turn-on-paredit) -(add-hook 'clojure-mode-hook 'rc/turn-on-paredit) -(add-hook 'lisp-mode-hook 'rc/turn-on-paredit) -(add-hook 'common-lisp-mode-hook 'rc/turn-on-paredit) -(add-hook 'scheme-mode-hook 'rc/turn-on-paredit) -(add-hook 'racket-mode-hook 'rc/turn-on-paredit) - -;;; Emacs lisp -(add-hook 'emacs-lisp-mode-hook - '(lambda () - (local-set-key (kbd "C-c C-j") - (quote eval-print-last-sexp)))) -(add-to-list 'auto-mode-alist '("Cask" . emacs-lisp-mode)) - -;;; uxntal-mode - -(rc/require 'uxntal-mode) - -;;; Haskell mode -(rc/require 'haskell-mode) - -(setq haskell-process-type 'cabal-new-repl) -(setq haskell-process-log t) - -(add-hook 'haskell-mode-hook 'haskell-indent-mode) -(add-hook 'haskell-mode-hook 'interactive-haskell-mode) -(add-hook 'haskell-mode-hook 'haskell-doc-mode) - -(require 'fasm-mode) -(add-to-list 'auto-mode-alist '("\\.asm\\'" . fasm-mode)) - -(require 'llvm-mode) -(add-to-list 'auto-mode-alist '("\\.ll\\'" . llvm-mode)) - -(require 'simpc-mode) -;; (add-to-list 'auto-mode-alist '("\\.[hc]\\(pp\\)?\\'" . simpc-mode)) - -(setq path-to-ctags "/usr/bin/ctags") -(defun create-tags (dir-name) - "Create tags file." - (interactive "Directory: ") - (shell-command - (format "%s -f TAGS -e -R %s" path-to-ctags (directory-file-name dir-name))) - ) - -(global-set-key (kbd "M-;") 'xref-find-definitions) - -(rc/require 'ess) -(rc/require 'polymode) -(rc/require 'poly-R) - -;;; Whitespace mode -(defun rc/set-up-whitespace-handling () - (interactive) - (whitespace-mode 0) - (add-to-list 'write-file-functions 'delete-trailing-whitespace)) - -(add-hook 'tuareg-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'c++-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'c-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'simpc-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'emacs-lisp-mode 'rc/set-up-whitespace-handling) -(add-hook 'java-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'lua-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'rust-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'scala-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'markdown-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'haskell-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'python-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'erlang-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'asm-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'fasm-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'go-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'nim-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'yaml-mode-hook 'rc/set-up-whitespace-handling) -(add-hook 'porth-mode-hook 'rc/set-up-whitespace-handling) - -;;; display-line-numbers-mode -(when (version<= "26.0.50" emacs-version) - (global-display-line-numbers-mode)) -(setq display-line-numbers-type 'relative) - -;;; magit -;; magit requres this lib, but it is not installed automatically on -;; Windows. -(rc/require 'cl-lib) -(rc/require 'magit) - -(setq magit-auto-revert-mode nil) - -(global-set-key (kbd "C-c m s") 'magit-status) -(global-set-key (kbd "C-c m l") 'magit-log) - -;;; multiple cursors -(rc/require 'multiple-cursors) - -(global-set-key (kbd "C-S-c C-S-c") 'mc/edit-lines) -(global-set-key (kbd "C-S-n") 'mc/mark-next-like-this) -(global-set-key (kbd "C-S-p") 'mc/mark-previous-like-this) -(global-set-key (kbd "C-c C-<") 'mc/mark-all-like-this) -(global-set-key (kbd "C-!") 'mc/skip-to-next-like-this) -(global-set-key (kbd "C-:") 'mc/skip-to-previous-like-this) - -;;; markdown -(rc/require 'markdown-mode 'impatient-mode 'simple-httpd) -(add-to-list 'auto-mode-alist '("\\.md\\'" . gfm-mode)) -(setq markdown-command "pandoc -t html5") - -(setq httpd-port 7070) -(setq httpd-host (system-name)) - -(defun github-markdown-filter (buffer) - (princ - (with-temp-buffer - (let ((tmp (buffer-name))) - (set-buffer buffer) - (set-buffer (markdown tmp)) - (format "Markdown preview -
%s
" (buffer-string)))) - (current-buffer))) - -(defun github-markdown-preview () - "Preview markdown with github style" - (interactive) - (unless (process-status "httpd") - (httpd-start)) - (impatient-mode) - (imp-set-user-filter 'github-markdown-filter) - (imp-visit-buffer)) - -;;; dired -(require 'dired-x) -(setq dired-omit-files - (concat dired-omit-files "\\|^\\..+$")) -(setq-default dired-dwim-target t) -(setq dired-listing-switches "-alh") -(setq dired-mouse-drag-files t) - -(global-set-key (kbd "C-d") 'dired) - -;;; helmn -(rc/require 'helm) - -(global-set-key (kbd "C-c h t") 'helm-cmd-t) - -;;; yasnippet -(rc/require 'yasnippet) - -(require 'yasnippet) - -(setq yas/triggers-in-field nil) -(setq yas-snippet-dirs '("~/.emacs.snippets/")) - -(yas-global-mode 1) - -;;; word-wrap -(defun rc/enable-word-wrap () - (interactive) - (toggle-word-wrap 1)) - -(add-hook 'markdown-mode-hook 'rc/enable-word-wrap) - -;;; nxml -(add-to-list 'auto-mode-alist '("\\.html\\'" . nxml-mode)) -(add-to-list 'auto-mode-alist '("\\.xsd\\'" . nxml-mode)) -(add-to-list 'auto-mode-alist '("\\.ant\\'" . nxml-mode)) - -;;; Makefile -(add-to-list 'auto-mode-alist '("\\make.config\\'" . makefile-mode)) - -;;; tramp -;;; http://stackoverflow.com/questions/13794433/how-to-disable-autosave-for-tramp-buffers-in-emacs -(setq tramp-auto-save-directory "/tmp") - -;;; powershell -(rc/require 'powershell) -(add-to-list 'auto-mode-alist '("\\.ps1\\'" . powershell-mode)) -(add-to-list 'auto-mode-alist '("\\.psm1\\'" . powershell-mode)) - -;;; eldoc mode -(defun rc/turn-on-eldoc-mode () - (interactive) - (eldoc-mode 1)) - -(add-hook 'emacs-lisp-mode-hook 'rc/turn-on-eldoc-mode) - -;;; Company -(rc/require 'company) -(require 'company) - -(global-company-mode) - -;; (add-hook 'tuareg-mode-hook -;; (lambda () -;; (interactive) -;; (company-mode 0))) - -;;; Typescript -(rc/require 'typescript-mode) -(add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-mode)) -(add-to-list 'auto-mode-alist '("\\.tsx\\'" . tsx-ts-mode)) - -(use-package treesit - :mode (("\\.tsx\\'" . tsx-ts-mode) - ("\\.js\\'" . typescript-ts-mode) - ("\\.mjs\\'" . typescript-ts-mode) - ("\\.mts\\'" . typescript-ts-mode) - ("\\.cjs\\'" . typescript-ts-mode) - ("\\.ts\\'" . typescript-ts-mode) - ("\\.jsx\\'" . tsx-ts-mode) - ("\\.json\\'" . json-ts-mode) - ("\\.Dockerfile\\'" . dockerfile-ts-mode) - ("\\.prisma\\'" . prisma-ts-mode) - ;; More modes defined here... - ) - :preface - (defun os/setup-install-grammars () - "Install Tree-sitter grammars if they are absent." - (interactive) - (dolist (grammar - '((css . ("https://github.com/tree-sitter/tree-sitter-css" "v0.20.0")) - (bash "https://github.com/tree-sitter/tree-sitter-bash") - (html . ("https://github.com/tree-sitter/tree-sitter-html" "v0.20.1")) - (javascript . ("https://github.com/tree-sitter/tree-sitter-javascript" "v0.21.2" "src")) - (json . ("https://github.com/tree-sitter/tree-sitter-json" "v0.20.2")) - (python . ("https://github.com/tree-sitter/tree-sitter-python" "v0.20.4")) - (go "https://github.com/tree-sitter/tree-sitter-go" "v0.20.0") - (markdown "https://github.com/ikatyang/tree-sitter-markdown") - (make "https://github.com/alemuller/tree-sitter-make") - (elisp "https://github.com/Wilfred/tree-sitter-elisp") - (cmake "https://github.com/uyha/tree-sitter-cmake") - (toml "https://github.com/tree-sitter/tree-sitter-toml") - (tsx . ("https://github.com/tree-sitter/tree-sitter-typescript" "v0.20.3" "tsx/src")) - (typescript . ("https://github.com/tree-sitter/tree-sitter-typescript" "v0.20.3" "typescript/src")) - (yaml . ("https://github.com/ikatyang/tree-sitter-yaml" "v0.5.0")) - (prisma "https://github.com/victorhqc/tree-sitter-prisma"))) - (add-to-list 'treesit-language-source-alist grammar) - ;; Only install `grammar' if we don't already have it - ;; installed. However, if you want to *update* a grammar then - ;; this obviously prevents that from happening. - (unless (treesit-language-available-p (car grammar)) - (treesit-install-language-grammar (car grammar))))) - - ;; Optional, but recommended. Tree-sitter enabled major modes are - ;; distinct from their ordinary counterparts. - ;; - ;; You can remap major modes with `major-mode-remap-alist'. Note - ;; that this does *not* extend to hooks! Make sure you migrate them - ;; also - (dolist (mapping - '((css-mode . css-ts-mode) - (typescript-mode . typescript-ts-mode) - (js-mode . typescript-ts-mode) - (js2-mode . typescript-ts-mode) - (css-mode . css-ts-mode) - (json-mode . json-ts-mode) - (js-json-mode . json-ts-mode))) - (add-to-list 'major-mode-remap-alist mapping)) - :config - (os/setup-install-grammars)) - -;;; Tide -(rc/require 'tide) - -(defun rc/turn-on-tide-and-flycheck () ;Flycheck is a dependency of tide - (interactive) - (tide-setup) - (flycheck-mode 1)) - -(add-hook 'typescript-mode-hook 'rc/turn-on-tide-and-flycheck) - -;;; Proof general -(rc/require 'proof-general) -(add-hook 'coq-mode-hook - '(lambda () - (local-set-key (kbd "C-c C-q C-n") - (quote proof-assert-until-point-interactive)))) - -;;; LaTeX mode -(add-hook 'tex-mode-hook - (lambda () - (interactive) - (add-to-list 'tex-verbatim-environments "code"))) - -(setq font-latex-fontify-sectioning 'color) - -;;; Move Text -(rc/require 'move-text) -(global-set-key (kbd "M-p") 'move-text-up) -(global-set-key (kbd "M-n") 'move-text-down) - -;;; Ebisp -(add-to-list 'auto-mode-alist '("\\.ebi\\'" . lisp-mode)) - -;;; Go -(rc/require 'go-mode) -;(add-to-list 'compilation-error-regexp-alist 'gotest) -;(add-to-list 'compilation-error-regexp-alist-alist '(gotest "^ \\(\\([^:\n]+\\):\\([0-9]+\\)\\)" 2 3 nil nil 1)) -;(add-to-list 'compilation-error-regexp-alist 'gotraceback) -;(add-to-list 'compilation-error-regexp-alist-alist '(gotraceback "^\t\\(\\([^\n\t]+\\):\\([0-9]+\\)\\)\\( \\+0x[0-9a-f]+\\)?$" 2 3 nil (nil . 4) 1)) - -;;; OCaml -(rc/require 'tuareg) - -;;; ASM -(defun my-asm-mode-hook () - (local-unset-key (vector asm-comment-char)) - (setq tab-always-indent (default-value 'tab-always-indent)) - (setq comment-start "//")) - -(add-hook 'asm-mode-hook #'my-asm-mode-hook) - -;;; Clang format -(rc/require 'clang-format) - -(global-set-key (kbd "C-o") 'clang-format-buffer) - -;;; Lsp-mode -(rc/require 'lsp-mode - 'lsp-treemacs - 'helm-lsp - 'projectile - 'hydra - 'flycheck - 'company - 'avy - 'which-key - 'helm-xref) - -(which-key-mode) -(use-package lsp-mode - :ensure t - :hook ((c-mode - c++-mode - python-mode - tsx-ts-mode - typescript-ts-mode - )) - :custom - (lsp-keymap-prefix "s-i") - (lsp-keep-workspace-alive nil) - (lsp-enable-xref t) - (lsp-enable-on-type-formatting nil) - ) - -;;; zoxide -(rc/require 'zoxide) -(add-hook 'dired-after-readin-hook 'zoxide-add) - -(setq gc-cons-threshold (* 100 1024 1024) - read-process-output-max (* 1024 1024) - treemacs-space-between-root-nodes nil - company-idle-delay 0.5 - company-minimum-prefix-length 1 - lsp-idle-delay 0.1) - -(with-eval-after-load 'lsp-mode - (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration) - (yas-global-mode)) - -;;; Packages that don't require configuration -(rc/require - 'scala-mode - 'd-mode - 'yaml-mode - 'glsl-mode - 'lua-mode - 'less-css-mode - 'graphviz-dot-mode - 'clojure-mode - 'cmake-mode - 'rust-mode - 'csharp-mode - 'nim-mode - 'jinja2-mode - 'purescript-mode - 'nix-mode - 'dockerfile-mode - 'toml-mode - 'nginx-mode - 'kotlin-mode - 'php-mode - 'racket-mode - 'qml-mode - 'ag - 'elpy - 'typescript-mode - 'rfc-mode - 'sml-mode - ) - -(defun astyle-buffer (&optional justify) - (interactive) - (let ((saved-line-number (line-number-at-pos))) - (shell-command-on-region - (point-min) - (point-max) - "astyle --style=kr" - nil - t) - (goto-line saved-line-number))) - -(add-hook 'simpc-mode-hook - (lambda () - (interactive) - (setq-local fill-paragraph-function 'astyle-buffer))) - -(require 'compile) - -;; pascalik.pas(24,44) Error: Can't evaluate constant expression - -compilation-error-regexp-alist-alist - -(add-to-list 'compilation-error-regexp-alist - '("\\([a-zA-Z0-9\\.]+\\)(\\([0-9]+\\)\\(,\\([0-9]+\\)\\)?) \\(Warning:\\)?" - 1 2 (4) (5))) - -(load-file custom-file) diff --git a/.emacs.local/fasm-mode.el b/.emacs.local/fasm-mode.el deleted file mode 100644 index 0e2224c..0000000 --- a/.emacs.local/fasm-mode.el +++ /dev/null @@ -1,480 +0,0 @@ -;;; fasm-mode.el --- Fasm major mode - -;; Author: Fanael Linithien -;; URL: https://github.com/Fanael/fasm-mode -;; Version: 0.1.8 - -;; This file is NOT part of GNU Emacs. - -;; Copyright (c) 2013, Fanael Linithien -;; All rights reserved. - -;; Redistribution and use in source and binary forms, with or without -;; modification, are permitted provided that the following conditions are -;; met: - -;; * Redistributions of source code must retain the above copyright -;; notice, this list of conditions and the following disclaimer. -;; * Redistributions in binary form must reproduce the above copyright -;; notice, this list of conditions and the following disclaimer in the -;; documentation and/or other materials provided with the distribution. -;; * Neither the name of the copyright holder(s) nor the names of any -;; contributors may be used to endorse or promote products derived from -;; this software without specific prior written permission. - -;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -;; IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -;; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER -;; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -;;; Code: - -(defvar fasm-mode-syntax-table - (let ((syntaxtable (make-syntax-table))) - (modify-syntax-entry ?_ "_" syntaxtable) - (modify-syntax-entry ?. "_" syntaxtable) - (modify-syntax-entry ?$ "_" syntaxtable) - (modify-syntax-entry ?@ "_" syntaxtable) - (modify-syntax-entry ?~ "_" syntaxtable) - (modify-syntax-entry ?? "_" syntaxtable) - (modify-syntax-entry ?! "_" syntaxtable) - (modify-syntax-entry ?= "." syntaxtable) - (modify-syntax-entry ?+ "." syntaxtable) - (modify-syntax-entry ?- "." syntaxtable) - (modify-syntax-entry ?* "." syntaxtable) - (modify-syntax-entry ?/ "." syntaxtable) - (modify-syntax-entry ?\\ "." syntaxtable) - (modify-syntax-entry ?\; "<" syntaxtable) - (modify-syntax-entry ?\n ">" syntaxtable) - (modify-syntax-entry ?\" "\"" syntaxtable) - (modify-syntax-entry ?\' "\"" syntaxtable) - syntaxtable) - "Syntax table for FASM mode.") - -(defvar fasm-mode-map - (let ((map (make-sparse-keymap))) - (define-key map (kbd "") (lambda () (interactive) (insert ?\n))) - map) - "Local keymap for FASM mode.") - -(defvar fasm-basic-offset 2 - "Offset for FASM mode indentation.") - -(eval-when-compile - (defun fasm--regexp-from-keywords (&rest keywords) - (regexp-opt keywords 'symbols))) - -(defconst fasm-font-lock-keywords - `(;; Numbers - ("\\_<[01]+b\\_>" . 'font-lock-constant-face) - ("\\_<[0-9][0-9a-fA-F]*h\\_>" . 'font-lock-constant-face) - ("\\_<\\(?:0x\\|\\$\\)[0-9a-fA-F]+\\_>" . 'font-lock-constant-face) - ("\\_<[0-9]+\\(?:\\.[0-9]*\\)?\\(?:e[+-]?[0-9]+\\)?\\_>" - . 'font-lock-constant-face) - ;; Types - (,(eval-when-compile - (fasm--regexp-from-keywords - "xx" - "xxxx" - "preserve" - "byte" "word" "dword" "fword" "pword" "qword" "tbyte" "tword" - "dqword" "xword" "qqword" "yword" "db" "rb" "dw" "du" "rw" "dd" "rd" - "df" "dp" "rf" "rp" "dq" "rq" "dt" "rt")) . 'font-lock-type-face) - ;; Directives and operators - (,(eval-when-compile - (fasm--regexp-from-keywords - "labeling" - "mod" "rva" "plt" "align" "as" "at" "defined" "dup" "eq" "eqtype" - "from" "ptr" "relativeto" "used" "binary" "export" "fixups" "import" - "native" "static" "console" "dynamic" "efiboot" "linkinfo" "readable" - "resource" "writable" "shareable" "writeable" "efiruntime" - "executable" "linkremove" "discardable" "interpreter" "notpageable" - - "if" - "end" - "tail_call" - "finish" ;; as end - - "literal" - "address" - "branch" - "false?branch" - - "err" "org" "data" "else" "heap" "load" "align" "break" - "entry" "extrn" "label" "stack" "store" "times" "while" "assert" - "format" "public" "repeat" "display" "section" "segment" "virtual" - "file")) . 'font-lock-keyword-face) - ;; Preprocessor directives - (,(eval-when-compile - (fasm--regexp-from-keywords - "define" "include" "irp" "irps" "macro" "match" "purge" "rept" - "restore" "restruc" "struc" "common" "forward" "local" "reverse" - "equ" "fix")) . 'font-lock-preprocessor-face) - ;; Registers - (,(eval-when-compile - (fasm--regexp-from-keywords - "al" "bl" "cl" "dl" "spl" "bpl" "sil" "dil" "r8b" "r9b" "r10b" "r11b" - "r12b" "r13b" "r14b" "r15b" "ah" "bh" "ch" "dh" "ax" "bx" "cx" "dx" - "sp" "bp" "si" "di" "r8w" "r9w" "r10w" "r11w" "r12w" "r13w" "r14w" - "r15w" "eax" "ebx" "ecx" "edx" "esp" "ebp" "esi" "edi" "r8d" "r9d" - "r10d" "r11d" "r12d" "r13d" "r14d" "r15d" - - "rax" "rbx" "rcx" "rdx" "rsp" "rbp" "rsi" "rdi" - "r8" "r9" "r10" "r11" "r12" "r13" "r14" "r15" - - ;; "xax" "xbx" "xcx" "xdx" "xsp" "xbp" "xsi" "xdi" - ;; "x8" "x9" "x10" "x11" "x12" "x13" "x14" "x15" - - "rip" "es" "cs" "ss" "ds" "fs" "gs" "cr0" "cr2" "cr3" "cr4" "dr0" - "dr1" "dr2" "dr3" "st0" "st1" "st2" "st3" "st4" "st5" "st6" "st7" - "mm0" "mm1" "mm2" "mm3" "mm4" "mm5" "mm6" "mm7" "xmm0" "xmm1" "xmm2" - "xmm3" "xmm4" "xmm5" "xmm6" "xmm7" "xmm8" "xmm9" "xmm10" "xmm11" - "xmm12" "xmm13" "xmm14" "xmm15" "ymm0" "ymm1" "ymm2" "ymm3" "ymm4" - "ymm5" "ymm6" "ymm7" "ymm8" "ymm9" "ymm10" "ymm11" "ymm12" "ymm13" - "ymm14" "ymm15")) . 'font-lock-variable-name-face) - ;; Instructions - (,(eval-when-compile - (fasm--regexp-from-keywords - "bt" "in" "ja" "jb" "jc" "je" "jg" "jl" "jo" "jp" "js" "jz" "or" - "aaa" "aad" "aam" "aas" "adc" "add" "and" "bsf" "bsr" "btc" "btr" - "bts" "cbw" "cdq" "clc" "cld" "cli" "cmc" "cmp" "cqo" "cwd" "daa" - "das" "dec" "div" "fld" "fst" "hlt" "inc" "ins" "int" "jae" "jbe" - "jge" "jle" "jmp" "jna" "jnb" "jnc" "jne" "jng" "jnl" "jno" "jnp" - "jns" "jnz" "jpe" "jpo" "lar" "lds" "lea" "les" "lfs" "lgs" "lsl" - "lss" "ltr" "mov" "mul" "neg" "nop" "not" "out" "pop" "por" "rcl" - "rcr" "rep" "ret" "rol" "ror" "rsm" "sal" "sar" "sbb" "shl" "shr" - "stc" "std" "sti" "str" "sub" "ud2" "xor" "adcx" "adox" "andn" "arpl" - "blci" "blcs" "blsi" "blsr" "bzhi" "call" "cdqe" "clac" "clgi" "clts" - "cmps" "cwde" "dppd" "dpps" "emms" "fabs" "fadd" "fbld" "fchs" "fcom" - "fcos" "fdiv" "feni" "fild" "fist" "fld1" "fldz" "fmul" "fnop" "fsin" - "fstp" "fsub" "ftst" "fxam" "fxch" "idiv" "imul" "insb" "insd" "insw" - "int1" "int3" "into" "invd" "iret" "jcxz" "jnae" "jnbe" "jnge" "jnle" - "lahf" "lgdt" "lidt" "lldt" "lmsw" "lock" "lods" "loop" "movd" "movq" - "movs" "mulx" "orpd" "orps" "outs" "pand" "pdep" "pext" "popa" "popd" - "popf" "popq" "popw" "push" "pxor" "repe" "repz" "retd" "retf" "retn" - "retq" "retw" "rorx" "sahf" "salc" "sarx" "scas" "seta" "setb" "setc" - "sete" "setg" "setl" "seto" "setp" "sets" "setz" "sgdt" "shld" "shlx" - "shrd" "shrx" "sidt" "sldt" "smsw" "stac" "stgi" "stos" "test" "verr" - "verw" "vpor" "wait" "xadd" "xchg" "xend" "xlat" "addpd" "addps" - "addsd" "addss" "andpd" "andps" "bextr" "blcic" "blsic" "bound" - "bswap" "cmova" "cmovb" "cmovc" "cmove" "cmovg" "cmovl" "cmovo" - "cmovp" "cmovs" "cmovz" "cmppd" "cmpps" "cmpsb" "cmpsd" "cmpsq" - "cmpss" "cmpsw" "cpuid" "crc32" "divpd" "divps" "divsd" "divss" - "enter" "extrq" "f2xm1" "faddp" "fbstp" "fclex" "fcomi" "fcomp" - "fdisi" "fdivp" "fdivr" "femms" "ffree" "fiadd" "ficom" "fidiv" - "fimul" "finit" "fistp" "fisub" "fldcw" "fldpi" "fmulp" "fneni" - "fprem" "fptan" "fsave" "fsqrt" "fstcw" "fstsw" "fsubp" "fsubr" - "fucom" "fwait" "fyl2x" "icebp" "iretd" "iretq" "iretw" "jecxz" - "jrcxz" "lddqu" "leave" "lodsb" "lodsd" "lodsq" "lodsw" "loopd" - "loope" "loopq" "loopw" "loopz" "lzcnt" "maxpd" "maxps" "maxsd" - "maxss" "minpd" "minps" "minsd" "minss" "movbe" "movsb" "movsd" - "movsq" "movss" "movsw" "movsx" "movzx" "mulpd" "mulps" "mulsd" - "mulss" "mwait" "outsb" "outsd" "outsw" "pabsb" "pabsd" "pabsw" - "paddb" "paddd" "paddq" "paddw" "pandn" "pause" "pavgb" "pavgw" - "pf2id" "pf2iw" "pfacc" "pfadd" "pfmax" "pfmin" "pfmul" "pfrcp" - "pfsub" "pi2fd" "pi2fw" "popad" "popaw" "popfd" "popfq" "popfw" - "pslld" "psllq" "psllw" "psrad" "psraw" "psrld" "psrlq" "psrlw" - "psubb" "psubd" "psubq" "psubw" "ptest" "pusha" "pushd" "pushf" - "pushq" "pushw" "rcpps" "rcpss" "rdmsr" "rdpmc" "rdtsc" "repne" - "repnz" "retfd" "retfq" "retfw" "retnd" "retnq" "retnw" "scasb" - "scasd" "scasq" "scasw" "setae" "setbe" "setge" "setle" "setna" - "setnb" "setnc" "setne" "setng" "setnl" "setno" "setnp" "setns" - "setnz" "setpe" "setpo" "stosb" "stosd" "stosq" "stosw" "subpd" - "subps" "subsd" "subss" "tzcnt" "tzmsk" "vdppd" "vdpps" "vmovd" - "vmovq" "vmrun" "vmxon" "vorpd" "vorps" "vpand" "vpxor" "wrmsr" - "xlatb" "xorpd" "xorps" "xsave" "xtest" "aesdec" "aesenc" "aesimc" - "andnpd" "andnps" "blcmsk" "blsmsk" "cmovae" "cmovbe" "cmovge" - "cmovle" "cmovna" "cmovnb" "cmovnc" "cmovne" "cmovng" "cmovnl" - "cmovno" "cmovnp" "cmovns" "cmovnz" "cmovpe" "cmovpo" "comisd" - "comiss" "fcmovb" "fcmove" "fcmovu" "fcomip" "fcompp" "fdivrp" - "ffreep" "ficomp" "fidivr" "fisttp" "fisubr" "fldenv" "fldl2e" - "fldl2t" "fldlg2" "fldln2" "fnclex" "fndisi" "fninit" "fnsave" - "fnstcw" "fnstsw" "fpatan" "fprem1" "frstor" "frstpm" "fsaved" - "fsavew" "fscale" "fsetpm" "fstenv" "fsubrp" "fucomi" "fucomp" - "fxsave" "getsec" "haddpd" "haddps" "hsubpd" "hsubps" "invept" - "invlpg" "lfence" "llwpcb" "looped" "loopeq" "loopew" "loopne" - "loopnz" "loopzd" "loopzq" "loopzw" "lwpins" "lwpval" "mfence" - "movapd" "movaps" "movdqa" "movdqu" "movhpd" "movhps" "movlpd" - "movlps" "movnti" "movntq" "movsxd" "movupd" "movups" "paddsb" - "paddsw" "pextrb" "pextrd" "pextrq" "pextrw" "pfnacc" "pfsubr" - "phaddd" "phaddw" "phsubd" "phsubw" "pinsrb" "pinsrd" "pinsrq" - "pinsrw" "pmaxsb" "pmaxsd" "pmaxsw" "pmaxub" "pmaxud" "pmaxuw" - "pminsb" "pminsd" "pminsw" "pminub" "pminud" "pminuw" "pmuldq" - "pmulhw" "pmulld" "pmullw" "popcnt" "psadbw" "pshufb" "pshufd" - "pshufw" "psignb" "psignd" "psignw" "pslldq" "psrldq" "psubsb" - "psubsw" "pswapd" "pushad" "pushaw" "pushfd" "pushfq" "pushfw" - "rdmsrq" "rdrand" "rdseed" "rdtscp" "setalc" "setnae" "setnbe" - "setnge" "setnle" "sfence" "shufpd" "shufps" "skinit" "slwpcb" - "sqrtpd" "sqrtps" "sqrtsd" "sqrtss" "swapgs" "sysret" "t1mskc" - "vaddpd" "vaddps" "vaddsd" "vaddss" "vandpd" "vandps" "vcmppd" - "vcmpps" "vcmpsd" "vcmpss" "vdivpd" "vdivps" "vdivsd" "vdivss" - "vlddqu" "vmaxpd" "vmaxps" "vmaxsd" "vmaxss" "vmcall" "vminpd" - "vminps" "vminsd" "vminss" "vmload" "vmovsd" "vmovss" "vmread" - "vmsave" "vmulpd" "vmulps" "vmulsd" "vmulss" "vmxoff" "vpabsb" - "vpabsd" "vpabsw" "vpaddb" "vpaddd" "vpaddq" "vpaddw" "vpandn" - "vpavgb" "vpavgw" "vpcmov" "vpcomb" "vpcomd" "vpcomq" "vpcomw" - "vpermd" "vpermq" "vpperm" "vprotb" "vprotd" "vprotq" "vprotw" - "vpshab" "vpshad" "vpshaq" "vpshaw" "vpshlb" "vpshld" "vpshlq" - "vpshlw" "vpslld" "vpsllq" "vpsllw" "vpsrad" "vpsraw" "vpsrld" - "vpsrlq" "vpsrlw" "vpsubb" "vpsubd" "vpsubq" "vpsubw" "vptest" - "vrcpps" "vrcpss" "vsubpd" "vsubps" "vsubsd" "vsubss" "vxorpd" - "vxorps" "wbinvd" "wrmsrq" "xabort" "xbegin" "xgetbv" "xrstor" - "xsetbv" "blcfill" "blendpd" "blendps" "blsfill" "clflush" "cmovnae" - "cmovnbe" "cmovnge" "cmovnle" "cmpeqpd" "cmpeqps" "cmpeqsd" "cmpeqss" - "cmplepd" "cmpleps" "cmplesd" "cmpless" "cmpltpd" "cmpltps" "cmpltsd" - "cmpltss" "cmpxchg" "fcmovbe" "fcmovnb" "fcmovne" "fcmovnu" "fdecstp" - "fincstp" "fldenvd" "fldenvw" "fnsaved" "fnsavew" "fnstenv" "frndint" - "frstord" "frstorw" "fsincos" "fstenvd" "fstenvw" "fucomip" "fucompp" - "fxrstor" "fxtract" "fyl2xp1" "insertq" "invlpga" "invpcid" "invvpid" - "ldmxcsr" "loopned" "loopneq" "loopnew" "loopnzd" "loopnzq" "loopnzw" - "monitor" "movddup" "movdq2q" "movhlps" "movlhps" "movntdq" "movntpd" - "movntps" "movntsd" "movntss" "movq2dq" "mpsadbw" "paddusb" "paddusw" - "palignr" "pavgusb" "pblendw" "pcmpeqb" "pcmpeqd" "pcmpeqq" "pcmpeqw" - "pcmpgtb" "pcmpgtd" "pcmpgtq" "pcmpgtw" "pfcmpeq" "pfcmpge" "pfcmpgt" - "pfpnacc" "pfrsqrt" "phaddsw" "phsubsw" "pmaddwd" "pmulhrw" "pmulhuw" - "pmuludq" "pshufhw" "pshuflw" "psubusb" "psubusw" "roundpd" "roundps" - "roundsd" "roundss" "rsqrtps" "rsqrtss" "stmxcsr" "syscall" "sysexit" - "sysretq" "ucomisd" "ucomiss" "vaesdec" "vaesenc" "vaesimc" "vandnpd" - "vandnps" "vcomisd" "vcomiss" "vfrczpd" "vfrczps" "vfrczsd" "vfrczss" - "vhaddpd" "vhaddps" "vhsubpd" "vhsubps" "vmclear" "vmmcall" "vmovapd" - "vmovaps" "vmovdqa" "vmovdqu" "vmovhpd" "vmovhps" "vmovlpd" "vmovlps" - "vmovupd" "vmovups" "vmptrld" "vmptrst" "vmwrite" "vpaddsb" "vpaddsw" - "vpcomub" "vpcomud" "vpcomuq" "vpcomuw" "vpermpd" "vpermps" "vpextrb" - "vpextrd" "vpextrq" "vpextrw" "vphaddd" "vphaddw" "vphsubd" "vphsubw" - "vpinsrb" "vpinsrd" "vpinsrq" "vpinsrw" "vpmaxsb" "vpmaxsd" "vpmaxsw" - "vpmaxub" "vpmaxud" "vpmaxuw" "vpminsb" "vpminsd" "vpminsw" "vpminub" - "vpminud" "vpminuw" "vpmuldq" "vpmulhw" "vpmulld" "vpmullw" "vpsadbw" - "vpshufb" "vpshufd" "vpsignb" "vpsignd" "vpsignw" "vpslldq" "vpsllvd" - "vpsllvq" "vpsravd" "vpsrldq" "vpsrlvd" "vpsrlvq" "vpsubsb" "vpsubsw" - "vshufpd" "vshufps" "vsqrtpd" "vsqrtps" "vsqrtsd" "vsqrtss" "vtestpd" - "vtestps" "xsave64" "addsubpd" "addsubps" "blendvpd" "blendvps" - "cmpneqpd" "cmpneqps" "cmpneqsd" "cmpneqss" "cmpnlepd" "cmpnleps" - "cmpnlesd" "cmpnless" "cmpnltpd" "cmpnltps" "cmpnltsd" "cmpnltss" - "cmpordpd" "cmpordps" "cmpordsd" "cmpordss" "cvtdq2pd" "cvtdq2ps" - "cvtpd2dq" "cvtpd2pi" "cvtpd2ps" "cvtpi2pd" "cvtpi2ps" "cvtps2dq" - "cvtps2pd" "cvtps2pi" "cvtsd2si" "cvtsd2ss" "cvtsi2sd" "cvtsi2ss" - "cvtss2sd" "cvtss2si" "fcmovnbe" "fnstenvd" "fnstenvw" "fxsave64" - "insertps" "maskmovq" "movmskpd" "movmskps" "movntdqa" "movshdup" - "movsldup" "packssdw" "packsswb" "packusdw" "packuswb" "pblendvb" - "pfrcpit1" "pfrcpit2" "pfrsqit1" "pmovmskb" "pmovsxbd" "pmovsxbq" - "pmovsxbw" "pmovsxdq" "pmovsxwd" "pmovsxwq" "pmovzxbd" "pmovzxbq" - "pmovzxbw" "pmovzxdq" "pmovzxwd" "pmovzxwq" "pmulhrsw" "prefetch" - "rdfsbase" "rdgsbase" "sysenter" "sysexitq" "unpckhpd" "unpckhps" - "unpcklpd" "unpcklps" "vblendpd" "vblendps" "vcmpeqpd" "vcmpeqps" - "vcmpeqsd" "vcmpeqss" "vcmpgepd" "vcmpgeps" "vcmpgesd" "vcmpgess" - "vcmpgtpd" "vcmpgtps" "vcmpgtsd" "vcmpgtss" "vcmplepd" "vcmpleps" - "vcmplesd" "vcmpless" "vcmpltpd" "vcmpltps" "vcmpltsd" "vcmpltss" - "vfmaddpd" "vfmaddps" "vfmaddsd" "vfmaddss" "vfmsubpd" "vfmsubps" - "vfmsubsd" "vfmsubss" "vldmxcsr" "vmlaunch" "vmovddup" "vmovhlps" - "vmovlhps" "vmovntdq" "vmovntpd" "vmovntps" "vmpsadbw" "vmresume" - "vpaddusb" "vpaddusw" "vpalignr" "vpblendd" "vpblendw" "vpcmpeqb" - "vpcmpeqd" "vpcmpeqq" "vpcmpeqw" "vpcmpgtb" "vpcmpgtd" "vpcmpgtq" - "vpcmpgtw" "vpcomeqb" "vpcomeqd" "vpcomeqq" "vpcomeqw" "vpcomgeb" - "vpcomged" "vpcomgeq" "vpcomgew" "vpcomgtb" "vpcomgtd" "vpcomgtq" - "vpcomgtw" "vpcomleb" "vpcomled" "vpcomleq" "vpcomlew" "vpcomltb" - "vpcomltd" "vpcomltq" "vpcomltw" "vphaddbd" "vphaddbq" "vphaddbw" - "vphadddq" "vphaddsw" "vphaddwd" "vphaddwq" "vphsubbw" "vphsubdq" - "vphsubsw" "vphsubwd" "vpmacsdd" "vpmacswd" "vpmacsww" "vpmaddwd" - "vpmulhuw" "vpmuludq" "vpshufhw" "vpshuflw" "vpsubusb" "vpsubusw" - "vroundpd" "vroundps" "vroundsd" "vroundss" "vrsqrtps" "vrsqrtss" - "vstmxcsr" "vucomisd" "vucomiss" "vzeroall" "wrfsbase" "wrgsbase" - "xacquire" "xrelease" "xrstor64" "xsaveopt" "cmpxchg8b" "cvttpd2dq" - "cvttpd2pi" "cvttps2dq" "cvttps2pi" "cvttsd2si" "cvttss2si" - "extractps" "fxrstor64" "pclmulqdq" "pcmpestri" "pcmpestrm" - "pcmpistri" "pcmpistrm" "pmaddubsw" "prefetchw" "punpckhbw" - "punpckhdq" "punpckhwd" "punpcklbw" "punpckldq" "punpcklwd" - "vaddsubpd" "vaddsubps" "vblendvpd" "vblendvps" "vcmpneqpd" - "vcmpneqps" "vcmpneqsd" "vcmpneqss" "vcmpngepd" "vcmpngeps" - "vcmpngesd" "vcmpngess" "vcmpngtpd" "vcmpngtps" "vcmpngtsd" - "vcmpngtss" "vcmpnlepd" "vcmpnleps" "vcmpnlesd" "vcmpnless" - "vcmpnltpd" "vcmpnltps" "vcmpnltsd" "vcmpnltss" "vcmpordpd" - "vcmpordps" "vcmpordsd" "vcmpordss" "vcvtdq2pd" "vcvtdq2ps" - "vcvtpd2dq" "vcvtpd2ps" "vcvtph2ps" "vcvtps2dq" "vcvtps2pd" - "vcvtps2ph" "vcvtsd2si" "vcvtsd2ss" "vcvtsi2sd" "vcvtsi2ss" - "vcvtss2sd" "vcvtss2si" "vfnmaddpd" "vfnmaddps" "vfnmaddsd" - "vfnmaddss" "vfnmsubpd" "vfnmsubps" "vfnmsubsd" "vfnmsubss" - "vinsertps" "vmovmskpd" "vmovmskps" "vmovntdqa" "vmovshdup" - "vmovsldup" "vpackssdw" "vpacksswb" "vpackusdw" "vpackuswb" - "vpblendvb" "vpcomequb" "vpcomequd" "vpcomequq" "vpcomequw" - "vpcomgeub" "vpcomgeud" "vpcomgeuq" "vpcomgeuw" "vpcomgtub" - "vpcomgtud" "vpcomgtuq" "vpcomgtuw" "vpcomleub" "vpcomleud" - "vpcomleuq" "vpcomleuw" "vpcomltub" "vpcomltud" "vpcomltuq" - "vpcomltuw" "vpcomneqb" "vpcomneqd" "vpcomneqq" "vpcomneqw" - "vpermilpd" "vpermilps" "vphaddubd" "vphaddubq" "vphaddubw" - "vphaddudq" "vphadduwd" "vphadduwq" "vpmacsdqh" "vpmacsdql" - "vpmacssdd" "vpmacsswd" "vpmacssww" "vpmadcswd" "vpmovmskb" - "vpmovsxbd" "vpmovsxbq" "vpmovsxbw" "vpmovsxdq" "vpmovsxwd" - "vpmovsxwq" "vpmovzxbd" "vpmovzxbq" "vpmovzxbw" "vpmovzxdq" - "vpmovzxwd" "vpmovzxwq" "vpmulhrsw" "vunpckhpd" "vunpckhps" - "vunpcklpd" "vunpcklps" "aesdeclast" "aesenclast" "cmpunordpd" - "cmpunordps" "cmpunordsd" "cmpunordss" "cmpxchg16b" "loadall286" - "loadall386" "maskmovdqu" "phminposuw" "prefetcht0" "prefetcht1" - "prefetcht2" "punpckhqdq" "punpcklqdq" "vcmptruepd" "vcmptrueps" - "vcmptruesd" "vcmptruess" "vcvttpd2dq" "vcvttps2dq" "vcvttsd2si" - "vcvttss2si" "vextractps" "vgatherdpd" "vgatherdps" "vgatherqpd" - "vgatherqps" "vmaskmovpd" "vmaskmovps" "vpclmulqdq" "vpcmpestri" - "vpcmpestrm" "vpcmpistri" "vpcmpistrm" "vpcomnequb" "vpcomnequd" - "vpcomnequq" "vpcomnequw" "vpcomtrueb" "vpcomtrued" "vpcomtrueq" - "vpcomtruew" "vperm2f128" "vperm2i128" "vpermil2pd" "vpermil2ps" - "vpgatherdd" "vpgatherdq" "vpgatherqd" "vpgatherqq" "vpmacssdqh" - "vpmacssdql" "vpmadcsswd" "vpmaddubsw" "vpmaskmovd" "vpmaskmovq" - "vpunpckhbw" "vpunpckhdq" "vpunpckhwd" "vpunpcklbw" "vpunpckldq" - "vpunpcklwd" "vzeroupper" "xsaveopt64" "pclmulhqhdq" "pclmullqhdq" - "prefetchnta" "vaesdeclast" "vaesenclast" "vcmpeq_ospd" "vcmpeq_osps" - "vcmpeq_ossd" "vcmpeq_osss" "vcmpeq_uqpd" "vcmpeq_uqps" "vcmpeq_uqsd" - "vcmpeq_uqss" "vcmpeq_uspd" "vcmpeq_usps" "vcmpeq_ussd" "vcmpeq_usss" - "vcmpfalsepd" "vcmpfalseps" "vcmpfalsesd" "vcmpfalsess" "vcmpge_oqpd" - "vcmpge_oqps" "vcmpge_oqsd" "vcmpge_oqss" "vcmpgt_oqpd" "vcmpgt_oqps" - "vcmpgt_oqsd" "vcmpgt_oqss" "vcmple_oqpd" "vcmple_oqps" "vcmple_oqsd" - "vcmple_oqss" "vcmplt_oqpd" "vcmplt_oqps" "vcmplt_oqsd" "vcmplt_oqss" - "vcmpord_spd" "vcmpord_sps" "vcmpord_ssd" "vcmpord_sss" "vcmpunordpd" - "vcmpunordps" "vcmpunordsd" "vcmpunordss" "vfmadd132pd" "vfmadd132ps" - "vfmadd132sd" "vfmadd132ss" "vfmadd213pd" "vfmadd213ps" "vfmadd213sd" - "vfmadd213ss" "vfmadd231pd" "vfmadd231ps" "vfmadd231sd" "vfmadd231ss" - "vfmaddsubpd" "vfmaddsubps" "vfmsub132pd" "vfmsub132ps" "vfmsub132sd" - "vfmsub132ss" "vfmsub213pd" "vfmsub213ps" "vfmsub213sd" "vfmsub213ss" - "vfmsub231pd" "vfmsub231ps" "vfmsub231sd" "vfmsub231ss" "vfmsubaddpd" - "vfmsubaddps" "vinsertf128" "vinserti128" "vmaskmovdqu" "vpcomfalseb" - "vpcomfalsed" "vpcomfalseq" "vpcomfalsew" "vpcomtrueub" "vpcomtrueud" - "vpcomtrueuq" "vpcomtrueuw" "vphminposuw" "vpunpckhqdq" "vpunpcklqdq" - "pclmulhqhqdq" "pclmulhqlqdq" "pclmullqhqdq" "pclmullqlqdq" - "vbroadcastsd" "vbroadcastss" "vcmpneq_oqpd" "vcmpneq_oqps" - "vcmpneq_oqsd" "vcmpneq_oqss" "vcmpneq_ospd" "vcmpneq_osps" - "vcmpneq_ossd" "vcmpneq_osss" "vcmpneq_uspd" "vcmpneq_usps" - "vcmpneq_ussd" "vcmpneq_usss" "vcmpnge_uqpd" "vcmpnge_uqps" - "vcmpnge_uqsd" "vcmpnge_uqss" "vcmpngt_uqpd" "vcmpngt_uqps" - "vcmpngt_uqsd" "vcmpngt_uqss" "vcmpnle_uqpd" "vcmpnle_uqps" - "vcmpnle_uqsd" "vcmpnle_uqss" "vcmpnlt_uqpd" "vcmpnlt_uqps" - "vcmpnlt_uqsd" "vcmpnlt_uqss" "vextractf128" "vextracti128" - "vfnmadd132pd" "vfnmadd132ps" "vfnmadd132sd" "vfnmadd132ss" - "vfnmadd213pd" "vfnmadd213ps" "vfnmadd213sd" "vfnmadd213ss" - "vfnmadd231pd" "vfnmadd231ps" "vfnmadd231sd" "vfnmadd231ss" - "vfnmsub132pd" "vfnmsub132ps" "vfnmsub132sd" "vfnmsub132ss" - "vfnmsub213pd" "vfnmsub213ps" "vfnmsub213sd" "vfnmsub213ss" - "vfnmsub231pd" "vfnmsub231ps" "vfnmsub231sd" "vfnmsub231ss" - "vpbroadcastb" "vpbroadcastd" "vpbroadcastq" "vpbroadcastw" - "vpclmulhqhdq" "vpclmullqhdq" "vpcomfalseub" "vpcomfalseud" - "vpcomfalseuq" "vpcomfalseuw" "vpermilmo2pd" "vpermilmo2ps" - "vpermilmz2pd" "vpermilmz2ps" "vpermiltd2pd" "vpermiltd2ps" - "vcmptrue_uspd" "vcmptrue_usps" "vcmptrue_ussd" "vcmptrue_usss" - "vcmpunord_spd" "vcmpunord_sps" "vcmpunord_ssd" "vcmpunord_sss" - "vpclmulhqlqdq" "vpclmullqlqdq" "vbroadcastf128" "vbroadcasti128" - "vcmpfalse_ospd" "vcmpfalse_osps" "vcmpfalse_ossd" "vcmpfalse_osss" - "vfmaddsub132pd" "vfmaddsub132ps" "vfmaddsub213pd" "vfmaddsub213ps" - "vfmaddsub231pd" "vfmaddsub231ps" "vfmsubadd132pd" "vfmsubadd132ps" - "vfmsubadd213pd" "vfmsubadd213ps" "vfmsubadd231pd" "vfmsubadd231ps" - "aeskeygenassist" "vaeskeygenassist")) . 'font-lock-builtin-face) - ;; Labels - ("^[ \t]*\\([a-z$A-Z0-9.?!@]\\(?:\\sw\\|\\s_\\)*\\):" - . (1 'font-lock-function-name-face)) - ;; Macro names - ("\\(?:macro\\|struc\\)[ \t]+\\([a-zA-Z0-9.?!@]\\(?:\\sw\\|\\s_\\)*\\)" - . (1 'font-lock-function-name-face))) - "Syntax highlighting for FASM mode.") - - - - -;; (defun fasm--get-indent-level (lineoffset) -;; (save-excursion -;; (forward-line (1- lineoffset)) -;; (back-to-indentation) -;; (current-column))) - -(defun empty-line? () - (save-excursion - (let ((column-a (progn (move-beginning-of-line nil) - (current-column))) - (column-b (progn (back-to-indentation) - (current-column)))) - ;; 下面这个谓词看似是冗余的 但是没有关系 - (and (= column-b column-a) - (eq (following-char) 10)) - ))) - -(defun above-char () - (interactive) - (save-excursion - (backward-char 1) - (following-char))) - -(defun fasm-label? () - (interactive) - (save-excursion - (and (progn - (whitespace-cleanup) - (not (empty-line?))) - (progn - ;; (whitespace-cleanup) - (end-of-line) - (eq 58 ;; 58 -- ":" - (above-char)))))) - -;; (defun' test-fasm-get-indent () -;; (interactive) -;; (message "><><><")) -(defun fasm-get-indent (n) - (save-excursion - (forward-line n) - (cond ((empty-line?) - "empty-line") - ((fasm-label?) - "fasm-label") - (t - (progn - (back-to-indentation) - (current-column)))))) - -(defun fasm-indent-line () - "Indent according to FASM major mode." - (interactive) - ;; 可以发现缩进函数根本就写不好 因为emacs不能真正明白文本的语法 - (cond - ;; 下面是根据当前一行来缩进 - ((fasm-label?) - (let () - (back-to-indentation) - (delete-backward-char (current-column)))) - ;; 下面是根据上一行来缩进 - (t;; else - (back-to-indentation) - (let ((prev-indent (fasm-get-indent -1)) - (curr-indent (current-column))) - (cond ((equal prev-indent "empty-line") - ;; (indent-to 8) - (indent-to 3) - ) - ((equal prev-indent "fasm-label") - ;; (indent-to 0) - ;; 上面的那个命令根本不会缩进 这样看似是合理的 所以增加下面这句: - (message "do not indent at all !")) - ((< curr-indent prev-indent) - (indent-to prev-indent)) - ((>= curr-indent prev-indent) - (delete-backward-char (- curr-indent prev-indent))) - ((>= curr-indent prev-indent) - (delete-backward-char (- curr-indent prev-indent))) - ))))) - -;; Emacs < 24 did not have prog-mode -(defalias 'fasm-parent-mode - (if (fboundp 'prog-mode) 'prog-mode 'fundamental-mode)) - -;;;###autoload -(define-derived-mode fasm-mode fasm-parent-mode - "Fasm" - "Major mode for editing assembly in FASM format." - (set (make-local-variable 'font-lock-defaults) - (list 'fasm-font-lock-keywords nil t)) - (set (make-local-variable 'indent-line-function) 'fasm-indent-line) - (set (make-local-variable 'comment-start) ";; ")) - -(provide 'fasm-mode) -;;; fasm-mode.el ends here diff --git a/.emacs.local/llvm-mode.el b/.emacs.local/llvm-mode.el deleted file mode 100644 index c548692..0000000 --- a/.emacs.local/llvm-mode.el +++ /dev/null @@ -1,292 +0,0 @@ -;;; llvm-mode.el --- Major mode for the LLVM IR language -*- lexical-binding: t; -*- -;; -;; This is free and unencumbered software released into the public domain. -;; -;; Author: Noah Peart -;; URL: https://github.com/nverno/llvm-mode -;; Package-Requires: ((emacs "25.1")) -;; Created: 16 February 2020 -;; Version: 0.1.0 - -;; This file is not part of GNU Emacs. -;; -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 3, or -;; (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;; General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with this program; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth -;; Floor, Boston, MA 02110-1301, USA. - -;;; Commentary: - -;; Major mode for editing LLVM IR files. - -;; Modified from https://github.com/llvm-mirror/llvm//utils/emacs/llvm-mode.el -;; to include -;; - additional syntax -;; - font-lock for globals (vars/declares/defines) -;; - imenu -;; - indentation: `llvm-mode-indent-offset' and `llvm-mode-label-offset' -;; - completion: -;; + global variables -;; + global declares/defines -;; TODO: -;; + keywords / attributes -;; + could add labels / %uids as well -;; -;; - vim syntax => https://github.com/llvm-mirror/llvm/utils/vim/syntax/llvm.vim -;; -;; Reference: -;; https://github.com/llvm-mirror/llvm/docs/LangRef.rst -;; -;;; Installation: -;; -;; Add to `load-path' and generate autoloads or -;; ```lisp -;; (require 'llvm-mode) -;; ``` -;; -;;; Code: -(require 'smie) - -(defgroup llvm nil - "Major mode for editing llvm assembly source code." - :group 'languages - :prefix "llvm-") - -(defcustom llvm-mode-indent-offset 2 - "Indentation column following opening braces." - :group 'llvm - :type 'integer) - -(defcustom llvm-mode-label-offset 0 - "Indentation column for labels." - :group 'llvm - :type 'integer) - -(defvar llvm-mode-lookup-instruction-uri - "https://llvm.org/docs/LangRef.html#%s-instruction") - -(defvar llvm-mode-syntax-table - (let ((table (make-syntax-table))) - (modify-syntax-entry ?% "_" table) - (modify-syntax-entry ?. "_" table) - (modify-syntax-entry ?\; "< " table) - (modify-syntax-entry ?\n "> " table) - (modify-syntax-entry ?: "." table) - (modify-syntax-entry ?* "." table) - table) - "Syntax table used while in LLVM mode.") - -(defconst llvm-mode-font-lock-keywords - (list - ;; Attributes - `(,(regexp-opt - '("alwaysinline" "argmemonly" "builtin" "cold" "convergent" "immarg" - "inaccessiblemem_or_argmemonly" "inaccessiblememonly" "inlinehint" - "jumptable" "minsize" "naked" "nobuiltin" "noduplicate" - "noimplicitfloat" "noinline" "nonlazybind" "norecurse" "noredzone" - "noreturn" "nounwind" "optnone" "optsize" "readnone" "readonly" - "returns_twice" "safestack" "sanitize_address" "sanitize_hwaddress" - "sanitize_memory" "sanitize_memtag" "sanitize_thread" "speculatable" - "ssp" "sspreq" "sspstrong" "strictfp" "uwtable" "writeonly") - 'symbols) - . font-lock-constant-face) - ;; Globals - '("@[[:alnum:]_]+" . font-lock-function-name-face) - ;; Variables - '("%[-a-zA-Z$._][-a-zA-Z$._0-9]*" . font-lock-variable-name-face) - ;; Labels - '("[-a-zA-Z$._0-9]+:" . font-lock-variable-name-face) - ;; Unnamed variable slots - '("%[-]?[0-9]+" . font-lock-variable-name-face) - ;; Types - `(,(regexp-opt - '("void" "i1" "i8" "i16" "i32" "i64" "i128" "float" "double" "type" - "label" "opaque") - 'symbols) - . font-lock-type-face) - ;; Integer literals - '("\\b[-]?[0-9]+\\b" . font-lock-preprocessor-face) - ;; Floating point constants - '("\\b[-+]?[0-9]+.[0-9]*\\([eE][-+]?[0-9]+\\)?\\b" . font-lock-preprocessor-face) - ;; Hex constants - '("\\b0x[0-9A-Fa-f]+\\b" . font-lock-preprocessor-face) - ;; Keywords - `(,(regexp-opt - '(;; Toplevel entities - "declare" "define" "module" "target" "source_filename" "global" - "constant" "const" "attributes" "uselistorder" "uselistorder_bb" - ;; Linkage types - "private" "internal" "weak" "weak_odr" "linkonce" "linkonce_odr" - "available_externally" "appending" "common" "extern_weak" "external" - "uninitialized" "implementation" "..." - ;; Values - "true" "false" "null" "undef" "zeroinitializer" "none" "c" "asm" - "blockaddress" - ;; Calling conventions - "ccc" "fastcc" "coldcc" "webkit_jscc" "anyregcc" "preserve_mostcc" - "preserve_allcc" "cxx_fast_tlscc" "swiftcc" "atomic" "volatile" - "personality" "prologue" "section") - 'symbols) - . font-lock-keyword-face) - ;; Arithmetic and Logical Operators - `(,(regexp-opt - '("add" "sub" "mul" "sdiv" "udiv" "urem" "srem" "and" "or" "xor" "setne" - "seteq" "setlt" "setgt" "setle" "setge") - 'symbols) - . font-lock-keyword-face) - ;; Floating-point operators - `(,(regexp-opt '("fadd" "fsub" "fneg" "fmul" "fdiv" "frem") 'symbols) - . font-lock-keyword-face) - ;; Special instructions - `(,(regexp-opt - '("phi" "tail" "call" "select" "to" "shl" "lshr" "ashr" "fcmp" "icmp" - "va_arg" "landingpad") - 'symbols) - . font-lock-keyword-face) - ;; Control instructions - `(,(regexp-opt - '("ret" "br" "switch" "invoke" "resume" "unwind" "unreachable" - "indirectbr") - 'symbols) - . font-lock-keyword-face) - ;; Memory operators - `(,(regexp-opt - '("malloc" "alloca" "free" "load" "store" "getelementptr" "fence" - "cmpxchg" "atomicrmw") - 'symbols) - . font-lock-keyword-face) - ;; Casts - `(,(regexp-opt - '("bitcast" "inttoptr" "ptrtoint" "trunc" "zext" "sext" "fptrunc" "fpext" - "fptoui" "fptosi" "uitofp" "sitofp" "addrspacecast") - 'symbols) - . font-lock-keyword-face) - ;; Vector ops - `(,(regexp-opt '("extractelement" "insertelement" "shufflevector") 'symbols) - . font-lock-keyword-face) - ;; Aggregate ops - `(,(regexp-opt '("extractvalue" "insertvalue") 'symbols) . font-lock-keyword-face) - ;; Metadata types - `(,(regexp-opt '("distinct") 'symbols) . font-lock-keyword-face) - ;; Use-list order directives - `(,(regexp-opt '("uselistorder" "uselistorder_bb") 'symbols) - . font-lock-keyword-face)) - "Syntax highlighting for LLVM.") - - -;; ------------------------------------------------------------------- -;;; Indentation - -(defconst llvm-mode-smie-grammar - (smie-prec2->grammar - (smie-precs->prec2 - '((assoc ":"))))) - -;; return ":" on label line -(defun llvm-mode--smie-forward-token () - (let ((tok (smie-default-forward-token))) - (save-match-data - (if (not (looking-at "[ \t]*:")) tok - (goto-char (match-end 0)) - ":")))) - -(defun llvm-mode-smie-rules (kind token) - (pcase (cons kind token) - (`(:elem . basic) llvm-mode-indent-offset) - (`(:elem . args) 0) - (`(:close-all . ,_) t) - (`(:before . ":") - (if (smie-rule-parent-p ":") 0 - llvm-mode-label-offset)) - (`(:after . ":") - (if (smie-rule-prev-p ":") llvm-mode-indent-offset - (- llvm-mode-indent-offset llvm-mode-label-offset))) - (`(:list-intro . ,(or ":" "")) t))) - -;; ------------------------------------------------------------------- -;;; Completion - -(defconst llvm-mode-global-regexp - (concat "^\\s-*" (regexp-opt '("declare" "define")) "\\s-*" - "[^@\n]+@\\([[:alnum:]_]+\\)" - "\\|^\\s-*@\\([[:alnum:]_]+\\) *=")) - -(defun llvm-mode--globals () - (let (res) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward llvm-mode-global-regexp nil t) - (push (or (match-string-no-properties 1) - (match-string-no-properties 2)) - res))) - res)) - -;; basic completion at point -(defun llvm-mode-completion-at-point () - (when-let* ((bnds (bounds-of-thing-at-point 'symbol))) - (let ((table - (cond - ((eq ?@ (char-before (car bnds))) - (list - (completion-table-with-cache - (lambda (_string) (llvm-mode--globals))) - :annotation-function (lambda (_s) " ")))))) - (when table - (nconc (list (car bnds) (cdr bnds)) - table - (list :exclusive 'no)))))) - -(defun llvm-mode-lookup-instruction-online (instr) - "Lookup help for INSTR, default to thing at point, in online manual. -With prefix, query for INSTR." - (interactive - (list - (or (and (not current-prefix-arg) (thing-at-point 'symbol)) - (read-from-minibuffer "LLVM help for: ")))) - (browse-url - (format llvm-mode-lookup-instruction-uri instr))) - -;; Imenu: defines / declares / labels -;; XXX: remove duplicate labels?? -(defvar llvm-mode-imenu-regexp - `((nil - ,(concat (regexp-opt '("declare" "define")) "[^@\n]+@\\([[:alnum:]_]+\\)") - 1) - ("Label" "^\\s-*\\([[:alpha:]][[:alnum:]_]*\\):" 1))) - -(defvar llvm-mode-map - (let ((km (make-sparse-keymap))) - (define-key km (kbd "M-?") #'llvm-mode-lookup-instruction-online) - km)) - - -;;;###autoload -(define-derived-mode llvm-mode prog-mode "LLVM" - "Major mode for editing LLVM source files. -\\{llvm-mode-map} - Runs `llvm-mode-hook' on startup." - (setq font-lock-defaults `(llvm-mode-font-lock-keywords)) - (setq-local comment-start ";") - (setq-local imenu-generic-expression llvm-mode-imenu-regexp) - (add-hook 'completion-at-point-functions #'llvm-mode-completion-at-point nil t) - (smie-setup llvm-mode-smie-grammar #'llvm-mode-smie-rules - :forward-token #'llvm-mode--smie-forward-token - :backward-token #'smie-default-backward-token)) - -;; Associate .ll files with llvm-mode -;;;###autoload -(add-to-list 'auto-mode-alist (cons "\\.ll\\'" 'llvm-mode)) - -(provide 'llvm-mode) - -;;; llvm-mode.el ends here diff --git a/.emacs.local/simpc-mode.el b/.emacs.local/simpc-mode.el deleted file mode 100644 index 7545955..0000000 --- a/.emacs.local/simpc-mode.el +++ /dev/null @@ -1,111 +0,0 @@ -(require 'subr-x) - -(defvar simpc-mode-syntax-table - (let ((table (make-syntax-table))) - ;; C/C++ style comments - (modify-syntax-entry ?/ ". 124b" table) - (modify-syntax-entry ?* ". 23" table) - (modify-syntax-entry ?\n "> b" table) - ;; Preprocessor stuff? - (modify-syntax-entry ?# "." table) - ;; Chars are the same as strings - (modify-syntax-entry ?' "\"" table) - ;; Treat <> as punctuation (needed to highlight C++ keywords - ;; properly in template syntax) - (modify-syntax-entry ?< "." table) - (modify-syntax-entry ?> "." table) - - (modify-syntax-entry ?& "." table) - (modify-syntax-entry ?% "." table) - table)) - -(defun simpc-types () - '("char" "int" "long" "short" "void" "bool" "float" "double" "signed" "unsigned" - "char16_t" "char32_t" "char8_t" - "int8_t" "uint8_t" "int16_t" "uint16_t" "int32_t" "uint32_t" "int64_t" "uint64_t" - "uintptr_t" - "size_t")) - -(defun simpc-keywords () - '("auto" "break" "case" "const" "continue" "default" "do" - "else" "enum" "extern" "for" "goto" "if" "register" - "return" "sizeof" "static" "struct" "switch" "typedef" - "union" "volatile" "while" "alignas" "alignof" "and" - "and_eq" "asm" "atomic_cancel" "atomic_commit" "atomic_noexcept" "bitand" - "bitor" "catch" "class" "co_await" - "co_return" "co_yield" "compl" "concept" "const_cast" "consteval" "constexpr" - "constinit" "decltype" "delete" "dynamic_cast" "explicit" "export" "false" - "friend" "inline" "mutable" "namespace" "new" "noexcept" "not" "not_eq" - "nullptr" "operator" "or" "or_eq" "private" "protected" "public" "reflexpr" - "reinterpret_cast" "requires" "static_assert" "static_cast" "synchronized" - "template" "this" "thread_local" "throw" "true" "try" "typeid" "typename" - "using" "virtual" "wchar_t" "xor" "xor_eq")) - -(defun simpc-font-lock-keywords () - (list - `("# *[#a-zA-Z0-9_]+" . font-lock-preprocessor-face) - `("#.*include \\(\\(<\\|\"\\).*\\(>\\|\"\\)\\)" . (1 font-lock-string-face)) - `(,(regexp-opt (simpc-keywords) 'symbols) . font-lock-keyword-face) - `(,(regexp-opt (simpc-types) 'symbols) . font-lock-type-face))) - -(defun simpc--previous-non-empty-line () - (save-excursion - (forward-line -1) - (while (and (not (bobp)) - (string-empty-p - (string-trim-right - (thing-at-point 'line t)))) - (forward-line -1)) - (thing-at-point 'line t))) - -(defun simpc--indentation-of-previous-non-empty-line () - (save-excursion - (forward-line -1) - (while (and (not (bobp)) - (string-empty-p - (string-trim-right - (thing-at-point 'line t)))) - (forward-line -1)) - (current-indentation))) - -(defun simpc--desired-indentation () - (let* ((cur-line (string-trim-right (thing-at-point 'line t))) - (prev-line (string-trim-right (simpc--previous-non-empty-line))) - (indent-len 4) - (prev-indent (simpc--indentation-of-previous-non-empty-line))) - (cond - ((string-match-p "^\\s-*switch\\s-*(.+)" prev-line) - prev-indent) - ((and (string-suffix-p "{" prev-line) - (string-prefix-p "}" (string-trim-left cur-line))) - prev-indent) - ((string-suffix-p "{" prev-line) - (+ prev-indent indent-len)) - ((string-prefix-p "}" (string-trim-left cur-line)) - (max (- prev-indent indent-len) 0)) - ((string-suffix-p ":" prev-line) - (if (string-suffix-p ":" cur-line) - prev-indent - (+ prev-indent indent-len))) - ((string-suffix-p ":" cur-line) - (max (- prev-indent indent-len) 0)) - (t prev-indent)))) - -;;; TODO: customizable indentation (amount of spaces, tabs, etc) -(defun simpc-indent-line () - (interactive) - (when (not (bobp)) - (let* ((desired-indentation - (simpc--desired-indentation)) - (n (max (- (current-column) (current-indentation)) 0))) - (indent-line-to desired-indentation) - (forward-char n)))) - -(define-derived-mode simpc-mode prog-mode "Simple C" - "Simple major mode for editing C files." - :syntax-table simpc-mode-syntax-table - (setq-local font-lock-defaults '(simpc-font-lock-keywords)) - (setq-local indent-line-function 'simpc-indent-line) - (setq-local comment-start "// ")) - -(provide 'simpc-mode) diff --git a/.emacs.rc/misc-rc.el b/.emacs.rc/misc-rc.el deleted file mode 100644 index e041e7e..0000000 --- a/.emacs.rc/misc-rc.el +++ /dev/null @@ -1,137 +0,0 @@ -(require 'ansi-color) - -(global-set-key (kbd "C-c p") 'find-file-at-point) -(global-set-key (kbd "C-c i m") 'imenu) - -(setq-default inhibit-splash-screen t - make-backup-files nil - tab-width 4 - indent-tabs-mode nil - compilation-scroll-output t - visible-bell (equal system-type 'windows-nt)) - -(defun rc/colorize-compilation-buffer () - (read-only-mode 'toggle) - (ansi-color-apply-on-region compilation-filter-start (point)) - (read-only-mode 'toggle)) -(add-hook 'compilation-filter-hook 'rc/colorize-compilation-buffer) - -(defun rc/buffer-file-name () - (if (equal major-mode 'dired-mode) - default-directory - (buffer-file-name))) - -(defun rc/parent-directory (path) - (file-name-directory (directory-file-name path))) - -(defun rc/root-anchor (path anchor) - (cond - ((string= anchor "") nil) - ((file-exists-p (concat (file-name-as-directory path) anchor)) path) - ((string-equal path "/") nil) - (t (rc/root-anchor (rc/parent-directory path) anchor)))) - -(defun rc/clipboard-org-mode-file-link (anchor) - (interactive "sRoot anchor: ") - (let* ((root-dir (rc/root-anchor default-directory anchor)) - (org-mode-file-link (format "file:%s::%d" - (if root-dir - (file-relative-name (rc/buffer-file-name) root-dir) - (rc/buffer-file-name)) - (line-number-at-pos)))) - (kill-new org-mode-file-link) - (message org-mode-file-link))) - -;;; Taken from here: -;;; http://stackoverflow.com/questions/2416655/file-path-to-clipboard-in-emacs -(defun rc/put-file-name-on-clipboard () - "Put the current file name on the clipboard" - (interactive) - (let ((filename (rc/buffer-file-name))) - (when filename - (kill-new filename) - (message filename)))) - -(defun rc/put-buffer-name-on-clipboard () - "Put the current buffer name on the clipboard" - (interactive) - (kill-new (buffer-name)) - (message (buffer-name))) - -(defun rc/kill-autoloads-buffers () - (interactive) - (dolist (buffer (buffer-list)) - (let ((name (buffer-name buffer))) - (when (string-match-p "-autoloads.el" name) - (kill-buffer buffer) - (message "Killed autoloads buffer %s" name))))) - -(defun rc/start-python-simple-http-server () - (interactive) - (shell-command "python -m SimpleHTTPServer 3001 &" - "*Simple Python HTTP Server*")) - -(global-set-key (kbd "C-x p s") 'rc/start-python-simple-http-server) - -;;; Taken from here: -;;; http://blog.bookworm.at/2007/03/pretty-print-xml-with-emacs.html -(defun bf-pretty-print-xml-region (begin end) - "Pretty format XML markup in region. You need to have nxml-mode -http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do -this. The function inserts linebreaks to separate tags that have -nothing but whitespace between them. It then indents the markup -by using nxml's indentation rules." - (interactive "r") - (save-excursion - (nxml-mode) - (goto-char begin) - (while (search-forward-regexp "\>[ \\t]*\<" nil t) - (backward-char) (insert "\n")) - (indent-region begin end)) - (message "Ah, much better!")) - -;;; Stolen from http://ergoemacs.org/emacs/emacs_unfill-paragraph.html -(defun rc/unfill-paragraph () - "Replace newline chars in current paragraph by single spaces. -This command does the inverse of `fill-paragraph'." - (interactive) - (let ((fill-column 90002000)) ; 90002000 is just random. you can use `most-positive-fixnum' - (fill-paragraph nil))) - -(global-set-key (kbd "C-c M-q") 'rc/unfill-paragraph) - -(defun rc/load-path-here () - (interactive) - (add-to-list 'load-path default-directory)) - -(defconst rc/frame-transparency 85) - -(defun rc/toggle-transparency () - (interactive) - (let ((frame-alpha (frame-parameter nil 'alpha))) - (if (or (not frame-alpha) - (= (cadr frame-alpha) 100)) - (set-frame-parameter nil 'alpha - `(,rc/frame-transparency - ,rc/frame-transparency)) - (set-frame-parameter nil 'alpha '(100 100))))) - -(defun rc/duplicate-line () - "Duplicate current line" - (interactive) - (let ((column (- (point) (point-at-bol))) - (line (let ((s (thing-at-point 'line t))) - (if s (string-remove-suffix "\n" s) "")))) - (move-end-of-line 1) - (newline) - (insert line) - (move-beginning-of-line 1) - (forward-char column))) - -(global-set-key (kbd "C-,") 'rc/duplicate-line) - -;;; A little hack which fixes a problem with meta key in fluxbox under VNC. -(setq x-alt-keysym 'meta) - -;(setq confirm-kill-emacs 'y-or-n-p) - diff --git a/.emacs.rc/rc.el b/.emacs.rc/rc.el deleted file mode 100644 index 669a0e6..0000000 --- a/.emacs.rc/rc.el +++ /dev/null @@ -1,34 +0,0 @@ -;; (add-to-list 'package-archives -;; '("melpa" . "https://melpa.org/packages/") t) -(add-to-list 'package-archives - '("melpa-stable" . "https://stable.melpa.org/packages/") t) - -(defvar rc/package-contents-refreshed nil) - -(defun rc/package-refresh-contents-once () - (when (not rc/package-contents-refreshed) - (setq rc/package-contents-refreshed t) - (package-refresh-contents))) - -(defun rc/require-one-package (package) - (when (not (package-installed-p package)) - (rc/package-refresh-contents-once) - (package-install package))) - -(defun rc/require (&rest packages) - (dolist (package packages) - (rc/require-one-package package))) - -(defun rc/require-theme (theme) - (let ((theme-package (->> theme - (symbol-name) - (funcall (-flip #'concat) "-theme") - (intern)))) - (rc/require theme-package) - (load-theme theme t))) - -(rc/require 'dash) -(require 'dash) - -(rc/require 'dash-functional) -(require 'dash-functional) diff --git a/MANIFEST b/MANIFEST index d38879f..97a1abf 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,6 +1,4 @@ -.emacs|symlink| -.emacs.local|symlink| -.emacs.rc|symlink| +.config/doom|symlink| .config/kitty|symlink| .config/i3|symlink| .config/i3status|symlink|