* Garbage Collection Improvement #+BEGIN_SRC emacs-lisp (defun my-minibuffer-setup-hook () (setq gc-cons-threshold most-positive-fixnum)) (defun my-minibuffer-exit-hook () (setq gc-cons-threshold 800000000)) (add-hook 'minibuffer-setup-hook #'my-minibuffer-setup-hook) (add-hook 'minibuffer-exit-hook #'my-minibuffer-exit-hook) (defun gc-idle-timer () "Trigger garbage collection when Emacs is idle for 0.5 seconds." (run-with-idle-timer 1.2 t 'garbage-collect)) (gc-idle-timer) #+END_SRC * Use Package #+BEGIN_SRC emacs-lisp (require 'package) (add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/")) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) (package-initialize) (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) (eval-and-compile (setq use-package-always-ensure t use-package-expand-minimally t)) (eval-when-compile (require 'use-package)) #+END_SRC * Basic behaviours #+BEGIN_SRC emacs-lisp (use-package no-littering) (setq make-backup-files nil create-lockfiles nil erc-join-buffer 'window confirm-kill-processes nil) (setq inhibit-startup-message t backup-inhibited t) #+END_SRC * Basic UI Improvements #+BEGIN_SRC emacs-lisp (scroll-bar-mode -1) (tool-bar-mode -1) (tooltip-mode -1) (menu-bar-mode -1) (setq scroll-up-aggressively nil scroll-down-aggressively nil scroll-conservatively 101 display-line-numbers-type t) (setq scroll-step 1) (setq scroll-margin 8) (column-number-mode +1) (global-display-line-numbers-mode t) (setq-default fill-column 80) (electric-pair-mode +1) (set-frame-parameter (selected-frame) 'alpha '(90 . 90)) (add-to-list 'default-frame-alist '(alpha . (90 . 90))) (global-set-key (kbd "M-n") 'scroll-up-line) (global-set-key (kbd "M-p") 'scroll-down-line) #+END_SRC * Themeing #+BEGIN_SRC emacs-lisp (use-package doom-themes :config (setq doom-themes-enable-bold t doom-themes-enable-italic t) (load-theme 'doom-dracula t) (doom-themes-org-config)) (set-face-attribute 'default nil :font "DejaVu Sans Mono" :family "Monospace" :height 97) (set-face-attribute 'variable-pitch nil :font "DejaVu Sans" :height 97) (set-face-attribute 'fixed-pitch nil :font "DejaVu Sans Mono" :family "Monospace" :height 97) #+END_SRC * Completion #+BEGIN_SRC emacs-lisp (use-package vertico :diminish vertico-mode :bind (:map vertico-map ("C-n" . vertico-next) ("C-p" . vertico-previous)) :init (vertico-mode t) ;; (vertico-flat-mode 1) (setq vertico-count 15)) (use-package vertico-directory :after vertico :ensure nil ;; More convenient directory navigation commands :bind (:map vertico-map ("RET" . vertico-directory-enter) ("DEL" . vertico-directory-delete-char) ("M-DEL" . vertico-directory-delete-word)) ;; Tidy shadowed file names :hook (rfn-eshadow-update-overlay . vertico-directory-tidy)) (use-package marginalia :after vertico :custom (marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil)) :config (marginalia-mode)) (use-package orderless :config (setq completion-styles '(orderless partial-completion basic) completion-category-defaults nil completion-category-overrides '((file (styles . (partial-completion)))))) (use-package consult) #+END_SRC * Development ** Visual #+BEGIN_SRC emacs-lisp (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) (use-package ansi-color :hook (compilation-filter . ansi-color-compilation-filter)) #+END_SRC ** Magit #+BEGIN_SRC emacs-lisp (use-package transient) (use-package magit :bind (("C-x g" . magit-status)) :custom (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) #+END_SRC ** Extra Modes #+BEGIN_SRC emacs-lisp (use-package markdown-mode :mode ("\\.md\\'" . markdown-mode)) (use-package glsl-mode) #+END_SRC ** yasnippet #+BEGIN_SRC emacs-lisp (use-package yasnippet :config (yas-global-mode t)) (use-package yasnippet-snippets) #+END_SRC ** LSP #+BEGIN_SRC emacs-lisp (use-package lsp-mode :commands (lsp lsp-deferred) :init (setq lsp-keymap-prefix "C-c l" lsp-headerline-breadcrumb-enable nil lsp-lens-enable nil) (defun my/lsp-mode-setup-completion () (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) '(orderless))) ;; Configure orderless :hook ((lsp-completion-mode . my/lsp-mode-setup-completion) (c-mode . lsp-deferred) (c++-mode . lsp-deferred) (python-mode . lsp-deferred) (csharp-mode . lsp-deferred)) :custom (lsp-completion-provider :none) ; corfu (lsp-idle-delay 0.2) ) (use-package lsp-ui :hook (lsp-mode . lsp-ui-mode) :bind ("C-c r" . lsp-ui-peek-find-references) #+END_SRC ** Flycheck #+BEGIN_SRC (use-package flycheck :config (add-hook 'after-init-hook #'global-flycheck-mode)) #+END_SRC ** Corfu #+BEGIN_SRC emacs-lisp (use-package corfu :ensure t :custom (corfu-cycle t) (corfu-auto t) (corfu-auto-prefix 2) (corfu-auto-delay 0.1) (corfu-popupinfo-delay '(0.2 . 0.1)) (corfu-preview-current 'insert) (corfu-preselect 'first) (corfu-on-exact-match nil) :bind (:map corfu-map ("C-g" . corfu-quit)) :init (global-corfu-mode) (corfu-history-mode) (corfu-popupinfo-mode)) (defun corfu-lsp-setup () (setq-local completion-styles '(orderless) completion-category-defaults nil)) (add-hook 'lsp-completion-mode-hook #'corfu-lsp-setup) #+END_SRC ** C Mode Hook #+BEGIN_SRC emacs-lisp (defun my-c-mode-common-hook () ;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode (c-set-offset 'substatement-open 0) ;; other customizations can go here (setq c++-tab-always-indent t) (setq c-basic-offset 4) ;; Default is 2 (setq c-indent-level 4) ;; Default is 2 (setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60)) (setq tab-width 4) (setq indent-tabs-mode t)) (add-hook 'c-mode-common-hook 'my-c-mode-common-hook) #+END_SRC ** LSP Booster #+BEGIN_SRC emacs-lisp (defun lsp-booster--advice-json-parse (old-fn &rest args) "Try to parse bytecode instead of json." (or (when (equal (following-char) ?#) (let ((bytecode (read (current-buffer)))) (when (byte-code-function-p bytecode) (funcall bytecode)))) (apply old-fn args))) (advice-add (if (progn (require 'json) (fboundp 'json-parse-buffer)) 'json-parse-buffer 'json-read) :around #'lsp-booster--advice-json-parse) (defun lsp-booster--advice-final-command (old-fn cmd &optional test?) "Prepend emacs-lsp-booster command to lsp CMD." (let ((orig-result (funcall old-fn cmd test?))) (if (and (not test?) ;; for check lsp-server-present? (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper lsp-use-plists (not (functionp 'json-rpc-connection)) ;; native json-rpc (executable-find "emacs-lsp-booster")) (progn (when-let ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH) (setcar orig-result command-from-exec-path)) (message "Using emacs-lsp-booster for %s!" orig-result) (cons "emacs-lsp-booster" orig-result)) orig-result))) (advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command) #+END_SRC * Util and Keybinds #+BEGIN_SRC emacs-lisp (use-package expand-region :bind("C-=" . er/expand-region)) (use-package evil-nerd-commenter :bind ("M-;" . evilnc-comment-or-uncomment-lines)) #+END_SRC