847 lines
25 KiB
Org Mode
847 lines
25 KiB
Org Mode
#+TITLE: >.<macs
|
||
#+AUTHOR: mux
|
||
|
||
#+STARTUP: shrink
|
||
|
||
* SANE DEFAULTS
|
||
** Generic optimizations
|
||
#+begin_src emacs-lisp
|
||
(setq gc-cons-threshold most-positive-fixnum)
|
||
(add-hook
|
||
'emacs-startup-hook
|
||
(lambda () (setq gc-cons-threshold (* 50 1024 1024))))
|
||
|
||
(setq backup-directory-alist '(("." . "~/.config/emacs/backups")))
|
||
(setq auto-save-file-name-transforms
|
||
'((".*" "~/.config/emacs/auto-save-list/" t)))
|
||
(setq
|
||
delete-old-versions t
|
||
kept-new-versions 6
|
||
kept-old-versions 2
|
||
version-control t)
|
||
|
||
(setq undo-limit (* 8 1024 1024))
|
||
(save-place-mode 1)
|
||
#+end_src
|
||
|
||
#+RESULTS:
|
||
: t
|
||
|
||
** Declutter user interface
|
||
#+begin_src emacs-lisp
|
||
(menu-bar-mode -1)
|
||
(tool-bar-mode -1)
|
||
(scroll-bar-mode -1)
|
||
(setq warning-minimum-level :error)
|
||
#+end_src
|
||
|
||
** Tweak appearance
|
||
#+begin_src emacs-lisp
|
||
(set-face-attribute 'default nil
|
||
:family "ShureTechMono Nerd Font"
|
||
:height 190)
|
||
(global-display-line-numbers-mode 1)
|
||
(setq display-line-numbers 'relative)
|
||
(setq-default line-spacing 5)
|
||
(setq-default
|
||
inhibit-startup-message t
|
||
initial-scratch-message nil
|
||
sentence-end-double-space nil
|
||
ring-bell-function 'ignore
|
||
make-backup-files t
|
||
vc-follow-symlinks t
|
||
ad-redefinition-action 'accept
|
||
help-window-select t
|
||
use-short-answers t)
|
||
|
||
(dolist (mode
|
||
'(term-mode-hook
|
||
shell-mode-hook
|
||
treemacs-mode-hook
|
||
eshell-mode-hook
|
||
help-mode-hook
|
||
neotree-mode-hook
|
||
vterm-mode-hook))
|
||
(add-hook mode (lambda () (display-line-numbers-mode 0))))
|
||
#+end_src
|
||
|
||
* PACKAGE MANAGEMENT
|
||
** Elpaca package manager
|
||
#+begin_src emacs-lisp
|
||
(defvar elpaca-installer-version 0.11)
|
||
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
|
||
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
|
||
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
|
||
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
|
||
:ref nil :depth 1 :inherit ignore
|
||
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
|
||
:build (:not elpaca--activate-package)))
|
||
(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory))
|
||
(build (expand-file-name "elpaca/" elpaca-builds-directory))
|
||
(order (cdr elpaca-order))
|
||
(default-directory repo))
|
||
(add-to-list 'load-path (if (file-exists-p build) build repo))
|
||
(unless (file-exists-p repo)
|
||
(make-directory repo t)
|
||
(when (<= emacs-major-version 28) (require 'subr-x))
|
||
(condition-case-unless-debug err
|
||
(if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
|
||
((zerop (apply #'call-process `("git" nil ,buffer t "clone"
|
||
,@(when-let* ((depth (plist-get order :depth)))
|
||
(list (format "--depth=%d" depth) "--no-single-branch"))
|
||
,(plist-get order :repo) ,repo))))
|
||
((zerop (call-process "git" nil buffer t "checkout"
|
||
(or (plist-get order :ref) "--"))))
|
||
(emacs (concat invocation-directory invocation-name))
|
||
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
|
||
"--eval" "(byte-recompile-directory \".\" 0 'force)")))
|
||
((require 'elpaca))
|
||
((elpaca-generate-autoloads "elpaca" repo)))
|
||
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
|
||
(error "%s" (with-current-buffer buffer (buffer-string))))
|
||
((error) (warn "%s" err) (delete-directory repo 'recursive))))
|
||
(unless (require 'elpaca-autoloads nil t)
|
||
(require 'elpaca)
|
||
(elpaca-generate-autoloads "elpaca" repo)
|
||
(let ((load-source-file-function nil)) (load "./elpaca-autoloads"))))
|
||
(add-hook 'after-init-hook #'elpaca-process-queues)
|
||
(elpaca `(,@elpaca-order))
|
||
|
||
;; Install use-package support
|
||
(elpaca elpaca-use-package
|
||
(elpaca-use-package-mode))
|
||
#+end_src
|
||
|
||
* EDITING & MODAL INPUT
|
||
** Meow modal editing
|
||
#+begin_src emacs-lisp
|
||
(use-package
|
||
meow
|
||
:ensure t
|
||
:preface
|
||
(defun meow-word ()
|
||
"Expand word/symbol under cursor."
|
||
(interactive)
|
||
(if (and (use-region-p)
|
||
(equal
|
||
(car (region-bounds)) (bounds-of-thing-at-point 'word)))
|
||
(meow-mark-symbol 1)
|
||
(progn
|
||
(when (and (mark)
|
||
(equal
|
||
(car (region-bounds))
|
||
(bounds-of-thing-at-point 'symbol)))
|
||
(meow-pop-selection))
|
||
(meow-mark-word 1))))
|
||
|
||
(defun meow-kill-line ()
|
||
"Kill till the end of line."
|
||
(interactive)
|
||
(let ((select-enable-clipboard meow-use-clipboard))
|
||
(kill-line)))
|
||
|
||
(defun meow-change-line ()
|
||
"Kill till end of line and switch to INSERT state."
|
||
(interactive)
|
||
(meow--cancel-selection)
|
||
(meow-end-of-thing (car (rassoc 'line meow-char-thing-table)))
|
||
(meow-change))
|
||
|
||
(defun meow-save-clipboard ()
|
||
"Copy in clipboard."
|
||
(interactive)
|
||
(let ((meow-use-clipboard t))
|
||
(meow-save)))
|
||
|
||
(defvar meow--trim-yank nil)
|
||
|
||
(defun meow-insert-for-yank-advice (orig-fn str)
|
||
"Advice for `insert-for-yank' function to correctly insert lines."
|
||
(when meow--trim-yank
|
||
(set 'str (string-trim-right str "\n")))
|
||
(if (and (not (eq (point) (+ 1 (line-end-position 0))))
|
||
(string-match-p "^.+\n$" str))
|
||
(save-excursion
|
||
(beginning-of-line)
|
||
(funcall orig-fn str))
|
||
(funcall orig-fn str)))
|
||
|
||
(defun meow-yank-dwim ()
|
||
"Smart yank."
|
||
(interactive)
|
||
(advice-add 'insert-for-yank :around 'meow-insert-for-yank-advice)
|
||
(if (use-region-p)
|
||
(let ((meow--trim-yank t))
|
||
(delete-region (region-beginning) (region-end))
|
||
(meow-yank))
|
||
(meow-yank))
|
||
(advice-remove 'insert-for-yank 'meow-insert-for-yank-advice))
|
||
|
||
(defun meow-yank-pop-dwim ()
|
||
"Smart yank pop."
|
||
(interactive)
|
||
(advice-add 'insert-for-yank :around 'meow-insert-for-yank-advice)
|
||
(if (use-region-p)
|
||
(let ((meow--trim-yank t))
|
||
(delete-region (region-beginning) (region-end))
|
||
(meow-yank-pop))
|
||
(meow-yank-pop))
|
||
(advice-remove 'insert-for-yank 'meow-insert-for-yank-advice))
|
||
|
||
(defun meow-smart-reverse ()
|
||
"Reverse selection or begin negative argument."
|
||
(interactive)
|
||
(if (use-region-p)
|
||
(meow-reverse)
|
||
(negative-argument nil)))
|
||
|
||
(defun meow-kmacro ()
|
||
"Toggle recording of kmacro."
|
||
(interactive)
|
||
(if defining-kbd-macro
|
||
(meow-end-kmacro)
|
||
(meow-start-kmacro)))
|
||
|
||
(defun meow-eldoc ()
|
||
"Toggle the display of the eldoc window."
|
||
(interactive)
|
||
(if (get-buffer-window eldoc--doc-buffer)
|
||
(delete-window (get-buffer-window eldoc--doc-buffer))
|
||
(eldoc-doc-buffer t)))
|
||
|
||
(defun meow-ergo-setup ()
|
||
(setq meow-cheatsheet-layout meow-cheatsheet-layout-qwerty)
|
||
(setq meow-normal-state-keymap (make-sparse-keymap))
|
||
(setf (alist-get 'normal meow-keymap-alist)
|
||
meow-normal-state-keymap)
|
||
(meow-motion-define-key
|
||
'("l" . meow-next) '("j" . meow-prev) '("<escape>" . ignore))
|
||
(meow-leader-define-key
|
||
'("1" . meow-digit-argument)
|
||
'("2" . meow-digit-argument)
|
||
'("3" . meow-digit-argument)
|
||
'("4" . meow-digit-argument)
|
||
'("5" . meow-digit-argument)
|
||
'("6" . meow-digit-argument)
|
||
'("7" . meow-digit-argument)
|
||
'("8" . meow-digit-argument)
|
||
'("9" . meow-digit-argument)
|
||
'("0" . meow-digit-argument)
|
||
'("/" . meow-keypad-describe-key)
|
||
'("?" . meow-cheatsheet))
|
||
|
||
(meow-thing-register
|
||
'angle '(pair ("<") (">")) '(pair ("<") (">")))
|
||
|
||
(setq meow-char-thing-table
|
||
'((?f . round)
|
||
(?d . square)
|
||
(?s . curly)
|
||
(?a . angle)
|
||
(?r . string)
|
||
(?v . paragraph)
|
||
(?c . line)
|
||
(?x . buffer)))
|
||
|
||
(meow-normal-define-key
|
||
;; Expansion
|
||
'("0" . meow-expand-0)
|
||
'("1" . meow-expand-1)
|
||
'("2" . meow-expand-2)
|
||
'("3" . meow-expand-3)
|
||
'("4" . meow-expand-4)
|
||
'("5" . meow-expand-5)
|
||
'("6" . meow-expand-6)
|
||
'("7" . meow-expand-7)
|
||
'("8" . meow-expand-8)
|
||
'("9" . meow-expand-9)
|
||
'("'" . meow-reverse)
|
||
|
||
;; Movement
|
||
'("i" . meow-prev)
|
||
'("k" . meow-next)
|
||
'("j" . meow-left)
|
||
'("l" . meow-right)
|
||
'("y" . meow-search)
|
||
'("/" . meow-visit)
|
||
|
||
;; Expansion
|
||
'("I" . meow-prev-expand)
|
||
'("K" . meow-next-expand)
|
||
'("J" . meow-left-expand)
|
||
'("L" . meow-right-expand)
|
||
|
||
'("u" . meow-back-word)
|
||
'("U" . meow-back-symbol)
|
||
'("o" . meow-next-word)
|
||
'("O" . meow-next-symbol)
|
||
|
||
'("a" . meow-mark-word)
|
||
'("A" . meow-mark-symbol)
|
||
'("s" . meow-line)
|
||
'("S" . meow-goto-line)
|
||
'("w" . meow-block)
|
||
'("q" . meow-join)
|
||
'("g" . meow-grab)
|
||
'("G" . meow-pop-grab)
|
||
'("m" . meow-swap-grab)
|
||
'("M" . meow-sync-grab)
|
||
'("p" . meow-cancel-selection)
|
||
'("P" . meow-pop-selection)
|
||
|
||
'("x" . meow-till)
|
||
'("z" . meow-find)
|
||
|
||
'("," . meow-beginning-of-thing)
|
||
'("." . meow-end-of-thing)
|
||
'("<" . meow-inner-of-thing)
|
||
'(">" . meow-bounds-of-thing)
|
||
|
||
;; Editing
|
||
'("d" . meow-kill)
|
||
'("f" . meow-change)
|
||
'("t" . meow-delete)
|
||
'("c" . meow-save)
|
||
'("v" . meow-yank)
|
||
'("V" . meow-yank-pop)
|
||
|
||
'("e" . meow-insert)
|
||
'("E" . meow-open-above)
|
||
'("r" . meow-append)
|
||
'("R" . meow-open-below)
|
||
|
||
'("h" . undo-only)
|
||
'("H" . undo-redo)
|
||
|
||
'("b" . open-line)
|
||
'("B" . split-line)
|
||
|
||
'("[" . indent-rigidly-left-to-tab-stop)
|
||
'("]" . indent-rigidly-right-to-tab-stop)
|
||
|
||
;; Prefix commands
|
||
'("nf" . meow-comment)
|
||
'("nt" . meow-start-kmacro-or-insert-counter)
|
||
'("nr" . meow-start-kmacro)
|
||
'("ne" . meow-end-or-call-kmacro)
|
||
|
||
'(";f" . save-buffer)
|
||
'(";F" . save-some-buffers)
|
||
'(";d" . meow-query-replace-regexp)
|
||
|
||
;; Buffer navigation
|
||
'(";[b" . previous-buffer)
|
||
'(";]b" . next-buffer)
|
||
'(";b" . switch-to-buffer)
|
||
'(";nb" . rename-buffer)
|
||
'(";B" . revert-buffer)
|
||
|
||
'("<escape>" . ignore)))
|
||
|
||
:config (meow-ergo-setup) (meow-global-mode 1))
|
||
#+end_src
|
||
|
||
** Formatter
|
||
#+begin_src emacs-lisp
|
||
(use-package format-all
|
||
:ensure t
|
||
:preface
|
||
(defun refmt ()
|
||
"Auto-format whole buffer."
|
||
(interactive)
|
||
(cond
|
||
((and (bound-and-true-p eglot--managed-mode)
|
||
(eglot-managed-p))
|
||
(eglot-format-buffer))
|
||
((derived-mode-p 'prolog-mode)
|
||
(prolog-indent-buffer))
|
||
((derived-mode-p 'emacs-lisp-mode)
|
||
(indent-region (point-min) (point-max)))
|
||
((derived-mode-p 'org-mode)
|
||
(org-indent-region (point-min) (point-max)))
|
||
(t
|
||
(format-all-buffer))))
|
||
:config
|
||
(global-set-key (kbd "M-f") #'refmt)
|
||
(add-hook 'prog-mode-hook #'format-all-ensure-formatter))
|
||
#+end_src
|
||
|
||
#+RESULTS:
|
||
: [nil 26871 47188 711924 nil elpaca-process-queues nil nil 283000 nil]
|
||
|
||
* PROGRAMMING FEATURES
|
||
** Syntax highlighting
|
||
#+begin_src emacs-lisp
|
||
(use-package treesit-auto
|
||
:ensure t
|
||
:custom
|
||
(treesit-auto-install 'prompt)
|
||
:config
|
||
(treesit-auto-add-to-auto-mode-alist 'all)
|
||
(global-treesit-auto-mode))
|
||
#+end_src
|
||
|
||
#+RESULTS:
|
||
: [nil 26870 64740 146030 nil elpaca-process-queues nil nil 133000 nil]
|
||
|
||
** LSP
|
||
#+begin_src emacs-lisp
|
||
;; (use-package
|
||
;; lsp-mode
|
||
;; :ensure t
|
||
;; :hook
|
||
;; (prog-mode . lsp-deferred)
|
||
;; (lsp-mode . lsp-enable-which-key-integration)
|
||
;; :commands (lsp lsp-deferred)
|
||
;; :init (setq lsp-keymap-prefix "C-c l")
|
||
;; :custom
|
||
;; (lsp-completion-provider :none)
|
||
;; (lsp-headerline-breadcrumb-enable nil))
|
||
|
||
(use-package eglot
|
||
:hook
|
||
(prog-mode . eglot-ensure)
|
||
:custom
|
||
(eglot-events-buffer-size 0)
|
||
(eglot-sync-connect t)
|
||
(eglot-autoshutdown t)
|
||
(eglot-report-progress t)
|
||
:bind (:map eglot-mode-map
|
||
("C-c l r" . eglot-rename)
|
||
("C-c l a" . eglot-code-actions)
|
||
("C-c l f" . eglot-format)
|
||
("C-c l F" . eglot-format-buffer)
|
||
("C-c l d" . xref-find-definitions)
|
||
("C-c l R" . xref-find-references)
|
||
("C-c l h" . eldoc))
|
||
:config
|
||
(add-to-list 'eglot-server-programs
|
||
'((js-mode typescript-mode tsx-ts-mode typescript-ts-mode js-ts-mode)
|
||
. ("deno" "lsp" :initializationOptions
|
||
(:enable t
|
||
:lint t
|
||
:unstable t
|
||
:config nil)))))
|
||
|
||
(use-package
|
||
sideline
|
||
:ensure t
|
||
:hook (flymake-mode . sideline-mode)
|
||
:init (setq sideline-backends-right '(sideline-flymake)))
|
||
|
||
(use-package
|
||
sideline-flymake
|
||
:ensure t
|
||
:after sideline
|
||
:hook (flymake-mode . sideline-flymake-setup))
|
||
#+end_src
|
||
|
||
#+RESULTS:
|
||
: [nil 26873 7819 534617 nil elpaca-process-queues nil nil 890000 nil]
|
||
qq
|
||
: #[128 "\304\300\"\205 |