dotfiles/.emacs.d/settings.org

15 KiB
Raw Blame History

Ezri's Settings

Shamelessly stole this from Simponic, made some limited modifications myself. Namely to indent style, theme, and line numbers. Also added Github Copilot.

Packages

Melpa

  (require 'package)
  (add-to-list 'package-archives
               '("melpa" . "https://melpa.org/packages/") t)

General emacs

Tab bar mode

  (defun my-tabbar-buffer-groups () ;; customize to show all normal files in one group
    (list (cond ((string-equal "*" (substring (buffer-name) 0 1)) "emacs")
                 ((eq major-mode 'dired-mode) "emacs")
                 (t "user"))))
  (setq tabbar-buffer-groups-function 'my-tabbar-buffer-groups)
  (tab-bar-mode)

Indentation

Indent using tabs, render with tab-width of 2.

  (setq default-tab-width 2)
  (setq-default tab-width 2)
  (setq-default indent-tabs-mode t)
  (setq sh-indentation 2)
  (smart-tabs-insinuate 'c 'c++ 'java 'javascript 'python)

Line numbers

  (global-display-line-numbers-mode)

Filesystem stuff

  (setq auto-save-default nil)
  (setq make-backup-files nil)
  (setq create-lockfiles nil)
  (global-auto-revert-mode t) ;; Change files on disk as they are updated

UI stuff

  ;; (when (window-system)
  ;;   (menu-bar-mode -1)
  ;;   (tool-bar-mode -1)
  ;;   (toggle-scroll-bar -1)
  ;;   (if (display-graphic-p)
  ;;       (funcall (lambda ()
  ;;                  (set-fringe-mode '(1 . 1))
  ;;                  )))
  ;;   (setq frame-resize-pixelwise t))

  (setq inhibit-startup-screen t)

  (defun my-frame-config (&optional frame)
    (setq frame-resize-pixelwise t)
    (if (display-graphic-p)
        (set-fringe-mode '(1 . 1)))
    (if (not frame) ;; The initial call, run when emacs starts
        (funcall (lambda ()
                   (menu-bar-mode -1)
                   (tool-bar-mode -1)
                   (toggle-scroll-bar -1)
                   )))
    ;;-----------------------------------------;;
    ;; reinitialize modes in case of new frame ;;
    ;;-----------------------------------------;;
    (if menu-bar-mode
        (menu-bar-mode -1))
    (if tool-bar-mode
        (tool-bar-mode -1))
    (if scroll-bar-mode
        (scroll-bar-mode -1)))

  (my-frame-config) ;; Run initially so that direct invocations work
  (add-hook 'after-make-frame-functions 'my-frame-config)

TUI stuff

  (defun terminal-config (&optional frame)
    "Establish settings for teh current terminal."
    (if (not frame) ;; The initial call.
        (xterm-mouse-mode 1)
      (if xterm-mouse-mode
          ;; Re-initialize the mode in case of a new terminal.
          (xterm-mouse-mode 1))))

  (terminal-config)
  (add-hook 'after-make-frame-functions 'terminal-config)

Custom keymap

  (global-set-key (kbd "C-;") 'comment-or-uncomment-region)

System path (macos)

  ;; Use system path on macos - needed for node
  (use-package exec-path-from-shell
    :ensure t
    :init
    (when (memq window-system '(mac ns x))
      (exec-path-from-shell-initialize)))

Theming

Highlight current line

  (global-hl-line-mode)

Font

  (add-to-list 'default-frame-alist '(font . "JetBrains Mono-9"))

Doom-themes

  (defun my-theme-config (&optional frame)    
    (use-package doom-themes
      :ensure t
      :config
      ;; Global settings (defaults)
      (setq doom-themes-enable-bold t    ; if nil, bold is universally disabled
            doom-themes-enable-italic t) ; if nil, italics is universally disabled
      (load-theme 'doom-personal t)

      ;; Enable flashing mode-line on errors
      (doom-themes-visual-bell-config)
      ;; Enable custom neotree theme (all-the-icons must be installed!)
      (doom-themes-neotree-config)
      ;; or for treemacs users
      (setq doom-themes-treemacs-theme "doom-atom") ; use "doom-colors" for less minimal icon theme
      (doom-themes-treemacs-config)
      ;; Corrects (and improves) org-mode's native fontification.
      (doom-themes-org-config)))
  (my-theme-config)
  (add-hook 'after-make-frame-functions 'my-theme-config)

Doom-modeline

  (defun my-modeline-config (&optional frame)
    (use-package doom-modeline
      :ensure t
      :init (doom-modeline-mode 1)))
  (my-modeline-config)
  (add-hook 'after-make-frame-functions 'my-modeline-config)

All the icons

  (use-package all-the-icons
    :ensure t)

Projectile

  (use-package projectile
    :bind ("C-c p" . 'projectile-command-map)
    :init (projectile-mode +1) (setq projectile-enable-caching t)
    :ensure t)

Swiper, Ivy

  (use-package counsel
    :ensure t
    :bind
    ("C-s" . 'swiper-isearch)
    ("M-x" . 'counsel-M-x)
    :init
    (setq ivy-use-virtual-buffers t)
    (setq enable-recursive-minibuffers t)
    (ivy-mode 1))

Neotree

  (use-package neotree
    :ensure t
    :bind ("C-c j" . 'neotree-toggle)
    :init
    ;; slow rendering
    (setq inhibit-compacting-font-caches t)

    ;; set icons theme
    (setq neo-theme (if (display-graphic-p) 'icons 'arrow))

    ;; Every time when the neotree window is opened, let it find current file and jump to node
    (setq neo-smart-open t)

    ;; When running projectile-switch-project (C-c p p), neotree will change root automatically
    (setq projectile-switch-project-action 'neotree-projectile-action)

    (setq neo-window-width 35)

    ;; show hidden files
    (setq-default neo-show-hidden-files t))

Custom Mode Bindings

SystemD unit files

  ;; Base systemd unit files
  (add-to-list 'auto-mode-alist '("\\.service\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.timer\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.mount\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.automount\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.target\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.path\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.slice\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.socket\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.device\\'" . conf-unix-mode))
  ;; systemd-networkd
  (add-to-list 'auto-mode-alist '("\\.network\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.link\\'" . conf-unix-mode))
  (add-to-list 'auto-mode-alist '("\\.netdev\\'" . conf-unix-mode))

elkowar's wacky widgets

  (add-to-list 'auto-mode-alist '("\\.yuck\\'" . conf-unix-mode))

Markdown mode

Auto Text Wrap

  (add-hook 'markdown-mode-hook (lambda ()
                                  (setq fill-column 85)
                                  (visual-fill-column-mode)
                                  (visual-line-mode)
                                  (display-fill-column-indicator-mode)))

Org mode

General

  (setq org-startup-indented t)

Auto Text Wrap

  (add-hook 'org-mode-hook (lambda ()
                             (setq fill-column 85)
                             (visual-fill-column-mode)
                             (visual-line-mode)))

Babel

Elixir

  (use-package ob-elixir
     :ensure t)

Load Languages

  (org-babel-do-load-languages
   'org-babel-load-languages
   '((lisp . t)
     (elixir . t)
     (emacs-lisp . t)
     (python . t)))

org-bullets

  (use-package org-bullets
    :ensure t
    :init
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))

org-appear

  (use-package org-appear
    :ensure t
    :init
    (add-hook 'org-mode-hook 'org-appear-mode))

Presentations

  (use-package org-present
    :ensure t
    :straight '(org-present
                :type git
                :host github
                :repo "rlister/org-present"))

Development

Copilot

  ;; Load copilot
  (add-to-list 'load-path "/home/ezri/.emacs.d/copilot.el")
  (require 'copilot)

  ;; Enable completion
  (add-hook 'prog-mode-hook 'copilot-mode)

Git

  (use-package magit :ensure t)

Autocomplete

  (use-package auto-complete :ensure t)
  (ac-config-default)
  (defun my-tab ()
    (interactive)
    (or (copilot-accept-completion)
        (ac-expand nil)))

  (with-eval-after-load 'auto-complete
    ; diable inline preview
    (setq ac-disable-inline t)
    ; show menu if have only one candidate
    (setq ac-candidate-menu-min 0))

  (define-key copilot-completion-map (kbd "<tab>") 'copilot-accept-completion)
  (define-key copilot-completion-map (kbd "TAB") 'copilot-accept-completion)

Company mode

  (use-package company
    :ensure t
    :init
    (global-company-mode t)
    :bind (:map company-active-map
                ("C-n" . company-select-next)
                ("C-p" . company-select-previous))
    :config
    (setq company-idle-delay 0.3))

LSP Mode

  (use-package lsp-mode
    :ensure t
    :init
    ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")
    (setq lsp-keymap-prefix "C-c l")
    :hook ((python-mode . lsp) ;; pip install python-lsp-server pyls-black pyls-isort pyls-mypy
           (elixir-mode . lsp)
           (rust-mode . lsp)
           (java-mode . lsp)
           (php-mode . lsp)
           (typescript-mode . lsp) ;; npm install -g typescript typescript-language-server
           (lsp-mode . lsp-enable-which-key-integration))
    :config (lsp-register-custom-settings
             '(("pyls.plugins.pyls_mypy.enabled" t t)
               ("pyls.plugins.pyls_mypy.live_mode" nil t)
               ("pyls.plugins.pyls_black.enabled" t t)
               ("pyls.plugins.pyls_isort.enabled" t t)))
    :commands lsp)

Languages

Common Lisp

Formatter! semantic-refactor
  (use-package srefactor
    :ensure t
    :hook ((before-save .
                        (lambda ()
                          (when (eq major-mode 'lisp-mode)
                            (srefactor-lisp-format-buffer))))))
  (require 'srefactor)
  (require 'srefactor-lisp)
Rainbow Parentheses
  (use-package rainbow-delimiters :ensure t)
  (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode)
Slime
  (use-package slime
    :ensure t
    :init
    (setq inferior-lisp-program "sbcl"))
AC-Slime
  (use-package ac-slime
    :ensure t
    :straight '(ac-slime
                :type git
                :host github
                :repo "purcell/ac-slime"))
  (add-hook 'slime-mode-hook 'set-up-slime-ac)
  (add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
  (eval-after-load "auto-complete"
    '(add-to-list 'ac-modes 'slime-repl-mode))

Elixir

  (use-package elixir-mode
    :ensure t
    :hook ((before-save .
                        (lambda ()
                          (when (eq major-mode 'elixir-mode)
                            (elixir-format))))))

Rust

After installing the rust-analyzer program, the following can be used:

  (use-package rust-mode
    :ensure t)
  (setq lsp-rust-server 'rust-analyzer)

Vue

  (add-hook 'mmm-mode-hook
            (lambda ()
              (set-face-background 'mmm-default-submode-face nil)))

Web Stuff

typescript-mode
  ;; TODO: Update to tree-sitter in Emacs 29
  (use-package typescript-mode
    :ensure t)
  (setq typescript-indent-level 2)
TIDE
  (defun setup-tide-mode ()
    (interactive)
    (tide-setup)
    (flycheck-mode +1)
    (setq flycheck-check-syntax-automatically '(save mode-enabled))
    (eldoc-mode +1)
    (tide-hl-identifier-mode +1)
    ;; company is an optional dependency. You have to
    ;; install it separately via package-install
    ;; `M-x package-install [ret] company`
    (company-mode +1))

  (use-package tide
    :ensure t
    :after (typescript-mode company flycheck)
    :hook ((typescript-mode . setup-tide-mode)   ;; TODO: Update to tree-sitter in Emacs 29
           (js2-mode . setup-tide-mode)))
Web Mode
  ;; web-mode
  (setq web-mode-markup-indent-offset 2)
  (setq web-mode-code-indent-offset 2)
  (setq web-mode-css-indent-offset 2)
  (use-package web-mode
    :ensure t
    :mode (("\\.scss\\'" . web-mode)
           ("\\.css\\'" . web-mode)
           ("\\.jsx\\'" .  web-mode)
           ("\\.tsx\\'" . web-mode)
           ("\\.html\\'" . web-mode))
    :commands web-mode)
Prettier
  (use-package prettier-js
    :ensure t)
  (add-hook 'js2-mode-hook 'prettier-js-mode)
  (add-hook 'typescript-mode 'prettier-js-mode)
  (add-hook 'web-mode-hook 'prettier-js-mode)
Prisma
  (use-package prisma-mode
    :ensure t
    :straight '(prisma-mode
                :type git
                :host github
                :repo "pimeys/emacs-prisma-mode"))
Svelte
  (use-package svelte-mode
    :ensure t
    :straight '(svelte-mode
                :type git
                :host github
                :repo "leafOfTree/svelte-mode"))

Kotlin

  (use-package kotlin-mode
    :ensure t)

Java

  (use-package lsp-java
    :config (add-hook 'java-mode-hook 'lsp)
    :ensure t)
t

PHP

  (use-package php-mode
    :ensure t)

Format All The Buffers

  (use-package format-all
    :ensure t)
  (add-hook 'prog-mode-hook 'format-all-mode)
  (add-hook 'format-all-mode-hook 'format-all-ensure-formatter)
format-all-ensure-formatter

Multiple Cursors

  (use-package multiple-cursors
    :straight t
    :ensure   t
    :bind (("H-SPC" . set-rectangular-region-anchor)
           ("C-M-SPC" . set-rectangular-region-anchor)
           ("C->" . mc/mark-next-like-this)
           ("C-<" . mc/mark-previous-like-this)
           ("C-c C->" . mc/mark-all-like-this)
           ("C-c C-SPC" . mc/edit-lines)
           ))

Obsidian

  (use-package obsidian
    :ensure t
    :demand t
    :config
    (obsidian-specify-path "~/PersonalDocuments/Personal/TTRPG Vault")
    (global-obsidian-mode t)
    :custom
    :bind (:map obsidian-mode-map
                ("C-c C-o" . obsidian-follow-link-at-point)
                ("C-c C-b" . obsidian-backlink-jump)
                ("C-c C-l" . obsidian-insert-wikilink)))