Init files for my Emacs setup
  • Emacs Lisp 98.6%
  • Shell 1.4%
Find a file
2026-03-16 23:51:25 +05:00
exwm Made a new repository for emacs config 2023-11-10 15:48:22 +05:00
.gitignore Added the ignore file 2025-01-02 19:55:01 +05:00
desktop.el Made a new repository for emacs config 2023-11-10 15:48:22 +05:00
init.el Add plantuml mode and tangle no or unused modes 2025-11-20 18:57:26 +05:00
init.org Add evil-escape-key to "jj" and add php mode hook for php files 2026-03-16 23:51:25 +05:00
readme.org Symlinked readme to init.org 2026-02-24 14:53:17 +05:00

My Emacs Config in Org Mode

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