1
0
Files
emacs/init.el.org
2025-03-18 23:58:20 +01:00

23 KiB
Raw Blame History

init.el.org

My Emacs configuration

More about the Emacs initialization file

~/.emacs.d/init.el is generated from this org file with Org-babel

How to tangle: M-x org-babel-tangle or C-c C-v t

My Emacs repository: git.minded.net/anne/emacs

The source version of this file: git.minded.net/anne/emacs/src/branch/main/init.el.org

Or view this file on my blog: blog.minded.net/emacs/init.el.org

About me

  (setq user-full-name "Anne"
        user-mail-address "anne@minded.net")

System

  (setq laptop-p (equal (system-name) "siskin"))

Use-package

https://github.com/jwiegley/use-package

  (require 'package)
  (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))
  (require 'use-package)
  (setq use-package-always-ensure 't)

Reload configuration

M-x reload-emacs-init

  (defun reload-emacs-init ()
    (interactive)
    (load-file "~/.emacs.d/init.el")
    (message "Configuarion reloaded!"))

Customizations file

https://www.gnu.org/software/emacs/manual/html_node/emacs/Saving-Customizations.html

You can choose to save customizations somewhere other than your initialization file.

  (setq custom-file "~/.emacs.d/custom.el")
  (load custom-file 'noerror 'nomessage)

Lock files

https://www.gnu.org/software/emacs/manual/html_node/elisp/File-Locks.html

If create-lockfiles is nil, Emacs does not lock files.

  (setq create-lockfiles nil)

Yes-or-no prompts

https://www.emacswiki.org/emacs/YesOrNoP

  (defalias 'yes-or-no-p 'y-or-n-p)

Keeping buffers up-to-date

https://www.gnu.org/software/emacs/manual/html_node/emacs/Auto-Revert.html

  (global-auto-revert-mode 1)
  (setq global-auto-revert-non-file-buffers t)

Looks

Initial frame configuration

https://www.gnu.org/software/emacs/manual/html_node/elisp/Initial-Parameters.html

A bigger frame for the gui of Emacs.

  (add-to-list 'default-frame-alist '(height . 56))
  (add-to-list 'default-frame-alist '(width . 132))

Frame font

https://www.gnu.org/software/emacs/manual/html_node/elisp/Frame-Font.html

  (ignore-errors (set-frame-font "Roboto Mono-10"))

Disable startup screen

What to display

https://www.gnu.org/software/emacs/manual/html_node/emacs/Frames.html

I do like the menu bar after all.

  (if laptop-p (scroll-bar-mode -1))
  (tool-bar-mode -1)
  ;;(menu-bar-mode -1)
  (tooltip-mode -1)

Mood-line

https://gitlab.com/jessieh/mood-line

A lightweight, drop-in replacement for the default Emacs mode line configuration.

  (use-package mood-line
    :config (mood-line-mode))
  (setq mood-line-format mood-line-format-default)

DISABLED Diminish

https://github.com/myrjola/diminish.el

Diminish implements hiding or abbreviation of the mode line displays (lighters) of minor-modes.

With Mood-line there's no need to diminish

  (use-package diminish
    :ensure t)

Suppress dialog boxes

DISABLED Rainbow delimiters

https://github.com/Fanael/rainbow-delimiters

  (use-package rainbow-delimiters
    :init
    (add-hook 'text-mode-hook #'rainbow-delimiters-mode)
    (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))

Doom themes

https://github.com/doomemacs/themes

  (use-package doom-themes
    :ensure t
    :config
    (setq doom-themes-enable-bold t                  ; if nil, bold is universally disabled
          doom-themes-enable-italic t                ; if nil, italics is universally disabled
          doom-themes-padded-modeline t)
    (load-theme 'doom-vibrant t)
    ;;(setq doom-horizon-brighter-comments nil)
    (setq doom-themes-treemacs-theme "doom-colors")  ; use "doom-colors" for less minimal icon theme
    (doom-themes-treemacs-config)
    (doom-themes-org-config)                         ; corrects (and improves) org-mode's native fontification
    (custom-set-faces
     '(font-lock-comment-face ((t (:foreground "#6c6f93" :slant normal))))
     '(org-hide ((t (:foreground "grey15"))))
     '(org-scheduled-today ((t (:foreground "violet"))))
     '(org-todo ((t (:foreground "magenta"))))
     '(org-done ((t (:foreground "#9ca0a4" :bold nil :background "grey15"))))
     '(org-tag ((t (:foreground "teal"))))
     '(org-link ((t (:bold nil))))))

all-the-icons

https://github.com/domtronn/all-the-icons.el

  (use-package all-the-icons
    :if (display-graphic-p))

  (use-package all-the-icons-dired
    :after all-the-icons
    :hook (dired-mode . all-the-icons-dired-mode))

Minibuffer

https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer-Edit.html

The variable resize-mini-windows controls the resizing of the minibuffer. If the value is t, the minibuffer window will also shrink automatically if you remove some lines of text from the minibuffer, down to a minimum of one screen line. The variable max-mini-window-height controls the maximum height for resizing the minibuffer window. A floating-point number specifies a fraction of the frames height; an integer specifies the maximum number of lines; nil means do not resize the minibuffer window automatically. The default value is 0.25.

  (setq resize-mini-windows t)
  (setq max-mini-window-height 0.5)

Word wrap

Editing and moving around

Mouse support

https://www.gnu.org/software/emacs/manual/html_node/emacs/Mouse-Input.html

  (xterm-mouse-mode 1)
  (mouse-wheel-mode 1)
  (context-menu-mode 1)

xclip

https://elpa.gnu.org/packages/xclip.html

This package allows Emacs to copy to and paste from the GUI clipboard when running in text terminal.

  (use-package xclip
    :if laptop-p
    :init
    (xclip-mode 1))

Kill-line

https://www.gnu.org/software/emacs/manual/html_node/emacs/Killing-by-Lines.html

If non-nil, kill-line with no arg at start of line kills the whole line.

  (setq kill-whole-line t)

Electric pair mode

Window handling

https://www.gnu.org/software/emacs/manual/html_node/emacs/Window-Convenience.html

Winner mode is a global minor mode that records the changes in the window configuration (i.e., how the frames are partitioned into windows), so that you can undo them.

  (winner-mode 1)

The Windmove package defines commands for moving directionally between neighboring windows in a frame.

  (use-package windmove
    :bind
    (("<f2> <right>" . windmove-right)
     ("<f2> <left>" . windmove-left)
     ("<f2> <up>" . windmove-up)
     ("<f2> <down>" . windmove-down)))

Crux

https://github.com/bbatsov/crux

A Collection of Ridiculously Useful eXtensions for Emacs. crux bundles many useful interactive commands to enhance your overall Emacs experience.

  (use-package crux
    :bind
    ("C-a" . crux-move-beginning-of-line)
    ("C-c o" . crux-open-with)
    ("C-k" . crux-kill-whole-line)
    :config
    (crux-with-region-or-buffer indent-region)
    (crux-with-region-or-buffer untabify)
    (crux-with-region-or-line comment-or-uncomment-region)
    :hook (before-save-hook . crux-cleanup-buffer-or-region))

Dired

https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html

  (put 'dired-find-alternate-file 'disabled nil)
  (setq dired-listing-switches "-agho --group-directories-first")

Kill buffer

  (global-set-key (kbd "C-x k") 'kill-this-buffer)

Unset C-z

Unset C-z which is bound to `suspend-frame' by default.

  (global-unset-key (kbd "C-z"))

Saving files

Backups

https://www.gnu.org/software/emacs/manual/html_node/emacs/Backup.html

Automatically backup buffers/files into the ~.emacs.d/backup/ directory.

  (setq backup-directory-alist '(("." . "~/.emacs.d/backups")))
  (setq backup-by-copying t     ; Don't delink hardlinks
        version-control t       ; Use version numbers on backups
        delete-old-versions t   ; Automatically delete excess backups
        kept-new-versions 20    ; how many of the newest versions to keep
        kept-old-versions 5)    ; and how many of the old

Auto save

https://www.gnu.org/software/emacs/manual/html_node/emacs/Auto-Save-Control.html

  (setq auto-save-timeout 20    ; number of seconds idle time before auto-save (default: 30)
        auto-save-interval 200) ; number of keystrokes between auto-saves (default: 300)

Lastmod time stamp

  (setq time-stamp-start "\\(^:last_modified: \\\\?[\[<]+\\|^#\\+lastmod: \\\\?[\[<]+\\|^;; lastmod: \\\\?[\[<]+\\)")
  (setq time-stamp-end "\\\\?[\]>]")
  (setq time-stamp-format "%Y-%02m-%02d %3a %02H:%02M")
  (setq time-stamp-limit 12)
  (add-hook 'before-save-hook 'time-stamp)
  (setq time-stamp-active t)

Treemacs

https://github.com/Alexander-Miller/treemacs

A tree layout file explorer for Emacs.

  (use-package treemacs
    :ensure t
    :defer t
    :init
    (with-eval-after-load 'winum
      (define-key winum-keymap (kbd "M-0") #'treemacs-select-window))
    :config
    (setq treemacs-show-hidden-files nil)
    :bind
    (:map global-map
          ("M-0"       . treemacs-select-window)
          ("C-x t 1"   . treemacs-delete-other-windows)
          ("C-x t t"   . treemacs)
          ("<f8>"      . treemacs)
          ("C-x t d"   . treemacs-select-directory)
          ("C-x t B"   . treemacs-bookmark)
          ("C-x t C-t" . treemacs-find-file)
          ("C-x t M-t" . treemacs-find-tag)))

  (use-package treemacs-icons-dired
    :hook (dired-mode . treemacs-icons-dired-enable-once)
    :ensure t)

  (use-package nerd-icons
    ;; :custom
    ;; The Nerd Font you want to use in GUI
    ;; "Symbols Nerd Font Mono" is the default and is recommended
    ;; but you can use any other Nerd Font if you want
    ;; (nerd-icons-font-family "Symbols Nerd Font Mono")
    )

  (use-package treemacs-nerd-icons
    :config
    (treemacs-load-theme "nerd-icons"))

  (use-package treemacs-magit
    :after (treemacs magit)
    :ensure t)

Which-key

https://github.com/justbur/emacs-which-key

which-key is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a popup.

  (use-package which-key
    :config
    (which-key-mode)
    (setq which-key-idle-delay 0.5
          which-key-idle-secondary-delay 0.5)
    (which-key-setup-side-window-bottom))

Helm

https://emacs-helm.github.io/helm/

Helm is an Emacs framework for incremental completions and narrowing selections. It helps to rapidly complete file names, buffer names, or any other Emacs interactions requiring selecting an item from a list of possible choices.

  (use-package helm
    :ensure t
    :config
    ;;(require 'helm-config)
    :init
    (helm-mode 1)
    (setq helm-split-window-inside-p t)
    :diminish helm-mode
    :bind (("M-x"     . helm-M-x)            ; Evaluate functions
           ("C-x C-f" . helm-find-files)     ; Open or create files
           ("C-x b"   . helm-mini)           ; Select buffers
           ("C-x C-b" . helm-buffers-list)
           ("C-x C-r" . helm-recentf)        ; Select recently saved files
           ("C-c i"   . helm-imenu)          ; Select document heading
           ("M-y"     . helm-show-kill-ring) ; Show the kill ring
           ("C-x c g" . helm-do-grep-ag)
           :map helm-map
           ("C-z" . helm-select-action)
           ("<tab>" . helm-execute-persistent-action)))

Org Mode

Org Mode on my laptop

https://orgmode.org/org.html

  (use-package org
    :if laptop-p
    :bind
    (("C-c l" . org-store-link)
     ("C-c a" . org-agenda)
     ("C-c c" . org-capture))
    :config
    (setq org-directory "~/org"
          org-default-notes-file "~/org/agenda/inbox.org"
          org-attach-id-dir "~/org/data/")
    ;;(setq org-agenda-text-search-extra-files (directory-files-recursively "~/org/" "\\.org$"))
    (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
    (setq org-startup-indented nil
          org-pretty-entities t
          org-hide-emphasis-markers t
          org-hide-leading-stars nil
          org-startup-with-inline-images t
          org-image-actual-width '(300)
          org-tags-column 0
          org-log-done 'time
          org-log-into-drawer t
          org-deadline-warning-days 7
          org-refile-targets '((org-agenda-files :maxlevel . 5))
          org-refile-use-outline-path 'file
          org-outline-path-complete-in-steps nil
          org-refile-allow-creating-parent-nodes 'confirm)
    ;;(setq org-blank-before-new-entry (quote ((heading) (plain-list-item))))
    (advice-add 'org-refile :after 'org-save-all-org-buffers)
    (setq org-capture-templates
          '(("t" "Task" entry (file "~/org/agenda/todo.org") "* TODO %?\n:PROPERTIES:\n:CREATED: %U\n:END:" :empty-lines 1)
            ("n" "Note" entry (file org-default-notes-file) "* %?\n:PROPERTIES:\n:CREATED: %U\n:END:" :empty-lines 1)
            ("j" "Journal entry" entry (file+olp+datetree "~/org/journal.org") "* %?" :unnarrowed t :empty-lines-after 1)
            ("J" "Journal entry on date" entry (file+olp+datetree "~/org/journal.org") "* %?" :time-prompt t :unnarrowed t :empty-lines-after 1)
            ("m" "Meeting" entry (file+olp+datetree "~/org/agenda/agenda.org") "* %?\n%T" :time-prompt t :tree-type month :empty-lines 1)
            ("a" "Agenda entry" entry (file+olp+datetree "~/org/agenda/agenda.org") "* %?\n%t" :time-prompt t :tree-type month :empty-lines 1)))
    (setq org-todo-keywords
          '((sequence "TODO(t)" "STARTED(s)" "WAITING" "SOMEDAY" "MAYBE" "|" "DONE(d)" "CANCELLED(c)")
            (sequence "TOREAD(r)" "READING" "|" "READ")
            (sequence "TOWATCH(w)" "WATCHING" "|" "WATCHED"))))

Org Mode on other systems

  (use-package org
    :if (not laptop-p)
    :bind
    (("C-c l" . org-store-link)
     ("C-c a" . org-agenda)
     ("C-c c" . org-capture))
    :config
    (setq org-directory "~/org"
          org-default-notes-file "~/org/notes.org"
          org-agenda-files '("~/org"))
    (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))
    (setq org-startup-indented nil
          org-pretty-entities t
          org-hide-emphasis-markers t
          org-hide-leading-stars nil
          org-startup-with-inline-images t
          org-image-actual-width '(300)
          org-tags-column 0
          org-log-done 'time
          org-log-into-drawer t
          org-deadline-warning-days 7
          org-refile-targets '((org-agenda-files :maxlevel . 5))
          org-refile-use-outline-path 'file
          org-outline-path-complete-in-steps nil
          org-refile-allow-creating-parent-nodes 'confirm)
    (advice-add 'org-refile :after 'org-save-all-org-buffers)
    (setq org-capture-templates
          '(("t" "Task" entry (file org-default-notes-file) "* TODO %?\n:PROPERTIES:\n:CREATED: %U\n:CONTEXT: %a\n:END:" :empty-lines 1)
            ("n" "Note" entry (file org-default-notes-file) "* %?\n:PROPERTIES:\n:CREATED: %U\n:CONTEXT: %a\n:END:" :empty-lines 1))))

Helm-org

https://github.com/emacs-helm/helm-org

  (use-package helm-org
    :after helm
    :config
    (add-to-list 'helm-completing-read-handlers-alist '(org-capture . helm-org-completing-read-tags))
    (add-to-list 'helm-completing-read-handlers-alist '(org-set-tags . helm-org-completing-read-tags)))

org-super-agenda

https://github.com/alphapapa/org-super-agenda

  (use-package org-super-agenda
    :if laptop-p
    :after org-agenda
    :init
    (setq org-agenda-files '("~/org" "~/org/agenda" "~/org/notes"))
    ;;(setq org-agenda-text-search-extra-files (directory-files-recursively "~/org/" "\\.org$"))
    (setq calendar-week-start-day 1)
    (calendar-set-date-style 'european)
    (setq calendar-time-display-form
          '(24-hours ":" minutes
                     (if time-zone " (") time-zone (if time-zone ")")))
    (setq org-agenda-format-date (lambda (date) (concat "\n" (org-agenda-format-date-aligned date))))
    (setq org-agenda-start-day nil)
    (setq org-agenda-span 'day)
    (setq use-agenda-use-time-grid nil)
    (setq org-agenda-start-on-weekday nil)
    (setq org-agenda-include-diary nil)
    (setq org-agenda-tags-column 0)
    (setq org-agenda-skip-scheduled-if-done t)
    (setq org-agenda-skip-deadline-if-done t)
    (setq org-agenda-include-deadlines t)
    (setq org-agenda-block-separator nil)
    (setq org-agenda-compact-blocks t)
    (setq org-agenda-start-with-log-mode nil)
    (setq org-agenda-sticky t)
    (setq org-agenda-dim-blocked-tasks nil)
    (setq org-agenda-custom-commands
          '(("d" "Daily agenda"
             ((agenda "" ((org-super-agenda-groups
                           '((:discard (:todo "CANCELLED"))
                             (:discard (:file-path "someday"))
                             (:name none
                                    :file-path "days"
                                    :file-path "people"
                                    :tag "day")
                             (:name "Scheduled"
                                    :time-grid t)
                             (:auto-tags t
                                         :order 5)
                             (:name "Today"
                                    :and (:todo t :scheduled t)
                                    :deadline t
                                    :order 3)
                             ))))))
            ("t" "Todo"
             ((agenda "" ((org-super-agenda-groups
                           '(
                             (:name none
                                    :discard (:file-path "days")
                                    :discard (:file-path "people")
                                    :discard (:tag "day"))
                             (:auto-tags t
                                         :order 5)
                             (:name "Today"
                                    :and (:todo t :scheduled t :not (:todo "SOMEDAY"))
                                    :deadline t
                                    :order 3)
                             (:discard (:anything t))
                             ))))
              (alltodo "" ((org-agenda-overriding-header "\nUnscheduled")
                           (org-super-agenda-groups
                            '(
                              (:discard (:deadline t)
                                        :discard (:scheduled t)
                                        :discard (:todo "SOMEDAY")
                                        :discard (:file-path "someday"))
                              (:auto-tags t
                                          :order 0)
                              (:name "Tags: none"
                                     :not (:scheduled t)
                                     :and (:file-path "todo")
                                     :order 9)
                              (:discard (:anything t))
                              ))))))
            ("x" "Daily schedule"
             ((agenda "" ((org-super-agenda-groups
                           '(
                             (:name none
                                    :file-path "days"
                                    :file-path "people"
                                    :tag "day")
                             (:name none
                                    :time-grid nil)
                             (:name none
                                    :discard (:todo t))
                             ))))))))
    :config
    (org-super-agenda-mode t))

  (if laptop-p
      (defun pop-to-org-agenda (&optional split)
        (interactive "P")
        (org-agenda nil "d")
        (delete-other-windows)
        (treemacs)
        (windmove-right)))
  (if laptop-p
      (global-set-key (kbd "<f5>") 'pop-to-org-agenda))

Org-appear

https://github.com/awth13/org-appear

Make invisible parts of Org elements appear visible.

  (use-package org-appear
    :load-path "~/.emacs.d/etc/elisp/org-appear"
    :hook (org-mode . org-appear-mode)
    :init
    (setq org-appear-autolinks t))

Hide emphasis markers by default.

  (setq org-hide-emphasis-markers t)