Skip to content

Latest commit

 

History

History
637 lines (520 loc) · 17.3 KB

Emacs.org

File metadata and controls

637 lines (520 loc) · 17.3 KB

TNH-Emacs

#+options ‘:t toc:nil num:t author:t email:t

Introduction

The pre-phase of Emacs (early-init.el)

The early-init.el minimal frame.

	(setq frame-resize-pixelwise t
				frame-inhibit-implied-resize t
				frame-title-format '("%b")
				auto-window-vscroll nil
				byte-compile-warnings '(not obsolete)
				ring-bell-function 'ignore
				load-prefer-newer noninteractive
				package-enable-at-startup t
				site-run-file nil
				warning-suppress-log-types '((comp) (vytecomp))
				use-dialog-box nil
				use-file-dialog nil
				use-short-answers t
				inhibit-splash-screen t
				inhibit-startup-screen t
				inhibit-x-resources t
				inhibit-default-init t
				inhibit-startup-message t
				inhibit-startup-echo-area-message user-login-name
				inhibit-startup-buffer-menu t)

	; Disable all graphical elements
	(menu-bar-mode -1)
	(scroll-bar-mode -1)
	(column-number-mode t)
	(tooltip-mode -1)
	(tool-bar-mode -1)
	(put 'downcase-region 'disabled nil)
	(put 'upcase-region 'disabled nil)

The early-init.el gargabe collection

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

  ;; Save `file-name-handler-alist` and `vc-handled-backends`, so they can
  ;; be restored after garbage collection is completed.
  (defvar tnh--file-name-handler-alist file-name-handler-alist)
