Skip to content

71zenith/emacs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

63 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

イーマックス コンフィグ

screenshot2.png

The following is my updated emacs config with specific focus on writing code and backs down on features such as org mode and general emacs stuff as much. As usual it has been concentrated into early-init.el and init.el.

I have made an effort into using as much as possible emacs built in packages such as project.el instead of projectile.

Theme is oxocarbon-dark provided by stylix-nix. Font is iosevka-comfy (monospace) and product-sans/google-sans (sans/sans-serif).

Notable mentions

  • lsp-bridge (leverages multithreading capabilities of python to make the lsp interaction mostly async)
  • meow (a modal key system similar to kakoune)
  • new-gen (what i’d like to call the modern emacs goodness e.g. vertico/embark/consult)

early-init.el

;;; early-init.el -*- lexical-binding: t; -*-
(setq-default package-enable-at-startup nil
              use-dialog-box nil
              file-name-handler-alist nil
              frame-inhibit-implied-resize t
              load-prefer-newer t
              inhibit-compacting-font-caches t
              warning-minimum-level :error
              use-package-always-ensure t)

(defvar native-comp-async-report-warnings-errors 'silent)
(defvar file-name-handler-alist-old file-name-handler-alist)
(defvar vc-handled-backends-old vc-handled-backends)

(setq file-name-handler-alist nil
      vc-handled-backends nil
      gc-cons-percentage 0.5
      highlight-nonselected-windows nil
      fast-but-imprecise-scrolling t
      idle-update-delay 1.0
      gc-cons-threshold most-positive-fixnum)

(add-hook 'after-init-hook
          `(lambda ()
             (setq file-name-handler-alist file-name-handler-alist-old)
             (setq vc-handled-backends vc-handled-backends-old)
             (setq gc-cons-threshold (* 8 100000 100000))
             (setq gc-cons-percentage 0.1)
             (set-frame-parameter nil 'alpha-background 85)
             (add-to-list 'default-frame-alist '(alpha-background . 85)))
          t)

(add-hook 'emacs-startup-hook
          (lambda ()
            (message "Emacs ready in %s with %d garbage collections."
                     (format "%.2f seconds"
                             (float-time
                              (time-subtract after-init-time before-init-time)))
                     gcs-done)))

(add-to-list 'default-frame-alist '(background-color . "#161616"))

(setq-default default-frame-alist
              '((tool-bar-lines . 0)
                (menu-bar-lines . 0)
                (undecorated . t)
                (vertical-scroll-bars . nil)
                (horizontal-scroll-bars . nil)))

init.el

elpaca

;;; init.el -*- lexical-binding: t; -*-
(defvar elpaca-installer-version 0.7)
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
                              :ref nil :depth 1
                              :files (:defaults "elpaca-test.el" (:exclude "extensions"))
                              :build (:not elpaca--activate-package)))
(let* ((repo  (expand-file-name "elpaca/" elpaca-repos-directory))
       (build (expand-file-name "elpaca/" elpaca-builds-directory))
       (order (cdr elpaca-order))
       (default-directory repo))
  (add-to-list 'load-path (if (file-exists-p build) build repo))
  (unless (file-exists-p repo)
    (make-directory repo t)
    (when (< emacs-major-version 28) (require 'subr-x))
    (condition-case-unless-debug err
        (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
                 ((zerop (apply #'call-process `("git" nil ,buffer t "clone"
                                                 ,@(when-let ((depth (plist-get order :depth)))
                                                     (list (format "--depth=%d" depth) "--no-single-branch"))
                                                 ,(plist-get order :repo) ,repo))))
                 ((zerop (call-process "git" nil buffer t "checkout"
                                       (or (plist-get order :ref) "--"))))
                 (emacs (concat invocation-directory invocation-name))
                 ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
                                       "--eval" "(byte-recompile-directory \".\" 0 'force)")))
                 ((require 'elpaca))
                 ((elpaca-generate-autoloads "elpaca" repo)))
            (progn (message "%s" (buffer-string)) (kill-buffer buffer))
          (error "%s" (with-current-buffer buffer (buffer-string))))
      ((error) (warn "%s" err) (delete-directory repo 'recursive))))
  (unless (require 'elpaca-autoloads nil t)
    (require 'elpaca)
    (elpaca-generate-autoloads "elpaca" repo)
    (load "./elpaca-autoloads")))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))

(elpaca elpaca-use-package
  (elpaca-use-package-mode))

(elpaca-wait)

vertico

(use-package vertico
  :bind (:map vertico-map
              ("C-h" . left-char)
              ("C-l" . right-char)
              ("C-j" . vertico-next)
              ("C-k" . vertico-previous))
  :config
  (setq vertico-resize nil
        vertico-cycle t)
  :init
  (vertico-mode t))

marginalia

(use-package marginalia
  :config
  (setq marginalia-annotators
        '(marginalia-annotators-heavy marginalia-annotators-light nil))
  (marginalia-mode t))

orderless

(use-package orderless
  :config
  (setq completion-ignore-case t)
  (setq read-buffer-completion-ignore-case t)
  (setq echo-keystrokes 0.25)
  (setq kill-ring-max 60)
  (setq read-file-name-completion-ignore-case t)
  (setq completion-styles '(orderless basic)
        completion-category-defaults nil
        completion-category-overrides '((file (styles partial-completion)))))

consult

(use-package consult
  :defer t
  :config
  (setq xref-show-xrefs-function #'consult-xref
        xref-show-definitions-function #'consult-xref)
  (global-set-key [remap switch-to-buffer] 'consult-buffer)
  (global-set-key [remap yank-pop] 'consult-yank-pop)
  (global-set-key [remap Info-search] 'consult-info)
  (global-set-key [remap bookmark-jump] 'consult-bookmark)
  (global-set-key [remap switch-to-buffer-other-tab] 'consult-buffer-other-tab)
  (global-set-key [remap recentf] 'consult-recent-file)
  (global-set-key [remap switch-to-buffer-other-frame] 'consult-buffer-other-frame)
  (global-set-key [remap switch-to-buffer-other-window] 'consult-buffer-other-window)
  (global-set-key [remap project-switch-to-buffer] 'consult-project-buffer)
  (global-set-key [remap isearch-forward] 'consult-line)
  (global-set-key [remap isearch-backward] 'consult-line)
  :after vertico)

embark

(use-package embark
  :defer t
  :config
  (defun embark-which-key-indicator ()
    "An embark indicator that displays keymaps using which-key.
The which-key help message will show the type and value of the
current target followed by an ellipsis if there are further
targets."
    (lambda (&optional keymap targets prefix)
      (if (null keymap)
          (which-key--hide-popup-ignore-command)
        (which-key--show-keymap
         (if (eq (plist-get (car targets) :type) 'embark-become)
             "Become"
           (format "Act on %s '%s'%s"
                   (plist-get (car targets) :type)
                   (embark--truncate-target (plist-get (car targets) :target))
                   (if (cdr targets) "" "")))
         (if prefix
             (pcase (lookup-key keymap prefix 'accept-default)
               ((and (pred keymapp) km) km)
               (_ (key-binding prefix 'accept-default)))
           keymap)
         nil nil t (lambda (binding)
                     (not (string-suffix-p "-argument" (cdr binding))))))))

  (setq embark-indicators
        '(embark-which-key-indicator
          embark-highlight-indicator
          embark-isearch-highlight-indicator))

  (defun embark-hide-which-key-indicator (fn &rest args)
    "Hide the which-key indicator immediately when using the completing-read prompter."
    (which-key--hide-popup-ignore-command)
    (let ((embark-indicators
           (remq #'embark-which-key-indicator embark-indicators)))
      (apply fn args)))

  (advice-add #'embark-completing-read-prompter
              :around #'embark-hide-which-key-indicator))

(use-package embark-consult
  :after (:all embark consult)
  :hook
  (embark-collect-mode . consult-preview-at-point-mode))

diminish

(use-package diminish)

uniquify

(use-package uniquify
  :ensure nil
  :config
  (setq uniquify-buffer-name-style 'forward
        uniquify-separator "/"
        uniquify-after-kill-buffer-p t
        uniquify-ignore-buffers-re "^\\*"))

org

(use-package org
  :ensure nil
  :config
  (setq org-startup-indented t
        org-edit-src-content-indentation 0
        org-src-preserve-indentation t
        org-confirm-babel-evaluate nil
        org-auto-align-tags nil
        org-tags-column 0
        org-catch-invisible-edits 'show-and-error
        org-special-ctrl-a/e t
        org-insert-heading-respect-content t
        org-hide-emphasis-markers t
        org-pretty-entities t
        org-ellipsis "")
  :diminish (org-indent-mode visual-line-mode)
  :hook ((org-mode . hl-line-mode)
         (org-mode . visual-line-mode)
         (org-mode . org-indent-mode)))

eshell

(setq eshell-highlight-prompt t
      eshell-hist-ignoredups t
      eshell-history-size nil
      eshell-banner-message ""
      eshell-prompt-regexp "^[^λ]+ λ ")

(setq eshell-prompt-function (lambda nil
                               (concat
                                (propertize (abbreviate-file-name (eshell/pwd)) 'face `(:foreground "#82cfff") )
                                (propertize " λ" 'face `(:foreground "#ee5396"))
                                (propertize " "))))

(use-package eat
  :defer t
  :hook ((eshell-mode . eat-eshell-mode)
         (eshell-mode . eat-eshell-visual-command-mode))
  :bind (:map eshell-mode-map
              ("C-j" . eshell-previous-matching-input-from-input)
              ("C-k" . eshell-next-matching-input-from-input)))

(use-package capf-autosuggest
  :defer t
  :hook ((eshell-mode . capf-autosuggest-mode)))

(use-package eshell-toggle
  :defer t
  :config
  (setq eshell-toggle-window-side 'above
        eshell-toggle-size-fraction 2))

(use-package eshell-syntax-highlighting
  :hook
  (eshell-mode . eshell-syntax-highlighting-mode))

popwin

(use-package popwin
  :config
  (popwin-mode 1)
  (push '("*helpful*" :height 7) popwin:special-display-config)
  (push '("*Help*" :height 7) popwin:special-display-config)
  (push '("*Occur*" :height 7) popwin:special-display-config)
  (push '("*tree-sit*" :height 7 :noselect t) popwin:special-display-config)
  (push '("*lsp-bridge*" :height 7 :noselect t) popwin:special-display-config)
  (push '("*eldoc*" :height 7) popwin:special-display-config)
  (push '("*compilation*" :height 7) popwin:special-display-config))

meow

(use-package meow
  :config
  (defvar my-help-map
    (let ((map (make-sparse-keymap)))
      (define-key map (kbd "h") #'helpful-symbol)
      (define-key map (kbd "o") #'describe-symbol)
      (define-key map (kbd "k") #'describe-keymap)
      (define-key map (kbd "f") #'helpful-function)
      (define-key map (kbd "v") #'helpful-variable)
      (define-key map (kbd "K") #'helpful-key)
      (define-key map (kbd "m") #'describe-mode)
      (define-key map (kbd "M") #'man)
      (define-key map (kbd "p") #'helpful-at-point)
      map))
  (defvar my-buffer-map
    (let ((map (make-sparse-keymap)))
      (define-key map (kbd "b") #'consult-buffer)
      (define-key map (kbd "k") #'kill-current-buffer)
      (define-key map (kbd "n") #'next-buffer)
      (define-key map (kbd "p") #'previous-buffer)
      (define-key map (kbd "s") #'scratch-buffer)
      map))
  (defvar my-lsp-map
    (let ((map (make-sparse-keymap)))
      (define-key map (kbd "d") #'lsp-bridge-find-def)
      (define-key map (kbd "s") #'lsp-bridge-find-references)
      (define-key map (kbd "i") #'lsp-bridge-find-impl)
      (define-key map (kbd "k") #'lsp-bridge-popup-documentation)
      (define-key map (kbd "a") #'lsp-bridge-diagnostic-list)
      (define-key map (kbd "l") #'lsp-bridge-workspace-list-symbols)
      (define-key map (kbd "f") #'lsp-bridge-code-format)
      (define-key map (kbd "c") #'lsp-bridge-code-action)
      (define-key map (kbd "r") #'lsp-bridge-rename)
      map))
  (defvar my-window-map
    (let ((map (make-sparse-keymap)))
      (define-key map (kbd "s") #'split-window-below)
      (define-key map (kbd "v") #'split-window-right)
      (define-key map (kbd "c") #'delete-window)
      (define-key map (kbd "w") #'other-window)
      map))
  (defvar my-git-gutter-map
    (let ((map (make-sparse-keymap)))
      (define-key map (kbd "k") #'git-gutter:next-hunk)
      (define-key map (kbd "j") #'git-gutter:previous-hunk)
      (define-key map (kbd "r") #'git-gutter:revert-hunk)
      (define-key map (kbd "s") #'git-gutter:stage-hunk)
      (define-key map (kbd "p") #'git-gutter:popup-hunk)
      (define-key map (kbd "e") #'git-gutter:end-of-hunk)
      map))

  (defun meow-setup ()
    (setq meow-cheatsheet-layout meow-cheatsheet-layout-qwerty)
    (meow-motion-overwrite-define-key
     '("j" . meow-next)
     '("k" . meow-prev)
     '("<escape>" . ignore))
    (meow-leader-define-key
     '("SPC" . execute-extended-command)
     `("a" . replace-regexp)
     `("b" . ,my-buffer-map)
     `("c" . ,my-git-gutter-map)
     '("d" . dired-jump)
     '("e" . embark-act)
     '("f" . find-file)
     '("F" . consult-fd)
     '("g" . consult-ripgrep)
     `("h" . ,my-help-map)
     `("i" . ,my-lsp-map)
     '("j" . consult-imenu)
     '("K" . kill-emacs)
     (cons "l" popwin:keymap)
     '("m" . magit)
     '("n" . eval-region)
     '("o" . eshell-toggle)
     '("p" . project-find-file)
     '("P" . project-switch-project)
     '("q" . consult-mark)
     '("r" . consult-recent-file)
     '("s" . save-buffer)
     '("t" . eval-expression)
     '("u" . consult-theme)
     '("v" . consult-yank-pop)
     `("w" . ,my-window-map)
     '("/" . consult-line)
     '("1" . meow-digit-argument)
     '("2" . meow-digit-argument)
     '("3" . meow-digit-argument)
     '("4" . meow-digit-argument)
     '("5" . meow-digit-argument)
     '("6" . meow-digit-argument)
     '("7" . meow-digit-argument)
     '("8" . meow-digit-argument)
     '("9" . meow-digit-argument)
     '("0" . meow-digit-argument)
     '("\" . meow-keypad-describe-key)
   '("?" . meow-cheatsheet))
  (meow-normal-define-key
   '("s-u" . meow-page-up)
   '("s-d" . meow-page-down)
   '("C--" . text-scale-decrease)
   '("C-=" . text-scale-increase)
   '("C--" . text-scale-decrease)
   '("C-S-h" . (lambda () (interactive) (enlarge-window-horizontally 5)))
   '("C-S-l" . (lambda () (interactive) (shrink-window-horizontally 5)))
   '("C-S-k" . (lambda () (interactive) (enlarge-window 5)))
   '("C-S-j" . (lambda () (interactive) (shrink-window 5)))
   '("C-r" . undo-fu-only-redo)
   '("0" . meow-expand-0)
   '("9" . meow-expand-9)
   '("8" . meow-expand-8)
   '("7" . meow-expand-7)
   '("6" . meow-expand-6)
   '("5" . meow-expand-5)
   '("4" . meow-expand-4)
   '("3" . meow-expand-3)
   '("2" . meow-expand-2)
   '("1" . meow-expand-1)
   '("-" . negative-argument)
   '("=" . meow-indent)
   '("V" . meow-comment)
   '("x" . meow-reverse)
   '("," . meow-inner-of-thing)
   '("." . meow-bounds-of-thing)
   '("[" . meow-beginning-of-thing)
   '("]" . meow-end-of-thing)
   '("a" . meow-append)
   '("A" . meow-open-below)
   '("b" . meow-back-word)
   '("B" . meow-back-symbol)
   '("c" . meow-change)
   '("d" . meow-delete)
   '("D" . meow-backward-delete)
   '("e" . meow-next-word)
   '("E" . meow-next-symbol)
   '("f" . meow-find)
   '("g" . meow-cancel-selection)
   '("G" . meow-grab)
   '("h" . meow-left)
   '("H" . meow-left-expand)
   '("i" . meow-insert)
   '("I" . meow-open-above)
   '("j" . meow-next)
   '("J" . meow-next-expand)
   '("k" . meow-prev)
   '("K" . meow-prev-expand)
   '("l" . meow-right)
   '("L" . meow-right-expand)
   '("m" . meow-join)
   '("n" . meow-search)
   '("o" . meow-block)
   '("O" . meow-to-block)
   '("p" . meow-yank)
   '("q" . meow-quit)
   '("Q" . meow-goto-line)
   '("r" . meow-replace)
   '("R" . meow-swap-grab)
   '("s" . meow-kill)
   '("t" . meow-till)
   '("u" . undo-fu-only-undo)
   '("U" . meow-undo-in-selection)
   '("v" . meow-visit)
   '("w" . meow-mark-word)
   '("W" . meow-mark-symbol)
   '("x" . meow-line)
   '("X" . meow-goto-line)
   '("y" . meow-save)
   '("Y" . meow-sync-grab)
   '("z" . meow-pop-selection)
   '("'" . repeat)
   '("<escape>" . ignore)))
    (meow-setup)
    (setq meow-use-clipboard t)
    (setq meow-goto-line-function 'consult-goto-line)
    (setq meow-use-dynamic-face-color nil)
    (setq meow-keypad-start-keys nil)
    (setq meow-keypad-meta-prefix nil)
    (setq meow-keypad-ctrl-meta-prefix nil)
    (add-to-list 'meow-mode-state-list '(eshell-mode . insert))
    (meow-global-mode 1))

yasnippet

(use-package yasnippet-snippets)
(use-package yasnippet
  :diminish (yas-minor-mode)
  :hook ((prog-mode org-mode) . yas-minor-mode))

visual-replace

(use-package visual-replace
  :ensure (:host github :repo "szermatt/visual-replace"))

undo-fu

(use-package undo-fu)

(use-package undo-fu-session
  :config (undo-fu-session-global-mode t))

modeline

(use-package doom-themes)
(use-package spacious-padding
  :config
  (setq spacious-padding-widths
        '( :internal-border-width 10
           :header-line-width 2
           :mode-line-width 1
           :tab-width 4
           :right-divider-width 30
           :scroll-bar-width 2))
  (spacious-padding-mode t))

(use-package keycast
  :config
  (setq keycast-mode-line-format "%2s%k%c%R ")
  (setq keycast-mode-line-remove-tail-elements nil)
  (setq keycast-mode-line-insert-after 'mode-line-end-spaces)
  (dolist (input '(self-insert-command org-self-insert-command))
    (add-to-list 'keycast-substitute-alist `(,input "." "Typing…")))

  (dolist (event '(mouse-event-p mouse-movement-p mwheel-scroll))
    (add-to-list 'keycast-substitute-alist `(,event nil)))
  (keycast-mode-line-mode t))

nix

(use-package nix-mode)

direnv

(use-package envrc
  :hook ((prog-mode) . envrc-global-mode))

markdown

(use-package markdown-mode
  :mode ("README\\.md\\'" . gfm-mode))

treesitter

(use-package treesit-auto
  :config
  (setq treesit-auto-install t)
  (treesit-auto-add-to-auto-mode-alist 'all)
  (global-treesit-auto-mode))

lsp-bridge

(use-package lsp-bridge
  :ensure (:host github :build (:not elpaca--byte-compile) :files ("*.el" "*.py" "acm" "core" "langserver" "multiserver" "resources") :repo "manateelazycat/lsp-bridge")
  :bind (:map acm-mode-map
              ("TAB"      . acm-select-next)
              ([tab]      . acm-select-next)
              ("S-TAB"    . acm-select-prev)
              ([backtab]  . acm-select-prev)
              ("RET"      . acm-complete))
  :diminish (lsp-bridge-mode)
  :config
  (setq lsp-bridge-enable-hover-diagnostic t
        lsp-bridge-enable-auto-format-code t
        acm-enable-codeium t
        lsp-bridge-enable-org-babel t
        lsp-bridge-python-lsp-server "ruff"
        lsp-bridge-python-multi-lsp-server "pyright_ruff"
        lsp-bridge-nix-lsp-server "nil"
        lsp-bridge-enable-auto-format-code t
        acm-backend-lsp-candidate-min-length 3
        acm-backend-yas-candidate-min-length 2
        acm-backend-search-file-words-candidate-min-length 5
        acm-backend-lsp-match-mode "fuzzy"
        lsp-bridge-enable-org-babel t
        acm-enable-icon t
        acm-backend-search-file-words-enable-fuzzy-match t
        acm-enable-preview t))

git

(use-package transient
  :defer t)
(use-package magit
  :defer t)

(use-package git-gutter
  :diminish (git-gutter-mode)
  :config (global-git-gutter-mode t)
  (custom-set-variables
   '(git-gutter:modified-sign "")
   '(git-gutter:added-sign "")
   '(git-gutter:deleted-sign "")))

ui

(use-package pulsar
  :config
  (pulsar-global-mode t))

(use-package goggles
  :config
  (setq goggles-pulse t)
  (goggles-mode t))

(use-package which-key
  :diminish (which-key-mode)
  :config
  (setq which-key-idle-delay 0.2
        which-key-idle-secondary-delay 0.02)
  (which-key-setup-minibuffer)
  (which-key-mode))

help

(use-package helpful
  :defer t)

fontaine

(when (display-graphic-p)
  (use-package fontaine
    :config
    (setq fontaine-set-preset 'regular
          fontaine-presets
          '((regular)
            (t
             :default-family "Iosevka Comfy"
             :default-weight regular
             :default-height 175

             :fixed-pitch-family nil
             :fixed-pitch-weight nil
             :fixed-pitch-height 1.0

             :fixed-pitch-serif-family nil
             :fixed-pitch-serif-weight nil
             :fixed-pitch-serif-height 1.0

             :mode-line-active-family "Google Sans"
             :mode-line-active-weight nil
             :mode-line-active-height 210

             :mode-line-inactive-family "Google Sans"
             :mode-line-inactive-weight nil
             :mode-line-inactive-height 210

             :line-number-family nil
             :line-number-weight nil
             :line-number-height 0.9

             :bold-family nil
             :bold-weight bold

             :italic-family nil
             :italic-slant italic

             :line-spacing nil)))
    (fontaine-mode t)
    (fontaine-set-preset 'regular)))

nw

(use-package xclip
  :config
  (when (not (display-graphic-p))
    (xclip-mode 1)
    (add-to-list 'term-file-aliases '("foot" . "xterm"))
    (load-theme 'doom-sourcerer t)
    (set-face-attribute 'default nil :background "unspecified-bg")))

server

(use-package server
  :ensure nil
  :config
  (unless (server-running-p)
    (server-start)))

dired

(use-package dired
  :hook ((dired-mode . hl-line-mode))
  :ensure nil
  :bind (:map dired-mode-map
              ("l" . dired-find-file)
              ("h" . dired-up-directory))
  :config
  (require 'dired-x)
  (setq dired-listing-switches
        "-AGFhlv --time-style=locale"
        dired-mouse-drag-files t
        dired-bind-jump nil
        dired-kill-when-opening-new-dired-buffer t))

(use-package async
  :config
  (dired-async-mode t))

emacs

(use-package emacs
  :ensure nil
  :config
  (setq ring-bell-function #'ignore
        completion-cycle-threshold 3
        scroll-step 1
        scroll-margin 3
        find-file-visit-truename t
        scroll-conservatively 10000
        make-backup-files nil
        next-screen-context-lines 5
        tab-always-indent 'complete
        comment-multi-line nil
        recentf-max-saved-items 200
        vc-follow-symlinks t
        line-move-visual nil
        initial-scratch-message nil
        indicate-empty-lines t
        confirm-kill-emacs nil
        confirm-kill-processes nil
        show-trailing-whitespace t
        use-short-answers t
        initial-major-mode 'org-mode
        inhibit-startup-screen t
        display-time-format "%a %d %b %H:%M"
        display-time-default-load-average nil
        default-input-method "japanese"
        enable-recursive-minibuffers t
        completion-in-region-function #'consult-completion-in-region
        electric-pair-pairs
        '(
          (?\" . ?\")
          (?\{ . ?\})))

  (setq-default indent-tabs-mode nil
                tab-width 4)

  (setq tab-always-indent 'complete)

  (define-fringe-bitmap 'right-curly-arrow
    [#b1111111
     #b0000001
     #b0000001
     #b0000001
     #b0000001
     #b0000001])

  (define-fringe-bitmap 'left-curly-arrow
    [#b1000000
     #b1000000
     #b1000000
     #b1000000
     #b1000000
     #b1111111])

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

  (setq-default create-lockfiles nil
                make-backup-files nil
                version-control t
                vc-make-backup-files nil
                backup-by-copying t
                delete-old-versions t
                kept-old-versions 5
                kept-new-versions 5
                auto-save-file-name-transforms `((".*" ,(concat user-emacs-directory "auto-save-list/") t))
                backup-directory-alist (list (cons "." (concat user-emacs-directory "backup/"))))

  (setq whitespace-style '(face tabs trailing lines empty spaces indentation space-mark tab-mark))
  (add-hook 'before-save-hook #'whitespace-cleanup)

  (add-hook 'prog-mode-hook #'hl-line-mode)
  (add-hook 'prog-mode-hook #'display-line-numbers-mode)

  (electric-pair-mode t)
  (recentf-mode t)
  (save-place-mode t)
  (display-time-mode t)
  (prettify-symbols-mode t)
  (global-auto-revert-mode t)
  (savehist-mode t)
  (window-divider-mode nil)
  (column-number-mode t)
  (size-indication-mode t)

  (defadvice split-window (after split-window-after activate)
    (other-window 1))

  (defun crm-indicator (args)
    (cons (format "[CRM%s] %s"
                  (replace-regexp-in-string
                   "\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" ""
                   crm-separator)
                  (car args))
          (cdr args)))
  (advice-add #'completing-read-multiple :filter-args #'crm-indicator)

  (setq minibuffer-prompt-properties
        '(read-only t cursor-intangible t face minibuffer-prompt))
  (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode))

eshell/alias

alias c clear-scrollback
alias clear clear-scrollback
alias cat bat -p -P
alias cp cp -ivr
alias d sudo
alias del sudo nix-collect-garbage --delete-old
alias df duf
alias du dust
alias f free -h
alias g git
alias ko pkill
alias l ls -alh
alias la eza -a
alias ll eza -l
alias lla eza -la
alias ls eza --icons --git
alias lt eza --tree
alias mkdir mkdir -pv
alias mv mv -iv
alias rm rm -Ivr
alias up sudo nixos-rebuild switch --flake ~/nix#default