- Emacs Lisp 98.6%
- Shell 1.4%
| exwm | ||
| .gitignore | ||
| desktop.el | ||
| init.el | ||
| init.org | ||
| readme.org | ||
My Emacs Config in Org Mode
- Startup
- Package Management
- Editor Interface
- Indentation
- Make the GUI minimal.
- Improve scrolling.
- Line Numbers
- Matching parentheses
- Blinking cursor
- Transparency Settings
- Don't warn for large files (shows up when launching videos)
- Don't warn for following symlinked files
- Doom-modeline
- Theme
- Font and font size
- Use spaces instead of tabs for indentation
- Start fullscreen
- Disable line numbers
- All the icons
- Auto Highlight Mode
- Comment Tags
- Navigation
- Desktop notifications
- Development
- Org Mode
- Terminal Emulators
- File management
- End config
Startup
Garbage collector Threshold
Make startup faster by reducing the frequency of garbage collection
;; The default is 800 kilobytes. Measured in bytes.
(setq gc-cons-threshold (* 50 1000 1000))
Startup Time
Use a hook to measure Emacs startup time.
;; Profile emacs startup
(add-hook 'emacs-startup-hook
(lambda ()
(message "*** Emacs loaded in %s seconds with %d garbage collections."
(emacs-init-time "%.2f")
gcs-done)))
Disable startup menu
Disables the menu that comes on startup
(setq inhibit-startup-message t)
Keep .emacs.d Clean
I don't want a bunch of transient files showing up as untracked in the Git repo so I move them all to another location. Still under experimentation.
;; Change the user-emacs-directory to keep unwanted things out of ~/.emacs.d
(setq user-emacs-directory (expand-file-name "~/.cache/emacs/")
url-history-file (expand-file-name "url/history" user-emacs-directory))
;; Use no-littering to automatically set common paths to the new user-emacs-directory
(setup (:pkg no-littering)
(require 'no-littering))
;; Keep customization settings in a temporary file (thanks Ambrevar!)
(setq custom-file
(if (boundp 'server-socket-dir)
(expand-file-name "custom.el" server-socket-dir)
(expand-file-name (format "emacs-custom-%s.el" (user-uid)) temporary-file-directory)))
(load custom-file t)
Custom settings file
Without this emacs will dump generated custom settings in this file.
(setq custom-file "~/.emacs.d/custom.el") ;;
Debug mode on error
Enters debug mode if an error is detected on startup
(setq debug-on-error t)
Default Coding System
Avoid constant errors on Windows about the coding system by setting the default to UTF-8.
(set-default-coding-systems 'utf-8)
Package Management
Setup package repos
(require 'package)
;; Set up emacs package archives with 'package
(setq package-archives
'(("melpa" . "http://melpa.org/packages/") ;; Main package archive
("melpa-stable" . "http://stable.melpa.org/packages/") ;; Some packages might only do stable releases?
("org-elpa" . "https://orgmode.org/elpa/") ;; Org packages, I don't use org but seems like a harmless default
("elpa" . "https://elpa.gnu.org/packages/")))
Refresh package contents
(package-initialize)
(unless package-archive-contents
(package-refresh-contents))
Use-package
(unless (package-installed-p 'use-package)
(package-install 'use-package))
(require 'use-package)
(setq use-package-always-ensure t)
Editor Interface
Indentation
(setq-default indent-tabs-mode t)
(setq-default tab-width 4)
(custom-set-variables '(c-basic-offset 4)) ; required to use 4 width indentation in c-mode
Make the GUI minimal.
(scroll-bar-mode -1) ; Disable visible scrollbar
(tool-bar-mode -1) ; Disable the toolbar
(tooltip-mode -1) ; Disable tooltips
(set-fringe-mode -1) ; Give some breathing room
(menu-bar-mode -1) ; Disable the menu bar
(tab-line-mode -1) ; Disable the tabline below menu bar
(setq visible-bell t) ;setup the visible bell
Improve scrolling.
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1))) ;; one line at a time
(setq mouse-wheel-progressive-speed nil) ;; don't accelerate scrolling
(setq mouse-wheel-follow-mouse 't) ;; scroll window under mouse
(setq scroll-step 1) ;; keyboard scroll one line at a time
(setq use-dialog-box nil) ;; Disable dialog boxes since they weren't working in Mac OSX
Line Numbers
(column-number-mode)
(global-display-line-numbers-mode t)
Matching parentheses
Show which starting bracket a closing bracket matches
(show-paren-mode 1)
Blinking cursor
(blink-cursor-mode 1)
Transparency Settings
;; (set-frame-parameter (selected-frame) 'alpha '(90 . 50))
;; (add-to-list 'default-frame-alist '(alpha . (90 . 50)))
(set-frame-parameter nil 'alpha-background 80)
(add-to-list 'default-frame-alist '(alpha-background . 80))
(defun toggle-transparency ()
"Toggle the background transparency for the editor."
(interactive)
(let ((alpha-bg (frame-parameter nil 'alpha-background)))
(set-frame-parameter
nil 'alpha-background
(if (eql alpha-bg 100)
80 ; Set to 80 when toggled
100)))) ; Set to 100 when toggled off
(global-set-key (kbd "C-c t") 'toggle-transparency)
Don't warn for large files (shows up when launching videos)
(setq large-file-warning-threshold nil)
Don't warn for following symlinked files
(setq vc-follow-symlinks t)
Doom-modeline
(use-package doom-modeline
:ensure t
:init
(doom-modeline-mode 1)
:config
(setq doom-modeline-height 25)
(setq doom-modeline-hud nil)
(setq doom-modeline-buffer-file-name-style 'auto)
(setq doom-modeline-icon t)
(setq doom-modeline-buffer-state-icon t)
)
Theme
A nice gallery of Emacs themes can be found at https://emacsthemes.com/. Currently using Iosvkem.
Doom-themes
Space-emacs
(use-package spacemacs-theme
:init (load-theme 'spacemacs-dark t))
Doom Dracula
(use-package doom-themes
:init (load-theme 'doom-dracula t))
Doom Ayu Dark
Liked this a lot but Org mode block init line is hard to read in it
(use-package doom-themes
:init (load-theme 'doom-ayu-dark t))
Doom Iosvkem
(use-package doom-themes
:init (load-theme 'doom-Iosvkem t))
Doom Gruvbox
(use-package doom-themes
:init (load-theme 'doom-gruvbox t))
Kanagawa
(use-package kanagawa
:init (load-theme 'kanagawa t))
Naga Theme
I like this theme because of the green text used by hackers in terminal xd.
(use-package naga-theme
:init (load-theme 'naga t))
Nordic Midnight
(use-package nordic-night-theme
:init (load-theme 'nordic-midnight t))
Font and font size
;; (add-to-list 'default-frame-alist '(font . "Hack Nerd Font Mono:pixelsize=25"))
(set-face-attribute 'default nil :family "Hack Nerd Font" :height 200)
(set-face-attribute 'fixed-pitch nil :family "Hack Nerd Font Mono" :height 200)
Use spaces instead of tabs for indentation
(setq-default indent-tabs-mode nil)
Start fullscreen
Fullscreen by default, as early as possible. This tiny window is not enough
(add-to-list 'default-frame-alist '(fullscreen . maximized))
Disable line numbers
Disable line numbers for some modes where they might seem out of place
(dolist (mode '(org-mode-hook
term-mode-hook
vterm-mode-hook
eshell-mode-hook))
(add-hook mode (lambda () (display-line-numbers-mode 0))))
All the icons
(use-package all-the-icons)
(use-package all-the-icons-dired
:config (add-hook 'dired-mode-hook 'all-the-icons-dired-mode))
Auto Highlight Mode
(use-package auto-highlight-symbol
:defer t
:config
(global-auto-highlight-symbol-mode t)
)
Comment Tags
Comment tags become colorized when followed by a colon. Example: // BUG: We don't check for null return values Attention: NEEDS THE COLON AFTER THE KEYWORD
(use-package comment-tags
:defer t
:hook (prog-mode . comment-tags-mode)
:config
(setq comment-tags-keymap-prefix (kbd "C-c t"))
(setq comment-tags-keyword-faces
'(("TODO" . (:weight bold :foreground "Cyan"))
("FIXME" . (:weight bold :foreground "Red"))
("BUG" . (:weight bold :foreground "Red"))
("HACK" . (:weight bold :foreground "Yellow"))
("INFO" . (:weight bold :foreground "LimeGreen"))))
(setq comment-tags-comment-start-only t
comment-tags-require-colon t
comment-tags-case-sensitive t
comment-tags-show-faces t
comment-tags-lighter nil))
Navigation
Avy
(use-package avy)
Which key
(use-package which-key
:init (which-key-mode)
:diminish which-key-mode
:config
(setq which-key-idle-delay 0.3))
Counsel
(use-package counsel
:bind (("M-x" . counsel-M-x)
("C-x b" . counsel-ibuffer)
("C-x C-f" . counsel-find-file)
;; ("s-SPC" . counsel-linux-app)
:map minibuffer-local-map
("C-r" . 'counsel-minibuffer-history)))
Ivy
(use-package ivy
:diminish
:bind (("C-s" . swiper))
:config
(ivy-mode 1))
Ivy Rich
(use-package ivy-rich
:init (ivy-rich-mode 1))
Helpful
(use-package helpful
:custom
(counsel-describe-function-function #'helpful-callable)
(counsel-describe-variable-function #'helpful-variable)
:bind
([remap describe-function] . counsel-describe-function)
([remap describe-command] . helpful-command)
([remap describe-variable] . counsel-describe-variable)
([remap describe-key] . helpful-key))
General
(use-package general)
Evil mode
(use-package evil
:init (setq evil-undo-system 'undo-redo)
:config (evil-mode 1)
(add-hook 'vterm-mode-hook #'turn-off-evil-mode nil)
)
(use-package evil-escape
:config
(evil-escape-mode 1)
(setq-default evil-escape-key-sequence "jj")
(setq-default evil-escape-delay 0.2)
)
Desktop notifications
(require 'notifications)
Development
Autocompletion
LSP Mode
(use-package lsp-mode
:commands (lsp lsp-deferred)
:init
(setq lsp-keymap-prefix "C-c l")
(add-to-list 'auto-mode-alist '("\\.php" . php-ts-mode))t
:config
(lsp-enable-which-key-integration t)
(add-hook 'c-mode-hook 'lsp)
(add-hook 'php-mode-hook 'lsp)
(add-hook 'sql-mode-hook 'lsp)
(add-to-list 'lsp-language-id-configuration '(arduino-mode . "arduino"))
(lsp-register-client (make-lsp-client
:new-connection (lsp-stdio-connection '(
"clangd"
"--header-insertion=never"
))
:activation-fn (lsp-activate-on "arduino")
:server-id 'lsp-arduino-language-server
))
(add-hook 'arduino-mode-hook 'lsp)
(add-hook 'dart-mode-hook 'lsp)
)
LSP UI
(use-package lsp-ui
)
LSP Dart
(use-package
lsp-dart)
Yasnippet
(use-package yasnippet
:config (yas-global-mode 1))
Company
(use-package company
:bind
(("C-." . company-complete))
(:map company-active-map
("<tab>" . company-complete-selection))
(:map lsp-mode-map
("<tab>" . company-indent-or-complete-common))
:init
(company-mode 1)
:custom
(company-idle-delay 0) ;; I always want completion, give it to me asap
(company-dabbrev-downcase nil "Don't downcase returned candidates.")
(company-show-numbers t "Numbers are helpful.")
(company-tooltip-limit 10 "The more the merrier.")
:config
(add-hook 'after-init-hook 'global-company-mode)
;; (global-company-mode) ;; We want completion everywhere
;; use numbers 0-9 to select company completion candidates
(let ((map company-active-map))
(mapc (lambda (x) (define-key map (format "%d" x)
`(lambda () (interactive) (company-complete-number ,x))))
(number-sequence 0 9))))
(use-package company-box
:hook (company-mode . company-box-mode))
iedit
(use-package iedit)
Tree sitter
(use-package tree-sitter
:config
(add-hook 'c-mode-hook 'tree-sitter-hl-mode))
(use-package tree-sitter-langs)
Rainbow delimiters
(use-package rainbow-delimiters
:hook (prog-mode . rainbow-delimiters-mode))
Flycheck
(use-package flycheck
:config
(add-hook 'prog-mode-hook 'flycheck-mode) ;; always lint my code
(add-hook 'after-init-hook #'global-flycheck-mode))
(use-package flycheck-title
:config (add-hook 'flycheck-mode-hook 'flycheck-title-mode))
Language Modes
Arduino Mode
(use-package arduino-mode
:mode ("\\.ino\\'" . arduino-mode))
;; List of file extensions to be opened in Arduino mode."
(setq arduino-file-extensions "\\.\\(ino\\|c\\|cpp\\|h\\|hpp\\)\\'")
(defun arduino-project-p (dir)
"Return non-nil if DIR contains at least one .ino file."
(let ((ino-files (directory-files dir nil "\\.ino\\'")))
ino-files))
(defun arduino-mode-listen ()
"Enable Arduino mode if current file or its directory contains a .ino file."
(let* ((file-name (buffer-file-name))
(file-dir (when file-name (file-name-directory file-name))))
(when (and file-name
file-dir
(or (string-match "\\.ino\\'" file-name)
(arduino-project-p file-dir)))
(arduino-mode))))
(add-hook 'find-file-hook #'arduino-mode-listen)
Octave mode
(add-to-list 'auto-mode-alist '("\\.m" . octave-mode))
(use-package ac-octave
:init
(add-hook 'octave-mode-hook
#'(lambda () (ac-octave-setup)))
(add-hook 'octave-mode-hook
#'(lambda () (auto-complete-mode)))
(add-hook 'octave-mode-hook
#'(lambda () (company-mode -1)))
)
Yuck Mode
(use-package yuck-mode)
Nix Mode
(use-package nix-mode
:mode "\\.nix\\'")
Dart Mode
(use-package dart-mode
:hook (dart-mode . flutter-test-mode))
(use-package flutter
:after dart-mode
:bind (:map dart-mode-map
("C-M-x" . #'flutter-run-or-hot-reload))
)
Plantuml Mode
(use-package plantuml-mode
:init (setq plantuml-executable-path "/usr/bin/plantuml")
(setq plantuml-default-exec-mode 'executable)
)
Project Management
Projectile
(use-package projectile
:diminish projectile-mode
:config (projectile-mode)
:bind-keymap ("C-c p" . projectile-command-map)
:custom ((projectile-completion-system 'ivy))
:init
(when (file-directory-p "~/Documents/BOT/BOT Codes")
(setq projectile-project-search-path '("~/Documents/BOT/BOT Codes")))
(setq projectile-switch-project-action #'projectile-dired))
Counsel Projectile
(use-package counsel-projectile
:config (counsel-projectile-mode))
Version Control
Magit
(use-package magit
:custom
(magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))
Simple HTTPD
(use-package simple-httpd)
Realgud
(use-package realgud)
Slime
Got configuration frorm here.
(use-package slime
:init
(progn
(require 'slime-autoloads)
(add-hook 'slime-mode-hook
(lambda ()
(unless (slime-connected-p)
(save-excursion (slime))))))
:config
(progn
(use-package slime-company)
(setf inferior-lisp-program "sbcl")
(slime-setup '(slime-fancy slime-company))
(setq slime-net-coding-system 'utf-8-unix)
(define-key lisp-mode-map (kbd "C-c C-q") 'slime-close-all-parens-in-sexp)
(define-key slime-mode-indirect-map (kbd "M-_") 'paredit-convolute-sexp)
(define-key slime-repl-mode-map (kbd "C-c C-z") #'quit-window)))
Org Mode
Got a lot of these settings from org-mode-better-defaults.
(defun org-mode-setup ()
"Setup the orgmode."
(variable-pitch-mode 1)
(auto-fill-mode 0)
(visual-line-mode 1))
(use-package org
:hook (org-mode . org-mode-setup)
:bind ("C-c l" . org-store-link)
("C-c a" . org-agenda)
("C-c c" . org-capture)
:config
(setq org-ellipsis " ▼"))
Org novelist
(use-package org-novelist
:load-path "~/.emacs.d/org-novelist/"
:init (if (not(file-directory-p "~/.emacs.d/org-novelist"))
(shell-command "git clone https://github.com/sympodius/org-novelist ~/.emacs.d/org-novelist"))
:custom
(org-novelist-language-tag "en-GB")
(org-novelist-author "Muhammad Talha Noshahi")
(org-novelist-author-email "talhanoshahi@protonmail.com")
(org-novelist-automatic-referencing-p nil))
Org Bullets
(use-package org-bullets
:config
(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))
Org Indent
(use-package org-indent
:ensure nil
:diminish
:hook (org-mode . org-indent-mode)
:custom
(org-indent-indentation-per-level 4))
Org Autolist
(use-package org-autolist
:hook (org-mode . org-autolist-mode)
)
Terminal Emulators
Term
(use-package term)
Eterm
(use-package eterm-256color
:hook (term-mode . eterm-256color-mode))
Vterm
(use-package vterm
:custom (vterm-install t)
:commands vterm
:config
(setq vterm-max-scrollback 10000)
(setq vterm-shell "/usr/bin/fish"))
File management
Dired Collapse
(use-package dired-collapse)
Dired Ranger
(use-package dired-ranger)
Dired Sidebar
(use-package dired-sidebar
:bind (("C-x C-n" . dired-sidebar-toggle-sidebar))
:ensure t
:commands (dired-sidebar-toggle-sidebar)
:init
(add-hook 'dired-sidebar-mode-hook
(lambda ()
(unless (file-remote-p default-directory)
(auto-revert-mode))))
:config
(push 'toggle-window-split dired-sidebar-toggle-hidden-commands)
(push 'rotate-windows dired-sidebar-toggle-hidden-commands)
(setq dired-sidebar-subtree-line-prefix "__")
(setq dired-sidebar-theme 'icons)
(setq dired-sidebar-use-term-integration t)
(setq dired-sidebar-use-custom-font t))
End config
(provide 'init)
;;; init.el ends here