t  (defvar tnh--vc-handled-backends vc-handled-backends)

	(setq gc-cons-threshold (if (display-graphic-p) 40000000 10000000))

	(eval-and-compile
		(defun tnh-emacs/default-gc ()
			(setq-default gc-cons-threshold 800000))
		(defun tnh-emacs/maybe-gc ()
			(unless (frame-focus-state)
				(garbage-collect))))

	(add-hook 'after-init-hook #'tnh-emacs/default-gc)
	(add-function :after after-focus-change-function 'tnh-emacs/maybe-gc)

	(add-hook 'emacs-startup-hook
			(lambda ()
				(setq gc-cons-threshold (* 8 1000 1000)
				gc-cons-percentage 0.1
				file-name-handler-alist tnh--file-name-handler-alist
				vc-handled-backends tnh--vc-handled-backends)))

The early-init.el set name for default frame

(add-hook 'after-init-hook (lambda () (set-frame-name "home")))

The early-init.el package cache

	(setq-default tnh-emacs/emacs-config-directory (file-name-directory load-file-name)
								user-emacs-directory (expand-file-name "~/.cache/emacs/")
								package-user-dir (expand-file-name "packages/" user-emacs-directory)
								url-history-file (expand-file-name "url/history" user-emacs-directory)
								custom-file (expand-file-name "custom.el" user-emacs-directory))
	(load custom-file :noerror)

The early-init.el native compilation, plus packages

	(when (featurep 'native-compile)
		(let ((path (expand-file-name "eln-cache/" user-emacs-directory)))
			(setq-default native-compile-target-directory path
										native-comp-eln-load-path (list path)
										native-comp-async-report-warnings-errors nil
										native-comp-deferred-compilation 5
										native-comp-speed 2
										package-native-compile t)
			(when (fboundp 'startup-redirect-eln-cache)
				(startup-redirect-eln-cache path))))

	(add-to-list 'load-path (expand-file-name "modules/" tnh-emacs/emacs-config-directory))

The early-init.el other

	(set-default-coding-systems 'utf-8)

	(add-to-list 'display-buffer-alist
							 '("\\*Help\\*"
								 (display-buffer-reuse-window display-buffer-pop-up-window)
								 (inhibit-same-window . t)))

	(add-to-list 'display-buffer-alist
							 '("\\*Completions\\*"
								 (display-buffer-reuse-window display-buffer-pop-up-window)
								 (inhibit-same-window . t)
								 (window-height . 10)))

	(add-to-list 'display-buffer-alist
							 '("\\*Dictionay\\*"
								 (display-buffer-in-side-window)
								 (side . left)
								 (window-width . 70)))

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

The main phanse of Emacs (init.el)

The init.el user options

(defgroup tnh-emacs nil
  "User options for TNH Emacs.
The tnh-emacs-pre-custom.el file must exist and be located
in the same directy as the init.el."
  :group 'file)

The init.el user option to enable vterm

(defcustom tnh-emacs-load-vterm nil
  "When non-nil, enable vterm package.
This user option must be set in the `tnh-emacs-pre-custom.el' file."
  :group 'tnh-emacs
  :type 'boolean)

The init.el user option to enable which-key

(defcustom tnh-emacs-load-which-key nil
  "When non-nil, enable keybinding hints after a short delay.
This user option must be set in the `tnh-emacs-pre-custom.el' file."
  :group 'tnh-emacs
  :type 'boolean)

The init.el add startup hook

 (defun tnh/display-startup-info ()
   (message "TNH-Emacs loaded in %s with %d garbage collections."
	       (format "%.2f seconds"
		       (float-time
			(time-subtract after-init-time before-init-time)))
	       gcs-done))
 (add-hook 'emacs-startup-hook #'tnh/display-startup-info)

The init.el add modules to path

(add-to-list 'load-path (locate-user-emacs-file '"modules"))

The init.el load required modules

	;; Load pre-custom file before loading any module.
	(load (locate-user-emacs-file "tnh-emacs-pre-custom.el") :no-error :no-messag)

	(require 'tnh-emacs-package)
	(require 'tnh-emacs-theme)
	(require 'tnh-emacs-keys)

	(require 'tnh-emacs-core)
	(require 'tnh-emacs-interface)

	(require 'tnh-emacs-code)
	(require 'tnh-emacs-lsp)
	(require 'tnh-emacs-term)
	(require 'tnh-emacs-dired)
	(require 'tnh-emacs-ledger)
	(require 'tnh-emacs-custom)

The custom module for Emacs configuration

The tnh-emacs-package.el module

This module configures package.el and use-package

	(require 'package)

	(setq package-vc-register-as-project nil)

	(add-hook 'package-menu-mode-hook #'hl-line-mode)

	(setq package-archives
	'(("melpa" . "http://melpa.org/packages/")
		("melpa-stable" ."https://stable.melpa.org/packages/")
		("nongnu" . "https://elpa.nongnu.org/nongnu/")
		("gnu-elpa" . "https://elpa.gnu.org/packages/")))

	(setq package-archive-priorities
	'(("gnu-elpa" . 4)
		("melpa" . 3)
		("melpa-stable" . 2)
		("nongnu" . 1)))

	(package-initialize)
	(unless package-archive-contents
		(package-refresh-contents))

	(unless (package-installed-p 'use-package)
		(package-install 'use-package))
	(require 'use-package)

	(provide 'tnh-emacs-package)

The tnh-emacs-theme.el module

(load-theme 'modus-vivendi)
(provide 'tnh-emacs-theme)

The tnh-emacs-core.el module

	;; -- No littering
	(use-package no-littering
		:ensure t
		:config
		(setq auto-save-file-name-transforms
		`((".*" ,(no-littering-expand-var-file-name "auto-save/") t))))  
	(setq auto-save-default nil)

	;; -- Basic bindings

	;; Use UTF-8 by default
	(set-default-coding-systems 'utf-8)
	(repeat-mode 1)

	(column-number-mode)

	(dolist (mode '(prog-mode-hook
					conf-mode-hook
					text-mode-hook))
		(add-hook mode (lambda () (display-line-numbers-mode 1))))

	(setq large-file-warning-threshold nil)
	(setq vc-follow-symlinks t)
	(setq ad-redefinition-action 'accept)

	;; Font
	(set-face-attribute 'default nil
											:font "FiraCode Nerd Font"
											:weight 'normal)

	(set-face-attribute 'fixed-pitch nil
											:font "FiraCode Nerd Font"
											:weight 'light)

	;; Tabbar
	(use-package tab-bar
		:ensure nil
		:bind (("s-[" . tab-bar-switch-to-prev-tab)
					 ("s-]" . tab-bar-switch-to-next-tab)
					 ("s-{" . (lambda ()
											(interactive)
											(tab-move -1)))
					 ("s-}". (lambda ()
										 (interactive)
										 (tab-move 1))))
		:custom
		(tab-bar-show t)
		(tab-bar-close-button-show nil)
		(tab-bar-auto-width nil)
		(tab-bar-history-mode 1)
		(tab-bar-mode 1))
	;; Editing

	(setq-default tab-width 2
			indent-tab-mode nil)

	;; 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)

	(defhydra+ tnh-emacs/emacs-hydra ()
		("e" (lambda () (interactive) (find-file "~/.config/emacs")) "Open Emacs configuration" :column "Configuration")
		("r" restart-emacs "Restart emacs" :column "General"))

	;; Emacs server daemon
 ;; (server-start)

	(provide 'tnh-emacs-core)

The tnh-emacs-keys.el module

	(use-package hydra
		:ensure t)

The tnh-emacs-keys.el custom keymaps

 ;; Git
 (defvar tnh-emacs/git-prefix-map (make-sparse-keymap)
   "Keymap for git operations.")

 (global-set-key (kbd "C-c g") tnh-emacs/git-prefix-map)

 ;; Emacs general stuff

	;; Custom emacs operations bindings
	(defhydra tnh-emacs/emacs-hydra ()
		"Keymap for emacs general operations")

 (global-set-key (kbd "C-c s") 'tnh-emacs/emacs-hydra/body)

 (provide 'tnh-emacs-keys)

The tnh-emacs-interface.el module

	(use-package vertico
		:ensure t
		:custom
		(vertico-cycle t)

		:custom-face
		(vertico-current ((t (:background "#3a3f5a"))))

		:config
		(require 'vertico-directory)
		(vertico-mode))

	(use-package corfu
		:ensure t
		:bind (:map corfu-map
								("TAB" . corfu-insert)
								("C-f" . corfu-insert))
		:custom
		(corfu-auto t)
		(corfu-cycle t)
		(corfu-quit-at-boundary t)
		(corfu-quit-no-match t)
		:config
		(global-corfu-mode 1)
		;; (defun corfu-enable-in-minibuffer ()
		;; 	"Enable Corfu in the minibuffer."
		;; 	(when (local-variable-p 'completion-at-point-functions)
		;; 		;; (setq-local corfu-auto nil) ;; Enable/disable auto completion
		;; 		(setq-local corfu-echo-delay nil ;; Disable automatic echo and popup
		;; 								corfu-popupinfo-delay nil)
		;; 		(corfu-mode 1)))
		;; (add-hook 'minibuffer-setup-hook #'corfu-enable-in-minibuffer)
		)

	(use-package helpful
		:ensure t
		:custom
		(counsel-describe-function-function #'helpful-function)
		(counsel-describe-variable-function #'helpful-variable)
		:bind (([remap describe-function] . helpful-function)
					 ([remap describe-command] . helpful-command)
					 ([remap desribe-variable] . helpful-variable)
					 ([remap describe-key] . helpful-key)))

	(use-package kind-icon
		:ensure t
		:after corfu
		:custom (kind-icon-default-face 'corfu-default)
		:config
		(add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter))

	(use-package orderless
		:ensure t
		:config
		(orderless-define-completion-style orderless+initialism
																			 (orderless-matching-styles '(orderless-initialism
																																		orderless-literal
																																		orderless-regexp)))
		(setq completion-styles '(orderless)
					completion-category-defaults nil
					orderless-matching-styles '(orderless-literal orderless-regexp)
					completion-category-overrides
					'((file (styles partial-completion)))))

	(use-package wgrep
		:after consult
		:hook (grep-mode . wgrep-setup))

	(use-package consult
		:ensure t
		:bind (("C-x C-b" . consult-buffer)
					 :map minibuffer-local-map
					 ("C-r" . consult-history))
		:custom
		(completion-in-region-function #'consult-completion-in-region))

	(use-package consult-dir
		:ensure t
		:bind (("C-x C-d" . consult-dir)
					 :map vertico-map
					 ("C-x C-d" . consult-dir)
					 ("C-x C-j" . consult-dir-jump-file))
		:custom
		(consult-dir-project-list-function nil))

	(use-package embark
		:ensure t
		:after vertico
		:bind (("C-." . embark-act)
					 ("M-." . embark-dwim)
					 :map minibuffer-local-map
					 ("C-d" . embark-act)
					 :map embark-region-map
					 ("D" . denote-region))
		:config
		(delete #'embark-mixed-indicator embark-indicators)
		(add-to-list 'embark-indicators 'embark-minimal-indicator)

		(setq prefix-help-command #'embark-prefix-help-command))

	(use-package embark-consult
		:ensure t
		:after embark)

	(use-package savehist
		:ensure t
		:init
		(savehist-mode))

	(use-package marginalia
		:ensure t
		:after vertico
		:config
		(marginalia-mode))

	(use-package nov
		:ensure t
		:config
		(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode)))

	;; Emacs zone
 ;;	(setq zone-timer (run-with-idle-timer 120 t 'zone))

	(defun zone-choose (pgm)
		"Choose a PGN to run for `zone'."
		(interactive
		 (list
			(completing-read
			 "Program: "
			 (mapcar 'symbol-name zone-programs))))
		(let ((zone-programs (list (intern pgm))))
			(zone pgm)))


	(provide 'tnh-emacs-interface)

The tnh-emacs-code.el module

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

	(use-package rainbow-mode
		:ensure t
		:hook (org-mode
					 emacs-lisp-mode))

	(use-package smartparens
		:ensure t
		:hook (prog-mode . smartparens-mode)
		:config
		(sp-use-smartparens-bindings))

	(use-package magit
		:ensure t
		:bind (("C-M-;" . magit-status-here)
					 ("C-c C-g" . magit-status-here)))

	(use-package highlight-indent-guides
		:ensure t
		:config
		(add-hook 'prog-mode-hook 'highlight-indent-guides-mode))

	(use-package yaml-mode
		:ensure t
		:config
		(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
		(add-to-list 'auto-mode-alist '("\\.yaml\\'" . yaml-mode)))

	(use-package ansible
		:ensure t
		:bind (("C-c a d" . 'ansible-decrypt-buffer)
					 ("C-c a e" . 'ansible-encrypt-buffer)))

	(defun tnh-emacs/project-current-name ()
		(file-name-nondirectory
		 (directory-file-name
			(project-root (project-current)))))

	(defun tnh-emacs/project-close-tab ()
		(interactive)
		(let* ((project-name (tnh-emacs/project-current-name))
					 (tab-index (tab-bar--tab-index-by-name project-name)))
			(project-kill-buffers t)
			(when tab-index
				(tab-bar-close-tab (1+ tab-index)))))

	(defun tnh-emacs/project-magit-status ()
		(interactive)
		(magit-status (project-root (project-current))))

	(use-package project
		:ensure nil
		:bind (("C-M-p" . project-find-file)
					 ;; ("C-x p a" . projectile-add-known-project) 
					 :map project-prefix-map
					 ("k" . tnh-emacs/project-close-tab)
					 ("F" . consult-ripgrep))
		:config
		(setq project-vc-extra-root-markers '(".project.el" ".projectile"))
		(add-to-list 'project-switch-commands '(tnh-emacs/project-magit-status "Magit" "m"))
		(add-to-list 'project-switch-commands '(consult-ripgrep "Ripgrep" "F")))
		;; (setq project-list '("~/Documents/code/gitlab.netnod.se"))
		;; (setq project-switch-commands '((project-find-file "Find file")
		;; 																(project-find_regexp "Find regexp")
		;; 																(project-dired "Dired")
		;; 																(project-eshell "Eshell"))))

	(provide 'tnh-emacs-code)

The tnh-emacs-lsp.el module

	(use-package eglot
		:bind (:map eglot-mode-map
								("C-c C-a" . eglot-code-actions)
								("C-c C-r" . eglot-rename))
		:config
		(setq eglot-autoshutdown t))

	(use-package terraform-mode
		:ensure t
		:custom (terraform-indent-level 4)
		:config
		(defun tnh-emacs/terraform-mode-init ()
			(outline-minor-mode 1))
		(add-hook 'terraform-mode-hook 'tnh-emacs/terraform-mode-init))

	(provide 'tnh-emacs-lsp)

The tnh-emacs-term.el module

	(use-package vterm
		:ensure t)
	
	(provide 'tnh-emacs-term)

The tnh-emacs-dired.el module

	(use-package all-the-icons
		:ensure t)

	(use-package all-the-icons-dired
		:ensure t)

	(defun tnh-emacs/dired-mode-hook ()
		(interactive)
		(dired-hide-details-mode 1)
		(all-the-icons-dired-mode 1)
		(hl-line-mode 1))

	(use-package dired
		:ensure nil
		:bind (:map dired-mode-map
								("b" . dired-up-directory)
								("H" . dired-hide-details-mode))
		:config
		(setq dired-listing-switches "-agho --group-directories-first"
					dired-omit-verbose t
					dired-dwim-target t
					dired-hide-details-hide-symlink-targets nil
					dired-kill-when-opening-new-dired-buffer t
					delete-by-moving-to-trash t)
		(add-hook 'dired-mode-hook #'tnh-emacs/dired-mode-hook)) 

	(provide 'tnh-emacs-dired)

The tnh-emacs-ledger.el module

	(use-package ledger-mode
		:ensure t)

	(provide 'tnh-emacs-ledger)

The tnh-emacs-custom.el module

	(defun tnh-emacs/dig (host type)
		(interactive "sHost: \nsType: ")
		(dig host type))

	;; Vterm
	(defun tnh-emacs/vterm-open (name)
		(interactive "sSession name: ")
		(vterm (format "term-%s" name)))

	(defhydra+ tnh-emacs/emacs-hydra ()
		("t" tnh-emacs/vterm-open "Open new vterm session" :column "General"))

	(provide 'tnh-emacs-custom)