bakmenson / emacs-config

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Emacs Config

Table Of Content

Early Init

garbage collection at startup

(setq gc-cons-threshold most-positive-fixnum
      gc-cons-percentage 0.6)

native compilation settings

(setq comp-deferred-compilation nil)

(when (featurep 'native-compile)
  ;; Silence compiler warnings as they can be pretty disruptive
  (setq native-comp-async-report-warnings-errors nil)

  ;; Make native compilation happens asynchronously
  (setq native-comp-deferred-compilation t)

  ;; Set the right directory to store the native compilation cache
  (add-to-list 'native-comp-eln-load-path (expand-file-name "eln-cache/" user-emacs-directory)))

disable package-enable-at-startup

In Emacs 27+, package initialization occurs before `user-init-file' is loaded, but after `early-init-file'. Doom handles package initialization, so we must prevent Emacs from doing it early!

(setq package-enable-at-startup nil)

Do not allow loading from the package cache (same reason).

(setq package-quickstart nil)

remove some unneeded UI elements

(setq inhibit-startup-message t)
(push '(tool-bar-lines . 0) default-frame-alist)
(push '(menu-bar-lines . 0) default-frame-alist)
(push '(vertical-scroll-bars) default-frame-alist)
(push '(background-color . "#232635") default-frame-alist)
(push '(foreground-color . "#FFFFFF") default-frame-alist)
(push '(mouse-color . "white") default-frame-alist)

make the initial buffer load faster

(setq initial-major-mode 'fundamental-mode)

frame inhibit

Resizing the Emacs frame can be a terribly expensive part of changing the font. By inhibiting this, we easily halve startup times with fonts that are larger than the system default.

(setq frame-inhibit-implied-resize t)

disable backup files

(setq make-backup-files nil)

disable Unnecessary Interface

(menu-bar-mode -1)
(tool-bar-mode -1)
(tooltip-mode -1)
(scroll-bar-mode -1)

(setq inhibit-splash-screen t)
(setq use-file-dialog nil)

startup optimization

  • Taken from DOOM's init

`file-name-handler-alist' is consulted on every `require', `load' and various path/io functions. You get a minor speed up by nooping this. However, this may cause problems on builds of Emacs where its site lisp files aren't byte-compiled and we're forced to load the *.el.gz files (e.g. on Alpine)

(unless (daemonp)
  (defvar doom--initial-file-name-handler-alist file-name-handler-alist)
  (setq file-name-handler-alist nil)
  ;; Restore `file-name-handler-alist' later, because it is needed for handling
  ;; encrypted or compressed files, among other things.
  (defun doom-reset-file-handler-alist-h ()
    ;; Re-add rather than `setq', because changes to `file-name-handler-alist'
    ;; since startup ought to be preserved.
    (dolist (handler file-name-handler-alist)
      (add-to-list 'doom--initial-file-name-handler-alist handler))
    (setq file-name-handler-alist doom--initial-file-name-handler-alist))
  (add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h)
  (add-hook 'after-init-hook (lambda ()
                                 ;; restore after startup
                                 (setq gc-cons-threshold 16777216
                                       gc-cons-percentage 0.1)))
  )
;; Ensure Doom is running out of this file's directory
(setq user-emacs-directory (file-truename (file-name-directory load-file-name)))

Package Management

  • Install straight.el
(defvar bootstrap-version)
(let ((bootstrap-file
      (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 5))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
        "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
        'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

Base Config

fonts

(defun bk/set-font-faces ()
  (set-face-attribute 'default nil
                      :font "JetBrains Mono"
                      :height 90
                      :weight 'normal)

  (set-face-attribute 'fixed-pitch nil
                      :font "JetBrains Mono"
                      :height 90
                      :weight 'normal)

  (set-face-attribute 'variable-pitch nil
                      :font "JetBrains Mono"
                      :height 90
                      :weight 'normal))

default coding system

(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)

cursor

(setq-default evil-normal-state-cursor '(box "medium sea green")
              evil-insert-state-cursor '(bar "medium sea green")
              evil-visual-state-cursor '(hollow "orange")
              blink-cursor-mode nil)

column number

  • enable column number mode
(column-number-mode)
  • Enable line numbers for some modes
(dolist (mode '(text-mode-hook
                prog-mode-hook
                conf-mode-hook))
  (add-hook mode (lambda ()
                   (display-line-numbers-mode 1)
                   (setq-default display-line-numbers-type 'relative))))

scrolling

  • Make scrolling less stuttered
(setq auto-window-vscroll nil)
(setq fast-but-imprecise-scrolling t)
(setq scroll-conservatively 101)
(setq scroll-margin 0)
(setq scroll-preserve-screen-position t)

prompts

  • Make ESC quit prompts
(global-set-key (kbd "<escape>") 'keyboard-escape-quit)
  • Use y and n to confirm/negate prompt instead of yes and no
(fset 'yes-or-no-p 'y-or-n-p)

gc

  • Make GC pauses faster by decreasing the threshold
(setq gc-cons-threshold (* 2 1000 1000))

Let it snow in Emacs!

(straight-use-package 'snow)

server mode

(server-start)

bell sound

;; (setq visible-bell nil)
(setq ring-bell-function `ignore)

Evil

evil

(straight-use-package 'evil)
  • Set some variables that must be configured before loading the package
(setq evil-want-integration t
    evil-want-keybinding nil
    ;; evil-want-C-u-scroll t
    ;; evil-want-C-i-jump nil
    evil-respect-visual-line-mode t
    evil-undo-system 'undo-fu)
  • Load Evil and enable it globally
(require 'evil)
(evil-mode 1)
  • set leader key in normal state
(evil-set-leader 'normal (kbd "SPC"))
  • set local leader in normal state for dired-mode
(evil-set-leader 'normal (kbd "M-SPC") t)

undo-fu

(straight-use-package 'undo-fu)

(define-key evil-normal-state-map "u" 'undo-fu-only-undo)
(define-key evil-normal-state-map "\C-r" 'undo-fu-only-redo)

evil-collection

(straight-use-package 'evil-collection)

(with-eval-after-load 'evil
  (evil-collection-init))

evil-nerd-commenter

(straight-use-package 'evil-nerd-commenter)

(global-set-key (kbd "M-/") 'evilnc-comment-or-uncomment-lines)

keep text selected after indentation

(defun bk/evil-shift-right ()
  (interactive)
  (evil-shift-right evil-visual-beginning evil-visual-end)
  (evil-normal-state)
  (evil-visual-restore))

(defun bk/evil-shift-left ()
  (interactive)
  (evil-shift-left evil-visual-beginning evil-visual-end)
  (evil-normal-state)
  (evil-visual-restore))

(evil-define-key 'visual global-map (kbd ">") 'bk/evil-shift-right)
(evil-define-key 'visual global-map (kbd "<") 'bk/evil-shift-left)

UI

icons

after first installation packaage all-the-icons M-x: all-the-icons-install-fonts

(straight-use-package 'all-the-icons)

theme

(straight-use-package 'doom-themes)

(setq doom-themes-enable-bold t
      doom-themes-enable-italic t
      doom-themes-visual-bell-config nil)

(doom-themes-org-config)
(load-theme 'doom-one t)

;; (straight-use-package 'catppuccin-theme)
;; (load-theme 'catppuccin :no-confirm)

modeline

(straight-use-package 'mood-line)
(mood-line-mode)

dashboard

(straight-use-package 'dashboard)

(setq dashboard-banner-logo-title "Welcome to Emacs!"
      dashboard-startup-banner 'logo
      dashboard-center-content t
      dashboard-items '((recents  . 10)
                        (projects . 10)
			            (bookmarks . 10))
      dashboard-set-heading-icons t
      dashboard-set-file-icons t
      dashboard-set-navigator t)

(dashboard-setup-startup-hook)
(defun bk/switch-to-dashboard ()
    (interactive)
    (switch-to-buffer dashboard-buffer-name)
    (dashboard-insert-startupify-lists)
    (dashboard-refresh-buffer))

transparecy

(set-frame-parameter (selected-frame) 'alpha '(95 . 95))
(add-to-list 'default-frame-alist '(alpha . (95 . 95)))

helpful

(straight-use-package 'helpful)
(require 'helpful)

visual fill

(straight-use-package 'visual-fill-column)

(dolist (mode '(org-mode-hook
                prog-mode-hook))
  (add-hook mode (lambda ()
		           (setq visual-fill-column-width 120
			             visual-fill-column-center-text t)
		           (visual-fill-column-mode 1))))

(add-hook 'dired-mode-hook (lambda ()
                             (setq visual-fill-column-width 200
                                   visual-fill-column-center-text t)
                             (visual-fill-column-mode 1)))

Daemon

(if (daemonp)
    (add-hook 'after-make-frame-functions
              (lambda (frame)
                (with-selected-frame frame
                  (load-theme 'doom-one t)
                  (setq telega-use-images '(scale rotate90)
                        telega-root-show-avatars '(scale rotate90)
                        telega-chat-show-avatars '(scale rotate90)
                        telega-user-show-avatars '(scale rotate90))
                  (bk/set-font-faces))))
  (bk/set-font-faces))

(add-hook 'server-after-make-frame-hook 'bk/switch-to-dashboard)

Buffers

reverts

  • Revert Dired and other buffers
(setq global-auto-revert-non-file-buffers t)
  • Revert buffers when the underlying file has changed
(global-auto-revert-mode 1)

map

(evil-define-key 'normal 'global
  (kbd "<leader>fs") 'save-buffer

  (kbd "<leader>bk") 'kill-this-buffer
  (kbd "<leader>bK") 'kill-buffer
  (kbd "<leader>bw") 'kill-buffer-and-window

  (kbd "<leader>bj") 'consult-bookmark
  (kbd "<leader>bs") 'bookmark-set

  (kbd "<leader>bl") 'evil-switch-to-windows-last-buffer

  (kbd "<leader>dd") 'dired
  (kbd "<leader>dj") 'dired-jump

  (kbd "<leader>wv") (lambda () (interactive) (evil-window-vsplit) (other-window 1))
  (kbd "<leader>ws") (lambda () (interactive) (evil-window-split) (other-window 1))
  (kbd "<leader>wh") 'evil-window-left
  (kbd "<leader>wl") 'evil-window-right
  (kbd "<leader>wj") 'evil-window-down
  (kbd "<leader>wk") 'evil-window-up
  (kbd "<leader>wd") 'delete-window
  (kbd "<leader>w=") 'balance-window
  (kbd "<leader>w+") 'evil-window-increase-height
  (kbd "<leader>w-") 'evil-window-decrease-height
  (kbd "<leader>w>") 'evil-window-increase-width
  (kbd "<leader>w<") 'evil-window-decrease-width)

Terminal

vterm

(straight-use-package 'vterm)

multi-vterm

(straight-use-package 'multi-vterm)

(evil-define-key 'normal 'global
  (kbd "<leader>to") 'multi-vterm
  (kbd "<leader>tn") 'multi-vterm-next
  (kbd "<leader>tp") 'multi-vterm-prev
  (kbd "<leader>tt") 'multi-vterm-dedicated-toggle)
(defun bk/exit-vtem-frame ()
  (interactive)
  (kill-this-buffer)
  (delete-frame))

(evil-define-key 'normal 'global
  (kbd "<leader>te") 'bk/exit-vtem-frame)

Dired

diredfl

(straight-use-package 'diredfl)
(add-hook 'dired-mode-hook 'diredfl-mode)

dired-rainbow

(straight-use-package 'dired-rainbow)

(require 'dired-rainbow)

(with-eval-after-load 'dired
  (progn
    (dired-rainbow-define-chmod directory "#6cb2eb" "d.*")
    (dired-rainbow-define html "#eb5286" ("css" "less" "sass" "scss" "htm" "html" "jhtm" "mht" "eml" "mustache" "xhtml"))
    (dired-rainbow-define xml "#f2d024" ("xml" "xsd" "xsl" "xslt" "wsdl" "bib" "json" "msg" "pgn" "rss" "yaml" "yml" "rdata"))
    (dired-rainbow-define document "#9561e2" ("docm" "doc" "docx" "odb" "odt" "pdb" "pdf" "ps" "rtf" "djvu" "epub" "odp" "ppt" "pptx"))
    (dired-rainbow-define markdown "#ffed4a" ("org" "etx" "info" "markdown" "md" "mkd" "nfo" "pod" "rst" "tex" "textfile" "txt"))
    (dired-rainbow-define database "#6574cd" ("xlsx" "xls" "csv" "accdb" "db" "mdb" "sqlite" "nc"))
    (dired-rainbow-define media "#de751f" ("mp3" "mp4" "MP3" "MP4" "avi" "mpeg" "mpg" "flv" "ogg" "mov" "mid" "midi" "wav" "aiff" "flac" "mkv"))
    (dired-rainbow-define image "#f66d9b" ("tiff" "tif" "cdr" "gif" "ico" "jpeg" "jpg" "png" "psd" "eps" "svg"))
    (dired-rainbow-define log "#c17d11" ("log"))
    (dired-rainbow-define shell "#f6993f" ("awk" "bash" "bat" "sed" "sh" "zsh" "vim"))
    (dired-rainbow-define interpreted "#38c172" ("py" "ipynb" "rb" "pl" "t" "msql" "mysql" "pgsql" "sql" "r" "clj" "cljs" "scala" "js"))
    (dired-rainbow-define compiled "#4dc0b5" ("asm" "cl" "lisp" "el" "c" "h" "c++" "h++" "hpp" "hxx" "m" "cc" "cs" "cp" "cpp" "go" "f" "for" "ftn" "f90" "f95" "f03" "f08" "s" "rs" "hi" "hs" "pyc" ".java"))
    (dired-rainbow-define executable "#8cc4ff" ("exe" "msi"))
    (dired-rainbow-define compressed "#51d88a" ("7z" "zip" "bz2" "tgz" "txz" "gz" "xz" "z" "Z" "jar" "war" "ear" "rar" "sar" "xpi" "apk" "xz" "tar"))
    (dired-rainbow-define packaged "#faad63" ("deb" "rpm" "apk" "jad" "jar" "cab" "pak" "pk3" "vdf" "vpk" "bsp"))
    (dired-rainbow-define encrypted "#ffed4a" ("gpg" "pgp" "asc" "bfe" "enc" "signature" "sig" "p12" "pem"))
    (dired-rainbow-define fonts "#6cb2eb" ("afm" "fon" "fnt" "pfb" "pfm" "ttf" "otf"))
    (dired-rainbow-define partition "#e3342f" ("dmg" "iso" "bin" "nrg" "qcow" "toast" "vcd" "vmdk" "bak"))
    (dired-rainbow-define vc "#0074d9" ("git" "gitignore" "gitattributes" "gitmodules"))
    (dired-rainbow-define-chmod executable-unix "#38c172" "-.*x.*")
    ))

dired-open

(straight-use-package 'dired-open)

(require 'dired-open)

(with-eval-after-load 'dired
  (setq dired-open-extensions
        '(("mkv" . "mpv")
          ("mp4" . "mpv")
          ("avi" . "mpv")
          ("webm" . "mpv")
          ;; ("html" . "firefox")
          )))

dired-icons

(straight-use-package 'all-the-icons-dired)
(add-hook 'dired-mode-hook 'all-the-icons-dired-mode)

bookmarks

(setq bookmark-default-file "~/.emacs-bookmarks")

map

(evil-collection-define-key 'normal 'dired-mode-map
  "h" 'dired-up-directory
  "l" 'dired-find-file)
(evil-define-key 'normal dired-mode-map
  (kbd "<localleader>hF") #'helpful-function
  (kbd "<localleader>hC") #'helpful-command

  (kbd "<localleader>fs") 'save-buffer
  (kbd "<localleader>ff") 'find-file

  (kbd "<localleader>.") 'persp-switch-to-buffer*
  (kbd "<localleader>,") 'consult-buffer

  (kbd "<localleader>tt") 'multi-vterm

  (kbd "<localleader>bK") 'kill-buffer
  (kbd "<localleader>bk") 'kill-this-buffer
  (kbd "<localleader>bw") 'kill-buffer-and-window

  (kbd "<localleader>bl") 'evil-switch-to-windows-last-buffer

  (kbd "<localleader>bj") 'consult-bookmark
  (kbd "<localleader>bs") 'bookmark-set

  (kbd "<localleader>df") 'delete-frame

  (kbd "<localleader><tab>n") 'persp-next
  (kbd "<localleader><tab>p") 'persp-prev
  (kbd "<localleader><tab>k") 'persp-kill
  (kbd "<localleader><tab>b") 'persp-kill-buffer* ; kill perspective buffer
  (kbd "<localleader><tab>K") 'persp-kill-others
  (kbd "<localleader><tab>l") 'persp-switch-last
  (kbd "<localleader><tab>.") 'persp-switch ; switch by name
  (kbd "<localleader><tab>r") 'persp-remove-buffer ; remove buffer from current perspective
  (kbd "<localleader><tab>R") 'persp-rename
  (kbd "<localleader><tab>s") 'persp-state-save ; save persp
  (kbd "<localleader><tab>L") 'persp-state-load ; load persp

  (kbd "<localleader>wv") (lambda () (interactive) (evil-window-vsplit) (other-window 1))
  (kbd "<localleader>ws") (lambda () (interactive) (evil-window-split) (other-window 1))
  (kbd "<localleader>wh") 'evil-window-left
  (kbd "<localleader>wl") 'evil-window-right
  (kbd "<localleader>wj") 'evil-window-down
  (kbd "<localleader>wk") 'evil-window-up
  (kbd "<localleader>wd") 'evil-window-delete
  (kbd "<localleader>qq") 'kill-emacs
  (kbd "<localleader>wq") 'save-buffers-kill-emacs)

Org

org-mode

(straight-use-package 'org)
;; (straight-use-package '(org :type built-in))

(add-hook 'org-mode-hook (lambda ()
                           (org-indent-mode)
                           (variable-pitch-mode 1)
                           (auto-fill-mode 0)
                           (visual-line-mode 1)
                           (setq evil-auto-indent nil)
                           (display-line-numbers-mode 0)))

(setq org-ellipsis " â–ľ"
      org-hide-emphasis-markers t
      org-src-preserve-indentation t
      org-startup-folded t)

superstar

(straight-use-package 'org-superstar)

(with-eval-after-load "org"
  (add-hook 'org-mode-hook 'org-superstar-mode)

  (setq org-superstar-remove-leading-stars t
	org-superstar-headline-bullets-list '("â—‰" "â—‹" "â—Ź" "â—‹" "â—Ź" "â—‹" "â—Ź")))

org indent

  • Make sure org-indent face is available
(require 'org-indent)

;; Ensure that anything that should be fixed-pitch in Org files appears that way
(set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch)
(set-face-attribute 'org-table nil  :inherit 'fixed-pitch)
(set-face-attribute 'org-formula nil  :inherit 'fixed-pitch)
(set-face-attribute 'org-code nil   :inherit '(shadow fixed-pitch))
(set-face-attribute 'org-indent nil :inherit '(org-hide fixed-pitch))
(set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
(set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch))
(set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch))
(set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch)

rid of the background

  • Get rid of the background on column views
(set-face-attribute 'org-column nil :background nil)
(set-face-attribute 'org-column-title nil :background nil)

babel

Confirm Evaluate

(setq org-confirm-babel-evaluate nil)

Load languages

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

structure templates

(require 'org-tempo)

(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("p" . "src python"))
(add-to-list 'org-structure-template-alist '("cf" . "src conf"))
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("yl" . "src yaml"))
(add-to-list 'org-structure-template-alist '("vr" . "src vimrc"))
(add-to-list 'org-structure-template-alist '("scc" . "src scc"))

toc-org

(straight-use-package 'toc-org)
(add-hook 'org-mode-hook 'toc-org-mode)

map

(evil-define-key 'normal org-mode-map
  ">" 'org-shiftmetaright
  "<" 'org-shiftmetaleft
  (kbd "<leader>obt") 'org-babel-tangle)

Files

sudo-edit

(straight-use-package 'sudo-edit)

pdf

(straight-use-package 'pdf-tools)
(pdf-tools-install)
(setq-default pdf-view-display-size 'fit-page)

recent files

(recentf-mode 1)
(setq recentf-max-saved-items 50)

map

(evil-define-key 'normal 'global
  (kbd "<leader>ff") 'find-file
  (kbd "<leader>fr") 'recentf-open-files)

Workspaces

persp-mode

  • =’persp-modestring-short’= - only displays the current perspective
(straight-use-package 'perspective)

(setq-default persp-initial-frame-name "Main"
              persp-modestring-short t
              persp-show-modestring nil
              ;;(persp-format-name NAME)
              ;; persp-modestring-dividers '("| " " |" " | ") ; Its value is ("[" "]" "|")
              persp-modestring-dividers '("  " "  " " | ")
              persp-state-default-file "~/.persp"
              persp-suppress-no-prefix-key-warning t)

;; Running `persp-mode' multiple times resets the perspective list...
(unless (equal persp-mode t)
  (persp-mode))

map

(evil-define-key 'normal 'global
  (kbd "<leader>.") 'persp-switch-to-buffer*

  (kbd "<leader><tab>n") 'persp-next
  (kbd "<leader><tab>p") 'persp-prev
  (kbd "<leader><tab>k") 'persp-kill
  (kbd "<leader><tab>b") 'persp-kill-buffer* ; kill perspective buffer
  (kbd "<leader><tab>K") 'persp-kill-others
  (kbd "<leader><tab>l") 'persp-switch-last
  (kbd "<leader><tab>.") 'persp-switch ; switch by name
  (kbd "<leader><tab>r") 'persp-remove-buffer ; remove buffer from current perspective
  (kbd "<leader><tab>R") 'persp-rename
  (kbd "<leader><tab>s") 'persp-state-save ; save persp
  (kbd "<leader><tab>L") 'persp-state-load) ; load persp

Projectile

(straight-use-package 'projectile)

(projectile-mode +1)

(define-key projectile-mode-map (kbd "<localleader>p") 'projectile-command-map)

(setq projectile-switch-project-action #'projectile-dired)

Completion

vertico

(straight-use-package 'vertico)

(vertico-mode 1)
(customize-set-variable 'vertico-cycle t)

(require 'vertico)
;; (require 'vertico-directory "extensions/vertico-directory.el")

(with-eval-after-load "evil"
  (define-key vertico-map (kbd "C-j") 'vertico-next)
  (define-key vertico-map (kbd "C-k") 'vertico-previous)
  (define-key vertico-map [backspace] 'vertico-directory-delete-char))

counsel

(straight-use-package 'counsel)

;; (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history)
;; (global-set-key (kbd "M-x") 'counsel-M-x)
;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
;; (global-set-key (kbd "C-h f") 'counsel-describe-function)
;; (global-set-key (kbd "C-h v") 'counsel-describe-variable)
;; (global-set-key (kbd "C-h o") 'counsel-describe-symbol)
;; (global-set-key (kbd "C-h b") 'counsel-descbinds)
;; (global-set-key (kbd "C-c g") 'counsel-git)
;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
;; (global-set-key (kbd "C-c k") 'counsel-ag)
(global-set-key (kbd "C-c m") 'counsel-linux-app)
;; (global-set-key (kbd "C-c n") 'counsel-fzf)
;; (global-set-key (kbd "C-x l") 'counsel-locate)

marginalia

(straight-use-package 'marginalia)

(with-eval-after-load "vertico"
  (setq marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil))
  (marginalia-mode 1))

orderless

(straight-use-package 'orderless)

(require 'orderless)
(customize-set-variable 'completion-styles '(orderless))
(customize-set-variable 'completion-category-overrides '((file (styles . (partial-completion)))))
(setq completion-category-defaults nil)

consult

(straight-use-package 'consult)

(global-set-key (kbd "C-s") 'consult-line)
(define-key minibuffer-local-map (kbd "C-r") 'consult-history)

(setq completion-in-region-function #'consult-completion-in-region)
(define-key minibuffer-local-map (kbd "C-r") 'consult-history)

(evil-define-key 'normal 'global
  (kbd "<leader>,") 'consult-buffer)

embark

(straight-use-package 'embark)

(global-set-key [remap describe-bindings] #'embark-bindings)
(global-set-key (kbd "C-.") 'embark-act)

;; Use Embark to show bindings in a key prefix with `C-h`
(setq prefix-help-command #'embark-prefix-help-command)

embark-consult

(straight-use-package 'embark-consult)

(with-eval-after-load "embark consult"
  (add-hook 'embark-collect-mode 'consult-preview-at-point-mode))

savehist

  • Persist history over Emacs restarts. Vertico sorts by history position
(savehist-mode 1)

minibuffer backward kill

(defun bk/minibuffer-backward-kill (arg)
  "When minibuffer is completing a file name delete up to parent
folder, otherwise delete a word"
  (interactive "p")
  (if minibuffer-completing-file-name
      ;; Borrowed from https://github.com/raxod502/selectrum/issues/498#issuecomment-803283608
      (if (string-match-p "/." (minibuffer-contents))
          (zap-up-to-char (- arg) ?/)
        (delete-minibuffer-contents))
    (backward-kill-word arg)))

Editing

ws-butler

  • Set up ws-butler for trimming whitespace and line endings
(straight-use-package 'ws-butler)

(add-hook 'text-mode-hook 'ws-butler-mode)
(add-hook 'prog-mode-hook 'ws-butler-mode)

kill-ring

  • Do not saves duplicates in kill-ring
(setq kill-do-not-save-duplicates t)

space/tabs

  • Use spaces instead of tabs
(setq-default indent-tabs-mode nil
              tab-width 4)

save-place

(save-place-mode 1)

parentheses

(show-paren-mode 1)
(electric-pair-mode 1)

Company

company

(straight-use-package 'company)

(add-hook 'after-init-hook 'global-company-mode)

(setq company-minimum-prefix-length 3)
(setq company-idle-delay 0.3)

company-box

(straight-use-package 'company-box)
(add-hook 'company-mode-hook 'company-box-mode)

Coding

git

magit

(straight-use-package 'magit)

diff-hl

(straight-use-package 'diff-hl)

(global-diff-hl-mode 1)
(diff-hl-flydiff-mode 1)

(add-hook 'magit-pre-refresh-hook 'diff-hl-magit-pre-refresh)
(add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh)

map

(evil-define-key 'normal 'global
  (kbd "<leader>glc") 'magit-log-current
  (kbd "<leader>glf") 'magit-log-buffer-file
  (kbd "<leader>gc") 'magit-commit
  (kbd "<leader>gs") 'magit-status
  (kbd "<leader>gdu") 'magit-diff-unstaged
  (kbd "<leader>gc") 'magit-branch-or-checkout
  (kbd "<leader>gb") 'magit-branch
  (kbd "<leader>gp") 'magit-push-current
  (kbd "<leader>gP") 'magit-pull-branch
  (kbd "<leader>gf") 'magit-fetch
  (kbd "<leader>gF") 'magit-fetch-all
  (kbd "<leader>gr") 'magit-rebase)

lsp

(straight-use-package 'lsp-mode)

(setq lsp-keymap-prefix "<leader>l")

(setq lsp-enable-folding nil
      lsp-enable-text-document-color nil
      lsp-enable-on-type-formatting nil
      lsp-headerline-breadcrumb-enable nil
      lsp-keep-workspace-alive nil
      lsp-auto-guess-root t)

lsp-ui

(straight-use-package 'lsp-ui)

tree-sitter

install

(straight-use-package 'tree-sitter)
(straight-use-package 'tree-sitter-langs)

load the framework and the language bundle:

(require 'tree-sitter)
(require 'tree-sitter-langs)

enable

(global-tree-sitter-mode)
(add-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)

treemacs

(straight-use-package 'treemacs)

(evil-define-key 'normal 'global
  (kbd "<leader>et") 'treemacs)

rust

rust mode

(straight-use-package 'rust-mode)

cargo

(straight-use-package 'cargo)
(add-hook 'rust-mode-hook 'cargo-minor-mode)

python

(straight-use-package 'python-mode)
(straight-use-package 'lsp-pyright)

(require 'lsp-pyright)
;; (add-hook 'python-mode-hook #'lsp-deferred)

java

(straight-use-package 'lsp-java)

(require 'lsp-java)
;; (add-hook 'java-mode-hook #'lsp-deferred)

flycheck

(straight-use-package 'flycheck)
(straight-use-package 'flycheck-rust)
(require 'flycheck)
(add-hook 'after-init-hook #'global-flycheck-mode)
(setq flycheck-check-syntax-automatically '(save
                                            idle-change
                                            mode-enabled))

(add-hook 'emacs-lisp-mode-hook (lambda ()
                                  (flycheck--emacs-lisp-checkdoc-enabled-p)))
(with-eval-after-load 'rust-mode
  (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))

bash

#- Make shebang (#!) file executable when saved

(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)

yasnippet

(straight-use-package 'yasnippet)
(require 'yasnippet)
(yas-global-mode 1)

yaml

(straight-use-package 'yaml-mode)
(add-hook 'yaml-mode-hook 'yaml-mode)

Emacs

(evil-define-key 'normal 'global
  (kbd "<leader>qq") 'kill-emacs
  (kbd "<leader>wq") 'save-buffers-kill-emacs
  (kbd "<leader>df") 'delete-frame
  )

Telega

;; (straight-use-package 'telega)

;; (dolist (mode '(telega-root-mode-hook
;;                telega-webpage-mode-hook))
;;  (add-hook mode (lambda ()
;;                   (setq visual-fill-column-width 120
;;                         visual-fill-column-center-text t)
;;                   (visual-fill-column-mode 1))))

;; (add-hook 'telega-chat-mode-hook (lambda ()
;;                                   (setq visual-fill-column-width 75
;;                                         visual-fill-column-center-text t)
;;                                   (visual-fill-column-mode 1)))

;; ;; (telega-mode-line-mode 1)
;; (telega-notifications-mode 1)

;; (defun bk/telega-msg-count ()
;;   (let ((msg_unmuted_count (plist-get telega--unread-message-count :unread_unmuted_count))
;;         (chat_unmuted_count (plist-get telega--unread-chat-count :unread_unmuted_count)))
;;     (with-temp-file "~/.telega-msg-count.txt"
;;       (insert (format "%s(%s)"
;;                       chat_unmuted_count msg_unmuted_count)))))

;; (add-hook 'telega-root-update-hook 'bk/telega-msg-count)

Async

(straight-use-package 'async)

bytecomp async

(async-bytecomp-package-mode 1)

dired-async

(autoload 'dired-async-mode "dired-async.el" nil t)
(dired-async-mode 1)

About