Files
dotfiles/home/natto/config/emacs
Amneesh Singh f89fefa53d Satori: a.
Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
2022-03-28 04:57:27 +05:30
..
2022-03-28 04:57:27 +05:30
2022-03-18 06:24:13 +05:30
2022-03-18 06:24:13 +05:30

My Emacs Configuration

Color Variables

idk random variables to match my color theme

  ; -*- lexical-binding: t; -*-
(setq
c-bg        "#073642"
c-fg        "#eee8d5"
c-red       "#dc322f"
c-green     "#859900"
c-yellow    "#b58900"
c-blue      "#268bd2"
c-magenta   "#d33682"
c-cyan      "#2aa198"
c-white     "#eee8d5"
c-black     "#002b36"
c-red-2     "#cb4b16"
c-green-2   "#586e75"
c-yellow-2  "#657b83"
c-blue-2    "#839496"
c-magenta-2 "#6c71c4"
c-cyan-2    "#93a1a1"
c-white-2   "#fdf6e3")

Settings

Setting the default face

(setq default-frame-alist '((font . "Monoid-12")))

Some mode settings based on personal preferences

(global-hl-line-mode 1)
(scroll-bar-mode 0)
(tool-bar-mode 0)
(menu-bar-mode 0)
(fringe-mode 0)
;(cua-mode 1)
(global-display-line-numbers-mode 1)
(xterm-mouse-mode 1)

Setting some variables

SCHEDULED: <2022-03-19 Sat>

  (setq initial-major-mode 'emacs-lisp-mode
      frame-resize-pixelwise t
      auto-window-vscroll nil
      scroll-step 1
      display-line-numbers-type 'relative
      confirm-kill-processes nil
      dark-theme t
      inhibit-startup-screen t)
  (setq-default tab-width 2
                indent-tabs-mode nil)

Emacs startup hook

(add-hook 'emacs-startup-hook
          (lambda () (delete-other-windows)) t)

Packages

Add Melpa to package archives

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
(package-initialize)
(require 'use-package)

Visual packages

Add solaire mode

(use-package solaire-mode
  :config
  (solaire-mode))

Set theme

(use-package doom-themes
  :config
  (setq doom-themes-enable-bold t   
        doom-themes-enable-italic t
        doom-themes-treemacs-theme "doom-colors")
  (load-theme 'doom-solarized-dark t)
  (doom-themes-visual-bell-config)
  (doom-themes-treemacs-config)
  (doom-themes-org-config))

Configure Selectrum

Enable selectrum and remap keys to Colemak-DH

(use-package selectrum
  :config
  (define-key selectrum-minibuffer-map (kbd "C-n")  #'selectrum-next-candidate)
  (define-key selectrum-minibuffer-map (kbd "C-e")  #'selectrum-previous-candidate)
  (define-key selectrum-minibuffer-map (kbd "C-i")  #'selectrum-select-current-candidate)
  (selectrum-mode +1))

Add selectrum-prescient

(use-package selectrum-prescient
  :config
  (selectrum-prescient-mode +1)
  (prescient-persist-mode +1))

Add orderless for selectrum

(use-package orderless
  :after selectrum
  :config
  (setq completion-styles '(orderless))
  (savehist-mode)
  (setq orderless-skip-highlighting (lambda () selectrum-is-active))
  (setq selectrum-highlight-candidates-function #'orderless-highlight-matches))

Evil

Configure evil mode

(use-package evil
  :init
  (setq-default evil-shift-width 2)
  :config
  (evil-set-initial-state 'vterm-mode 'insert)
  (evil-set-undo-system 'undo-tree)
  (evil-mode 1))

Configure undo tree

To undo and redo easily like vi

(use-package undo-tree
  :config
  (global-undo-tree-mode 1))

Configure evil-colemak-basics

To get colemak-dh bindings in evil mode

(use-package evil-colemak-basics
  :init
  (setq evil-colemak-basics-layout-mod 'mod-dh)
  :config
  (global-evil-colemak-basics-mode 1))

Treemacs

Dependencies

(use-package cfrs)

Configure treemacs

(use-package treemacs
  :atfer cfrs
  :config
  (treemacs-filewatch-mode 1)
  (treemacs-display-current-project-exclusively)
  (treemacs-git-mode 'simple))

Configure treemacs-evil

Configure treemacs-evil to get colemak-dh bindings

  (use-package treemacs-evil :config
    (define-key evil-treemacs-state-map (kbd "n")   #'treemacs-next-line)
    (define-key evil-treemacs-state-map (kbd "e")   #'treemacs-previous-line)
    (define-key evil-treemacs-state-map (kbd "M-n") #'treemacs-next-neighbour)
    (define-key evil-treemacs-state-map (kbd "M-e") #'treemacs-previous-neighbour)
    (define-key evil-treemacs-state-map (kbd "M-N") #'treemacs-next-line-other-window)
    (define-key evil-treemacs-state-map (kbd "M-E") #'treemacs-previous-line-other-window)
  ;  (define-key evil-treemacs-state-map (kbd "M")   #'treemacs-collapse-parent-node)
    (define-key evil-treemacs-state-map (kbd "m") #'treemacs-COLLAPSE-action)
    (define-key evil-treemacs-state-map (kbd "i") #'treemacs-RET-action)
   )

LSP

Configure lsp-mode

(use-package lsp-mode
  :defer 0
  :init
  (setq )
  :config
  (lsp-mode 1))

Configure lsp-treemacs

(use-package lsp-treemacs
  :defer 0
  :config
  (lsp-treemacs-sync-mode 1))

Configure lsp-ui

(use-package lsp-ui
  :defer 0
  :init
  (setq lsp-ui-doc-show-with-cursor t)
  :config
  (lsp-ui-peek-enable 1)
  (lsp-ui-doc-enable 1))

Configure flycheck

(use-package flycheck)

Configure dap-mode

(use-package dap-mode)

Company

Configure company

For autocomplete

(use-package company
  :defer 0
  :after lsp-mode
  :config
  (define-key company-active-map (kbd "C-n") 'company-select-next)
  (define-key company-active-map (kbd "C-e") 'company-select-previous)
  (define-key company-search-map (kbd "C-n") 'company-select-next)
  (define-key company-search-map (kbd "C-e") 'company-select-previous))

Configure company-quickhelp

(use-package company-quickhelp
  :hook (company-mode . company-quickhelp-mode))

Treesitter

(use-package tree-sitter-langs)
(use-package tree-sitter
  :after tree-sitter-langs
  :config
  (global-tree-sitter-mode)
  :init 
  (add-to-list 'tree-sitter-major-mode-language-alist '(fundamental-mode . bash))
  (add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode))

Lang support

(use-package rustic)

(use-package nix-mode
  :mode "\\.nix\\'")

(use-package hcl-mode
  :mod 
  "\\.hcl\\'"
  "\\.nomad\\'")

Magit

(use-package magit)

VTerm

Configure vterm

(use-package vterm
  :config
  (setq vterm-timer-delay 0.005))

(use-package vterm-toggle 
  :config
  (setq vterm-toggle-fullscreen-p nil)
  (add-to-list 'display-buffer-alist
	      '((lambda(bufname _) (with-current-buffer bufname (equal major-mode 'vterm-mode)))
		(display-buffer-reuse-window display-buffer-at-bottom)
		(reusable-frames . visible)
		(window-height . 0.4))))

Centaur Tabs

(use-package centaur-tabs
  :config
  (setq centaur-tabs-style "box"
;        centaur-tabs-set-bar 'left
	centaur-tabs-height 18
	centaur-tabs-set-modified-marker t
	centaur-tabs-set-icons t)
  (centaur-tabs-group-buffer-groups)
  (add-hook 'server-after-make-frame-hook 'centaur-tabs-mode)
  (centaur-tabs-headline-match)
  (set-face-attribute 'tab-line nil :inherit 'centaur-tabs-unselected))

Misc packages

(use-package elcord
  :defer 0)

(use-package projectile)

(use-package rainbow-delimiters
  :hook (prog-mode . rainbow-delimiters-mode))

(use-package flex-autopair
  :config
  (flex-autopair-mode 1))

(use-package rainbow-mode
  :config
  (rainbow-mode 1))

(use-package treemacs-all-the-icons)

(use-package general)

Org

Add org-mode

(use-package org
  :after evil
  :config
  (define-key org-mode-map (kbd "RET") 'org-return-and-maybe-indent)
  (setq evil-want-C-i-jump nil)
  (evil-define-key 'normal org-mode-map (kbd "TAB") 'org-cycle))

Add org-bullets

 (use-package org-bullets
    :config
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))

Add helper packages for exporting

  (use-package htmlize)

Mode specific hooks

(add-hook 'c-mode-hook 'lsp)
(add-hook 'c++-mode-hook 'lsp)

Custom mode line

(defface mode-line-buf-name
  `((t :foreground ,c-fg
       :background ,c-bg
       :weight bold
     ))
  "Custom face for buffer name"
  :group 'mode-line-faces )
(defface mode-line-maj-mode
  `((t :foreground ,c-fg
       :background ,c-bg
     ))
  "Custom face for major mode"
  :group 'mode-line-faces )

(defface mode-line-vc
  `((t :foreground ,c-fg
       :background ,c-red-2
       :weight bold
     ))
  "Custom face for VC"
  :group 'mode-line-faces )
(defface mode-line-info
  `((t :foreground ,c-bg
       :background ,c-cyan
       :weight bold
     ))
  "For showing line and column number"
  :group 'mode-line-faces )


(setq-default mode-line-format
              '((:propertize " %b " face mode-line-buf-name)
                (vc-mode (:propertize (" " vc-mode " " ) face mode-line-vc))
                (:propertize (" " mode-name " ") face mode-line-maj-mode)
                (:propertize ("[[ %l | %c || %p . %+%@ ]]") face mode-line-info)
                ("%-")))

(setq exclude-ln '(term-mode-hook eshell-mode-hook shell-mode-hook))
(while exclude-ln
       (add-hook (car exclude-ln) (lambda () (display-line-numbers-mode 0)))
       (setq exclude-ln (cdr exclude-ln)))
(let ((default-color (cons (face-background 'mode-line)
                           (face-foreground 'mode-line))))
  (add-hook 'post-command-hook
       (lambda ()
         (let ((color (cond ((minibufferp) default-color)
                            ((evil-insert-state-p) (cons c-magenta c-fg))
                            ((evil-visual-state-p) (cons c-cyan    c-fg))
                            ((evil-normal-state-p) (cons c-fg      c-bg))
                            ((buffer-modified-p)   (cons c-blue    c-fg))
                            (t default-color))))
	   (set-face-background 'mode-line-buf-name (car color))
	   (set-face-foreground 'mode-line-buf-name (cdr color))
	   ))))

Pop-up terminal

Stolen from this reddit post

(defun run-in-vterm-kill (process event)
  "A process sentinel. Kills PROCESS's buffer if it is live."
  (let ((b (process-buffer process)))
    (and (buffer-live-p b)
         (kill-buffer b))))

(defun run-in-vterm (command)
  (interactive
   (list
    (let* ((f (cond (buffer-file-name)
                    ((eq major-mode 'dired-mode)
                     (dired-get-filename nil t))))
           (filename (concat " " (shell-quote-argument (and f (file-relative-name f))))))
      (read-shell-command "Terminal command: "
                          (cons filename 0)
                          (cons 'shell-command-history 1)
                          (list filename)))))
  (with-current-buffer (vterm-toggle)
    (set-process-sentinel vterm--process #'run-in-vterm-kill)
    (vterm-send-string (concat command))
    (vterm-send-return)))

This returns the command to run in the terminal

(defun candrun ()
  (let ((full buffer-file-name)
        (file (file-name-sans-extension buffer-file-name)))
    (pcase (file-name-extension full)
           ("c" (concat "gcc " full " -o " file " && " file " && rm " file))
           ("java" (concat "java" full))
           ("py" (concat "python" full))
           ("cpp" (concat "g++ " full " -o " file " && " file " && rm " file))
           ("hs" (concat "ghc -dynamic" full " && " file " && rm " file " " file ".o"))
           ("sh" (concat "sh" full))
           ("bash" (concat "bash" full))
           ("zsh" (concat "zsh" full))
           ("js" (concat "node" full))
           ("ts" (concat "tsc" full " && node " file ".js && rm " file ".js" ))
           ("rs" (concat "rustc" full " -o " file " && " file " && rm " file)))))

Keybinds

General

(with-eval-after-load 'general
(general-define-key
  :states '(normal emacs visual motion treemacs Eshell override)
  "M-o" 'treemacs
  "M-v" 'split-window-vertically
  "M-h" 'split-window-horizontally
  "M-C-m" 'shrink-window-horizontally
  "M-C-i" 'enlarge-window-horizontally
  "M-C-e" 'shrink-window
  "M-C-n" 'enlarge-window
  "C-m" 'windmove-left
  "C-i" 'windmove-right
  "C-n" 'windmove-down
  "C-e" 'windmove-up
  "M-,"  'previous-buffer
  "M-."  'next-buffer
  "C-q"  'delete-window
  "M-C-S-q"  'kill-buffer-and-window
  "M-w"  'centaur-tabs--kill-this-buffer-dont-ask
  "M-S-w"  'kill-window)

Pop-up terminal specific keybinds

(with-eval-after-load 'vterm-toggle
  (general-define-key
    :states '(override insert normal visual treemacs motion)
    "M-f" 'lsp-format-buffer
    "<f4>"  (lambda () (interactive) (vterm t))
    "C-<f1>" 'vterm-toggle-cd
    "<f1>" 'vterm-toggle
    "<f5>" (lambda () (interactive) (run-in-vterm (candrun))))

    (define-key vterm-mode-map (kbd "<f2>")   'vterm-toggle-forward)
    (define-key vterm-mode-map (kbd "<f3>")   'vterm-toggle-backward)

  (general-define-key
    :states '(normal insert)
    :keymaps 'VTerm
    "C-S-v" 'vterm-yank
    )
)

Toggle Appearance

(defun toggle-theme-shade ()
    (if (symbol-value dark-theme)
	(progn (disable-theme 'doom-solarized-dark)
	(load-theme 'doom-solarized-light t))
	(progn (disable-theme 'doom-solarized-light)
	(load-theme 'doom-solarized-dark t)))
    (setq-local dark-theme (not dark-theme)))

(general-define-key
    :states '(normal insert emacs)
    "<f7>" (lambda () (interactive) (toggle-theme-shade)))
)