(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))
I’m using both Evil and Evil collection, as it’s better than just evil. We will enable some configurations, thus making it a bit better.
(use-package evil
:ensure t
:init
(setq evil-want-keybinding nil)
(setq evil-vsplit-window-right t)
(setq evil-want-C-u-scroll t)
(setq evil-split-window-below t)
(evil-mode))
(use-package evil-collection
:after evil
:ensure t
:config
(evil-collection-init))
I typically use the Dracula theme, but its good to mix.
(use-package dracula-theme
:ensure t)
(use-package catppuccin-theme
:ensure t)
(use-package nord-theme
:ensure t)
(use-package doom-themes
:ensure t)
Dirvish is my file manager of choice, and it is also based off Dired.
(use-package dirvish
:ensure t)
Here we can also override dired by using this configuration
(dirvish-override-dired-mode)
General gives us some nice features for other packages.
(use-package general
:ensure t
:config
(general-evil-setup t))
Just a simple icon plugin
(use-package all-the-icons)
(use-package projectile
:config
(projectile-global-mode 1))
Neotree is a plugin that gives us a nice little “file manager” on the side of emacs.
(use-package neotree
:ensure t)
Here we can enable some nice defaults
(setq neo-smart-open t
neo-window-width 35
neo-theme (if (display-graphic-p) 'icons 'arrow)
inhibit-compacting-font-caches t
projectile-switch-project-action 'neotree-projectile-action)
(add-hook 'neo-after-create-hook
#'(lambda (_)
(with-current-buffer (get-buffer neo-buffer-name)
(setq truncate-lines t)
(setq word-wrap nil)
(make-local-variable 'auto-hscroll-mode)
(setq auto-hscroll-mode nil))))
(defcustom neo-window-width 25
"*Specifies the width of the NeoTree window."
:type 'integer
:group 'neotree)
(setq-default neo-show-hidden-files t)
(use-package tree-sitter
:ensure t)
(use-package tree-sitter-langs
:ensure t)
Here I’ll just do all the configurations inside the init block.
(use-package dashboard
:init ;; tweak dashboard config before loading it
(setq dashboard-set-heading-icons t)
(setq dashboard-set-file-icons t)
(setq dashboard-banner-logo-title "real programmers use vi")
;;(setq dashboard-startup-banner 'logo) ;; use standard emacs logo as banner
(setq dashboard-startup-banner "~/.emacs.d/.local/logo.png") ;; use custom image as banner
(setq dashboard-center-content t) ;; set to 't' for centered content
(setq dashboard-items '((recents . 5)
(agenda . 5 )
(bookmarks . 3)
(projects . 3)))
:config
(dashboard-setup-startup-hook)
(dashboard-modify-heading-icons '((recents . "file-text")
(bookmarks . "book"))))
(use-package smex
:ensure t
:config
(smex-initialize))
(use-package vertico
:ensure t
:bind (:map vertico-map
("C-j" . vertico-next)
("C-k" . vertico-previous)
("C-f" . vertico-exit))
:custom
(vertico-cycle t)
:init
(vertico-mode))
(use-package marginalia
:after vertico
:ensure t
:custom
(marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil))
:init
(marginalia-mode))
I prefer vterm
(use-package vterm
:ensure t)
Which key helps with ‘definitions’ for functions
(use-package which-key
:config
(which-key-mode))
(use-package sublimity
:ensure t
:config
(sublimity-mode 1))
(use-package flycheck
:ensure t
:init
(global-flycheck-mode t))
(use-package emojify
:hook (after-init . global-emojify-mode))
(use-package writegood-mode
:ensure t)
(use-package auto-complete
:ensure t
:init
(progn
(ac-config-default)
(global-auto-complete-mode t)
))
(use-package yasnippet
:ensure t)
(use-package org-bullets)
(use-package ox-asciidoc
:ensure t)
Here we can also just enable org bullets for org files.
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
(use-package doom-modeline
:ensure t
:init (doom-modeline-mode 1))
(setq use-short-answers t)
(setq make-backup-files nil)
(tool-bar-mode -1)
(menu-bar-mode -1)
(tab-bar-mode -1)
(scroll-bar-mode -1)
(setq doom-themes-enable-bold t
doom-themes-enable-italic t)
(load-theme 'dracula t)
(add-to-list 'default-frame-alist '(font . "Inconsolata-17"))
(setq warning-minimum-level :emergency)
(when (version<= "26.0.50" emacs-version )
(global-display-line-numbers-mode))
(setq display-line-numbers-type 'relative)
(setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*")))
(setq temporary-file-directory "~/.tmp/")
(setq backup-directory-alist
`((".*" . ,temporary-file-directory)))
(setq auto-save-default nil)
(yas-global-mode 1)
(tree-sitter-require 'cpp)
(tree-sitter-require 'c)
(tree-sitter-require 'haskell)
(global-tree-sitter-mode)
(add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)
(define-key evil-insert-state-map (kbd "TAB") 'tab-to-tab-stop)
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)
I personally like doing this, though it will break some stuff, so you probably shouldn’t use it
(define-key evil-insert-state-map (kbd "C-c") 'evil-normal-state)
(define-key evil-normal-state-map (kbd "C-c") 'evil-normal-state)
(define-key key-translation-map (kbd "C-c C-c") (kbd "C-g"))
These are just some doom emacs keybinds I like having
(nvmap :prefix "SPC"
"t n" '(neotree-toggle :which-key "Toggle neotree file viewer")
"d n" '(neotree-dir :which-key "Open directory in neotree"))
(nvmap :keymaps 'override :prefix "SPC"
"SPC" '(counsel-M-x :which-key "M-x")
"." '(find-file :which-key "Find file")
"c c" '(compile :which-key "Compile")
"f f" '(dirvish :which-key "Dirvish")
"c C" '(recompile :which-key "Recompile")
"h r r" '((lambda () (interactive) (load-file "~/.emacs.d/init.el")) :which-key "Reload emacs config")
"t t" '(toggle-truncate-lines :which-key "Toggle truncate lines"))
(nvmap :prefix "SPC"
"b b" '(ibuffer :which-key "Ibuffer")
"b c" '(clone-indirect-buffer-other-window :which-key "Clone indirect buffer other window")
"b k" '(kill-current-buffer :which-key "Kill current buffer")
"b n" '(next-buffer :which-key "Next buffer")
"b p" '(previous-buffer :which-key "Previous buffer")
"b B" '(ibuffer-list-buffers :which-key "Ibuffer list buffers")
"b K" '(kill-buffer :which-key "Kill buffer")
"r f" '(dashboard-refresh-buffer :which-key "Refresh buffer"))
;; just for neotree
(evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter)
(evil-define-key 'normal neotree-mode-map (kbd "SPC") 'neotree-quick-look)
(evil-define-key 'normal neotree-mode-map (kbd "q") 'neotree-hide)
(evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter)
(evil-define-key 'normal neotree-mode-map (kbd "g") 'neotree-refresh)
(evil-define-key 'normal neotree-mode-map (kbd "n") 'neotree-next-line)
(evil-define-key 'normal neotree-mode-map (kbd "p") 'neotree-previous-line)
(evil-define-key 'normal neotree-mode-map (kbd "A") 'neotree-stretch-toggle)
(evil-define-key 'normal neotree-mode-map (kbd "H") 'neotree-hidden-file-toggle)
(evil-define-key 'normal neotree-mode-map (kbd "w") 'neotree-create-node)
(define-key evil-normal-state-map "u" 'evil-undo)
(define-key evil-normal-state-map (kbd "C-r") 'undo-tree-redo)
(setq doom-modeline-time-icon t)
(setq doom-modeline-icon t)
(setq doom-modeline-buffer-file-name-style 'auto)
(setq doom-modeline-buffer-name t)
(setq doom-modeline-indent-info nil)
(setq doom-modeline-buffer-encoding t)
(setq doom-modeline-enable-word-count nil)
(defun save-and-kill-this-buffer()
"Quits the buffer"
(interactive)
(save-buffer)
(kill-current-buffer))
(defun quit-buffer()
"Quits the buffer"
(interactive)
(kill-current-buffer))
And here are the keybinds
(evil-ex-define-cmd "wq" 'save-and-kill-this-buffer)
(evil-ex-define-cmd "q" 'quit-buffer)
(defun electric-pair ()
"Autoconnects a given char with another"
(interactive)
(if (eolp) (let (parens-require-spaces) (insert-pair)) (self-insert-command 1)))
And here are the hooks we define.
(add-hook 'c-mode-hook
(lambda ()
(define-key c-mode-map "\"" 'electric-pair)
(define-key c-mode-map "\'" 'electric-pair)
(define-key c-mode-map "(" 'electric-pair)
(define-key c-mode-map "[" 'electric-pair)
(define-key c-mode-map "{" 'electric-pair)))
(add-hook 'lisp-mode-hook
(lambda ()
(define-key lisp-mode-map "\"" 'electric-pair)
(define-key lisp-mode-map "\'" 'electric-pair)
(define-key lisp-mode-map "(" 'electric-pair)
(define-key lisp-mode-map "[" 'electric-pair)
(define-key lisp-mode-map "{" 'electric-pair)))
(add-hook 'scheme-mode-hook
(lambda ()
(define-key scheme-mode-map "\"" 'electric-pair)
(define-key scheme-mode-map "\'" 'electric-pair)
(define-key scheme-mode-map "(" 'electric-pair)
(define-key scheme-mode-map "[" 'electric-pair)
(define-key scheme-mode-map "{" 'electric-pair)))
;;(add-hook 'haskell-mode-hook
;; (lambda ()
;; (define-key haskell-mode-map "\"" 'electric-pair)
;; (define-key haskell-mode-map "\'" 'electric-pair)
;; (define-key haskell-mode-map "(" 'electric-pair)
;; (define-key haskell-mode-map "[" 'electric-pair)
;; (define-key haskell-mode-map "{" 'electric-pair)))
(defun my-gc-function ()
(setq gc-cons-threshold 800000)
(defun my-gc-function ()
(garbage-collect)))
And here is the hook for it.
(add-hook 'focus-out-hook #'my-gc-function)
(add-hook 'org-mode-hook 'flyspell-mode)
(add-hook 'org-mode-hook 'org-indent-mode)
(add-hook 'org-mode-hook 'writegood-mode)