Skip to content

Instantly share code, notes, and snippets.

@genmeblog
Last active March 1, 2026 20:48
Show Gist options
  • Select an option

  • Save genmeblog/fbec9d790ffd46aafdbf0cef7c69471d to your computer and use it in GitHub Desktop.

Select an option

Save genmeblog/fbec9d790ffd46aafdbf0cef7c69471d to your computer and use it in GitHub Desktop.
Emacs config
;;
(setq gc-cons-threshold 10000000)
;; Restore after startup
(add-hook 'after-init-hook
(lambda ()
(setq gc-cons-threshold 1000000)
(message "gc-cons-threshold restored to %S"
gc-cons-threshold)))
;; package management
(require 'package)
(setq package-archives '(("melpa" . "https://melpa.org/packages/")
("org" . "https://orgmode.org/elpa/")
("elpa" . "https://elpa.gnu.org/packages/")
("nongnu" . "https://elpa.nongnu.org/nongnu/")))
(package-initialize)
(unless package-archive-contents
(package-refresh-contents))
(unless (package-installed-p 'use-package)
(package-install 'use-package))
(setq load-prefer-newer t)
(require 'use-package)
;; auto install when necessary
(setq use-package-always-ensure t)
;; backups and other internal files should be
;; (use-package no-littering)
;; (setq auto-save-file-name-transforms
;; `((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(setq backup-directory-alist `((".*" . ,(concat user-emacs-directory "backup"))))
(setq backup-by-copying t ; Don't delink hardlinks
delete-old-versions t ; Clean up the backups
version-control t ; Use version numbers on backups,
kept-new-versions 5 ; keep some new versions
kept-old-versions 2) ; and some old ones, too
(when (file-exists-p "~/.emacs.d/custom.el")
(load "~/.emacs.d/custom.el"))
;; local alist database
(defun local-data (key)
(with-temp-buffer
(insert-file-contents-literally "~/.emacs.d/localdata")
(alist-get key (read (current-buffer)))))
(save-place-mode 1)
(setq save-place-file (concat user-emacs-directory "places"))
(setq recentf-save-file (concat user-emacs-directory ".recentf"))
(use-package recentf
:config (recentf-mode 1)
:custom ((recentf-max-menu-items 40)))
;; gui / global
(setq inhibit-startup-screen t)
(tool-bar-mode -1)
(column-number-mode t)
(global-display-line-numbers-mode t)
(size-indication-mode t)
(delete-selection-mode t)
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(setq visible-bell t)
(scroll-bar-mode -1)
(setq-default frame-title-format "%b (%f)")
(global-prettify-symbols-mode +1)
(display-time-mode 1)
(defalias 'yes-or-no-p 'y-or-n-p)
(set-face-attribute 'default nil :font "RobotoMono Nerd Font" :height 100 :weight 'regular)
(set-face-attribute 'bold nil :font "RobotoMono Nerd Font" :height 100 :weight 'bold)
(set-face-attribute 'italic nil :font "BlexMono Nerd Font" :height 100 :weight 'regular :slant 'italic)
(set-fontset-font t 'unicode (font-spec :name "RobotoMono Nerd Font" :size 10) nil)
(use-package emacs-gc-stats)
(emacs-gc-stats-mode +1)
(use-package unicode-fonts
:custom (unicode-fonts-skip-font-groups '(low-quality-glyphs))
;; :config (unicode-fonts-setup)
)
(use-package solarized-theme)
(use-package jazz-theme)
(use-package color-theme-sanityinc-tomorrow)
(use-package moe-theme)
(use-package modus-themes)
;; (setq tsl/light-theme 'solarized-selenized-light)
(setq tsl/light-theme 'tango)
(setq tsl/dark-theme 'jazz)
;; (use-package centaur-tabs
;; :demand 1
;; :config (setq centaur-tabs-style "bar"
;; centaur-tabs-height 32
;; centaur-tabs-set-icons t
;; centaur-tabs-show-new-tab-button t
;; centaur-tabs-set-modified-marker t
;; centaur-tabs-show-navigation-buttons t
;; centaur-tabs-set-bar 'under
;; centaur-tabs-show-count nil
;; ;; centaur-tabs-label-fixed-length 15
;; ;; centaur-tabs-gray-out-icons 'buffer
;; ;; centaur-tabs-plain-icons t
;; x-underline-at-descent-line t
;; centaur-tabs-left-edge-margin nil)
;; (centaur-tabs-change-fonts (face-attribute 'default :font) 110)
;; (centaur-tabs-headline-match)
;; (centaur-tabs-mode t))
(use-package doom-themes
:config
(setq doom-themes-enable-bold t
doom-themes-enable-italic t)
(load-theme tsl/light-theme t)
(doom-themes-visual-bell-config)
(doom-themes-neotree-config)
(setq doom-themes-treemacs-theme "doom-atom")
(doom-themes-treemacs-config))
;; (setq frame-background-mode 'dark)
(use-package all-the-icons)
;; (use-package doom-modeline
;; :init (doom-modeline-mode 1)
;; :custom ((doom-modeline-height 16)
;; (doom-modeline-buffer-file-name-style 'truncate-all)
;; (doom-modeline-minor-modes t)))
(use-package which-key
:diminish which-key-mode
:config (which-key-mode)
:custom ((which-key-idle-delay 1.0)
(which-key-enable-extended-define-key t)))
(use-package paredit
:config (paredit-mode 1))
(use-package adjust-parens
:config (adjust-parens-mode 1))
(use-package rainbow-delimiters
:config (rainbow-delimiters-mode 1))
(use-package paren
:custom ((show-paren-delay 0))
:config
(set-face-background 'show-paren-match "#ffaaaa")
(show-paren-mode 1))
(use-package rainbow-mode
:config
(rainbow-mode 1))
(use-package general)
(use-package restart-emacs)
(use-package math-preview
:custom ((math-preview-command "/home/tsl/node_modules/math-preview/math-preview.js")
(math-preview-scale 1.0))
:bind (("C-c m p" . 'math-preview-all)
("C-c m c" . 'math-preview-clear-all)
("C-c m ." . 'math-preview-at-point)
("C-c m /" . 'math-preview-clear-at-point)))
(use-package smex
:config
(smex-initialize))
(use-package ivy
:init
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq ivy-use-selectable-prompt t)
(setq ivy-re-builders-alist '((t . ivy--regex-ignore-order))))
;; ivy-prescient removed
(use-package counsel
:custom
(counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
:config
(counsel-mode 1))
(use-package ivy-rich
:after ivy
:init (ivy-rich-mode 1))
(use-package expand-region
:bind ("C-@" . er/expand-region))
(use-package multiple-cursors
:bind (("C->" . mc/mark-next-like-this)
("C-<" . mc/mark-previous-like-this)
("C-c C-<" . mc/mark-all-like-this)))
(use-package helpful
:commands (helpful-callable helpful-variable helpful-command helpful-key)
: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))
(use-package hydra
:config (require 'hydra))
(use-package ivy-hydra
:after (ivy hydra))
(use-package company
:bind (:map company-active-map
("<tab>" . company-complete-selection))
:custom
(company-minimum-prefix-length 1)
(company-idle-delay 0.7)
:config
(global-company-mode 1))
(use-package company-flx
:config (company-flx-mode 1))
(use-package company-box
:hook (company-mode . company-box-mode))
(use-package projectile
:diminish projectile-mode
:config (projectile-mode 1)
:custom ((projectile-completion-system 'ivy)
(projectile-create-missing-test-files t))
:bind-keymap
("C-c p" . projectile-command-map)
:init
(setq projectile-switch-project-action #'projectile-dired)
(setq projectile-project-search-path '("~/clojure/")))
(use-package counsel-projectile
:after projectile
:config (counsel-projectile-mode 1))
(use-package project-explorer)
(use-package magit
:commands magit-status)
(setq magit-diff-refine-hunk 'all)
(use-package dired
:ensure nil
:commands (dired dired-jump)
:bind (("C-x C-j" . dired-jump))
:custom ((dired-listing-switches "-agho --group-directories-first")))
(use-package dired-single
:commands (dired dired-jump))
(use-package dired-ranger)
(use-package dired-collapse)
(use-package dired-rainbow)
(use-package all-the-icons-dired
:hook (dired-mode . all-the-icons-dired-mode))
(use-package all-the-icons-ivy-rich)
(use-package nerd-icons-ivy-rich)
(use-package nerd-icons-completion)
(use-package uniquify
:ensure nil
:init
(setq uniquify-buffer-name-style 'post-forward))
(use-package yasnippet
:config (yas-global-mode 1))
(use-package ivy-yasnippet)
(use-package ace-window
:bind (("M-]" . ace-window))
:config (ace-window-display-mode 1))
(use-package paradox
:config (paradox-enable))
(use-package anzu
:config (global-anzu-mode 1))
(use-package move-text
:init
(move-text-default-bindings))
(use-package aggressive-indent)
(use-package diminish)
(use-package minions
:config (minions-mode 1)
:custom ((minions-prominent-modes '(flycheck-mode))))
(use-package default-text-scale
:config (default-text-scale-mode))
(use-package virtual-comment)
;; R
(use-package ess)
(use-package poly-R)
;; treemacs
(use-package treemacs-all-the-icons)
(use-package treemacs
:bind (("C-x p" . treemacs)))
(use-package treemacs-projectile)
(use-package treemacs-magit)
(use-package treemacs-nerd-icons)
;; (global-eldoc-mode)
;; clojure
(use-package flycheck)
(use-package flycheck-clj-kondo)
(use-package clojure-mode
:config
(require 'flycheck-clj-kondo))
(use-package cider
:custom ((cider-eldoc-display-context-dependent-info t)
(cider-repl-pop-to-buffer-on-connect 'display-only)
(cider-overlays-use-font-lock t)
(cider-repl-buffer-size-limit 60000)))
(use-package clj-refactor)
(use-package clojure-mode-extra-font-locking)
(use-package sayid)
(use-package cljr-ivy)
(use-package clojure-snippets)
(use-package ivy-clojuredocs
:bind (:map clojure-mode-map
(("C-c d" . ivy-clojuredocs-at-point))))
(use-package clj-decompiler
:custom ((clj-decompiler-decompiler-version "0.3.4")))
(use-package kaocha-runner
:after (cider-mode)
:bind (:map clojure-mode-map
("C-c k t" . kaocha-runner-run-test-at-point)
("C-c k r" . kaocha-runner-run-tests)
("C-c k a" . kaocha-runner-run-all-tests)
("C-c k w" . kaocha-runner-show-warnings)
("C-c k h" . kaocha-runner-hide-windows)))
;; lsp
;; (use-package lsp-mode
;; :hook ((clojure-mode . lsp))
;; :custom ((lsp-lens-enable t)
;; (lsp-enable-indentation nil)
;; (read-process-output-max (* 1024 1024))
;; (lsp-clojure-custom-server-command '("/usr/local/bin/clojure-lsp"))
;; (lsp-keymap-prefix "C-c l"))
;; :config (dolist (m '(clojure-mode
;; clojurec-mode
;; clojurescript-mode
;; clojurex-mode))
;; (add-to-list 'lsp-language-id-configuration `(,m . "clojure")))
;; (lsp-enable-which-key-integration))
;; (use-package lsp-ui :commands lsp-ui-mode)
;; (use-package lsp-treemacs)
;; (use-package lsp-ivy)
;; (use-package consult-lsp)
;; (use-package eglot
;; :hook ((clojure-mode . eglot-ensure)))
(use-package iedit
:bind (("C-c ;" . iedit-mode)))
;;
(use-package nov
:custom ((nov-text-width 80))
:config (add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode)))
;;
(use-package w3m
:custom ((browse-url-browser-function 'w3m-browse-url)))
(use-package git-gutter)
(use-package marginalia
:init (marginalia-mode))
(use-package vterm :ensure t)
(use-package eat
:pin nongnu
:custom
(eat-kill-buffer-on-exit t)
:config
(delete [?\C-u] eat-semi-char-non-bound-keys) ; make C-u work in Eat terminals like in normal terminals
(delete [?\C-g] eat-semi-char-non-bound-keys) ; ditto for C-g
(eat-update-semi-char-mode-map)
;; XXX: Awkward workaround for the need to call eat-reload after changing Eat's keymaps,
;; but reloading from :config section causes infinite recursion because :config wraps with-eval-after-load.
(defvar eat--prevent-use-package-config-recursion nil)
(unless eat--prevent-use-package-config-recursion
(setq eat--prevent-use-package-config-recursion t)
(eat-reload))
(makunbound 'eat--prevent-use-package-config-recursion))
;; gptel
(use-package gptel
:demand t)
(setq
gptel-model 'gemini-3-flash-preview
gptel-backend (gptel-make-gemini "Gemini" :key (local-data 'gemini) :stream t))
(setq gptel-directives
(assq-delete-all 'clojure-fastmath (assq-delete-all 'rewrite-docstring gptel-directives)))
(add-to-list 'gptel-directives '(clojure-fastmath . "You are the expert Clojure developer with great knowledge of applied mathematics and numerical methods. You will be focusing on writing `fastmath` Clojure code, tests and documentation. Please, be concise and accurate."))
(add-to-list 'gptel-directives '(rewrite-docstring . "You are the expert Clojure developer with great knowledge of applied mathematics and numerical methods. Be concise and accurate. Please write or rewrite a given docstring. Rewrite only docstring, do not touch actual code."))
(add-to-list 'load-path "~/.emacs.d/github/mcp.el/")
(require 'mcp-hub)
(require 'gptel-integrations)
(use-package minuet)
(use-package julia-mode)
(use-package julia-repl)
(use-package julia-snail
:ensure t
:custom ((julia-snail-terminal-type :eat)
(julia-snail-executable "/home/tsl/julia-1.11.3/bin/julia"))
:hook (julia-mode . julia-snail-mode))
(add-hook 'julia-mode-hook 'electric-pair-mode)
(setq julia-repl-executable-records
'((default "/home/tsl/julia-1.11.3/bin/julia"))) ; compiled from the repository
(use-package kibit-helper)
(global-git-gutter-mode +1)
(global-prettify-symbols-mode +1)
(autoload 'iimage-mode "iimage" "Support Inline image minor mode." t)
(autoload 'zap-up-to-char "misc"
"Kill up to, but not including ARGth occurrence of CHAR." t)
(defun toggle-comment-on-line ()
"comment or uncomment current line"
(interactive)
(comment-or-uncomment-region (line-beginning-position) (line-end-position)))
(defun prev-window ()
(interactive)
(other-window -1))
(general-define-key
"M-z" 'zap-up-to-char
"C-<tab>" 'indent-relative
"C-x C-b" 'counsel-ibuffer
"C-s" 'swiper
"C-r" 'isearch-backward-regexp
"C-M-s" 'isearch-forward
"C-M-r" 'isearch-backwatdrd
"C-." 'company-complete
"C-c t d" (lambda () (interactive) (load-theme tsl/dark-theme t))
"C-c t l" (lambda () (interactive) (load-theme tsl/light-theme t))
"C-;" 'toggle-comment-on-line
"C-M-<next>" 'other-window
"C-M-<prior>" 'prev-window)
(add-hook 'prog-mode-hook (lambda () (setq indent-tabs-mode nil)))
(add-hook 'prog-mode-hook 'rainbow-mode)
(add-hook 'prog-mode-hook 'eldoc-mode)
(add-hook 'prog-mode-hook 'adjust-parens-mode)
(add-hook 'prog-mode-hook 'rainbow-delimiters-mode)
(add-hook 'prog-mode-hook 'show-paren-mode)
(add-hook 'prog-mode-hook 'subword-mode)
(add-hook 'prog-mode-hook 'hs-minor-mode)
(add-hook 'prog-mode-hook 'aggressive-indent-mode)
(add-hook 'prog-mode-hook 'iimage-mode)
(add-hook 'clojure-mode-hook 'paredit-mode)
(add-hook 'clojure-mode-hook 'flycheck-mode)
(add-hook 'clojure-mode-hook 'eldoc-mode)
(add-hook 'clojure-mode-hook
(lambda ()
(push '("defn" . ?Λ) prettify-symbols-alist)
(push '("def" . ?≡) prettify-symbols-alist)))
(add-hook 'clojure-mode-hook 'cider-mode)
(add-hook 'clojure-mode-hook (lambda ()
(eval-after-load 'cider
'(progn
(require 'clj-decompiler)
(clj-decompiler-setup)
(clj-refactor-mode 1)
(cljr-add-keybindings-with-prefix "C-c C-m")))))
;; When there's a cider error, show its buffer and switch to it
(setq cider-show-error-buffer t)
(setq cider-auto-select-error-buffer t)
;; Where to store the cider history.
(setq cider-repl-history-file "~/.emacs.d/cider-history")
;; Wrap when navigating history.
(setq cider-repl-wrap-history t)
;; add sayid :/
(setq cider-clojure-cli-aliases ":dev")
(cider-add-to-alist 'cider-jack-in-dependencies
"com.billpiel/sayid" "0.1.0")
;; Use clojure mode for other extensions
(add-to-list 'auto-mode-alist '("\\.edn$" . clojure-mode))
(add-to-list 'auto-mode-alist '("\\.boot$" . clojure-mode))
(add-to-list 'auto-mode-alist '("\\.cljs.*$" . clojure-mode))
(eval-after-load 'clojure-mode '(sayid-setup-package))
;; clerk
(defun clerk-show ()
(interactive)
(when-let
((filename
(buffer-file-name)))
(save-buffer)
(cider-interactive-eval
(concat "(nextjournal.clerk/show! \"" filename "\")"))))
;; (define-key clojure-mode-map (kbd "<M-return>") 'clerk-show)
;;
(use-package clay)
(define-key clojure-mode-map (kbd "<M-return>") 'clay-make-ns-quarto-html)
(define-key clojure-mode-map (kbd "<M-S-return>") 'clay-make-defun-at-point)
(setq auto-window-vscroll nil)
(setq doom-modeline-enable-word-count nil)
(setq eldoc-echo-area-use-multiline-p t)
;;
(add-hook 'image-mode-hook
(lambda ()
(auto-revert-mode)
(auto-image-file-mode)))
(setq auto-revert-interval 5)
(setq auto-revert-use-notify t)
(setq auto-revert-avoid-polling nil)
;;
(load "server")
(unless (server-running-p) (server-start))
(desktop-save-mode 1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment