diff --git a/config.org b/config.org new file mode 100644 index 0000000..156f080 --- /dev/null +++ b/config.org @@ -0,0 +1,322 @@ +#+TITLE: Emacs Configuration +#+AUTHOR: nikolaishields +#+PROPERTY: header-args:emacs-lisp :tangle yes +#+STARTUP: overview + +* Bootstrap +This configuration needs to be loaded by =init.el=. Create an =init.el= with this content: + +#+begin_src emacs-lisp :tangle no +;;; init.el --- Load org config -*- lexical-binding: t -*- +;;; Commentary: +;;; Load literate config from config.org + +;;; Code: +(require 'org) +(org-babel-load-file + (expand-file-name + "config.org" + user-emacs-directory)) + +(provide 'init) +;;; init.el ends here +#+end_src + +* Performance Optimization +Early-init optimizations for faster Emacs startup. + +#+begin_src emacs-lisp +;; Garbage collection +(setq gc-cons-threshold 100000000) ; 100mb +(setq read-process-output-max (* 1024 1024)) ; 1mb + +;; Faster startup +(setq package-enable-at-startup nil) +(setq site-run-file nil) +#+end_src + +* Basic UI Configuration +Remove unnecessary UI elements and set basic preferences. + +#+begin_src emacs-lisp +;; Disable unnecessary UI elements +(dolist (mode '(scroll-bar-mode + tool-bar-mode + tooltip-mode + menu-bar-mode)) + (when (fboundp mode) (funcall mode -1))) + +(set-fringe-mode 10) +(winner-mode 1) + +;; Basic settings +(setq inhibit-startup-message t + visible-bell nil + ring-bell-function 'ignore + use-dialog-box nil + custom-file (locate-user-emacs-file "custom-vars.el")) + +(load custom-file 'noerror 'nomessage) +#+end_src + +* Package Management +Configure package archives and initialize use-package. + +#+begin_src emacs-lisp +(require 'package) +(setq package-archives + '(("melpa" . "https://melpa.org/packages/") + ("org" . "https://orgmode.org/elpa/") + ("elpa" . "https://elpa.gnu.org/packages/"))) + +(package-initialize) + +;; Bootstrap use-package +(unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) + +(require 'use-package) +(setq use-package-always-ensure t) +#+end_src + +* Theme and Visual Settings +Configure the visual appearance of Emacs. + +#+begin_src emacs-lisp +;; Theme configuration +(use-package catppuccin-theme) +(use-package doom-modeline + :init (doom-modeline-mode 1) + :custom + (doom-modeline-height 35) + (nerd-icons-scale-factor 1.35) + (doom-modeline-minor-modes-icon nil) + (doom-modeline-major-modes-icon nil) + (doom-modeline-icon t) + (doom-modeline-time-live-icon t)) + +;; Load theme +(setq modus-themes-mode-line '(accented borderless padded)) +(load-theme 'modus-vivendi t) + +;; Font configuration +(set-face-attribute 'default nil :font "FiraCode Nerd Font" :height 125) + +;; Line numbers +(column-number-mode) +(global-display-line-numbers-mode t) +(dolist (mode '(term-mode-hook + vterm-mode-hook)) + (add-hook mode (lambda () (display-line-numbers-mode 0)))) +#+end_src + +* Evil Mode Configuration +Vim keybindings for Emacs. + +#+begin_src emacs-lisp +(use-package evil + :init + (setq evil-want-integration t + evil-want-keybinding nil) + :config + (evil-mode 1)) + +(use-package evil-collection + :after evil + :config + (evil-collection-init)) +#+end_src + +* Completion Framework +Configure Vertico, Orderless, and Marginalia for enhanced completion. + +#+begin_src emacs-lisp +(use-package vertico + :bind (:map vertico-map + ("C-j" . vertico-next) + ("C-k" . vertico-previous) + ("C-f" . vertico-exit) + :map minibuffer-local-map + ("M-h" . backward-kill-word)) + :custom + (vertico-cycle t) + :init + (vertico-mode)) + +(use-package orderless + :custom + (completion-styles '(orderless basic)) + (completion-category-overrides '((file (styles basic partial-completion))))) + +(use-package marginalia + :after vertico + :custom + (marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil)) + :init + (marginalia-mode)) +#+end_src + +* Project Management +Projectile configuration for project management. + +#+begin_src emacs-lisp +(use-package projectile + :diminish projectile-mode + :bind + ("C-M-p" . projectile-find-file) + :bind-keymap + ("C-c p" . projectile-command-map) + :init + (setq projectile-project-search-path '("~/Code/git.dwavesys.local/" + "~/Code/nikolaishields/" + "~/.emacs.d/" + "/etc/nixos") + projectile-auto-discover t + projectile-enable-caching t + projectile-indexing-method 'alien) + :config + (projectile-mode) + (run-with-idle-timer 10 t #'projectile-discover-projects-in-search-path)) +#+end_src + +* LSP Configuration +Language Server Protocol setup for development. + +#+begin_src emacs-lisp +(use-package lsp-mode + :init + (setq lsp-keymap-prefix "C-c l") + :hook + ((python-ts-mode . lsp-deferred) + (go-ts-mode . lsp-deferred) + (rust-ts-mode . lsp-deferred) + (js-ts-mode . lsp-deferred) + (typescript-ts-mode . lsp-deferred) + (lsp-mode . lsp-enable-which-key-integration)) + :commands (lsp lsp-deferred) + :custom + (lsp-enable-symbol-highlighting t) + (lsp-enable-indentation t) + (lsp-enable-on-type-formatting t) + (lsp-modeline-code-actions-enable t) + (lsp-modeline-diagnostics-enable t) + (lsp-completion-provider :capf) + (lsp-idle-delay 0.500)) + +(use-package lsp-ui + :hook (lsp-mode . lsp-ui-mode) + :custom + (lsp-ui-doc-enable t) + (lsp-ui-doc-show-with-cursor t) + (lsp-ui-doc-show-with-mouse nil) + (lsp-ui-doc-position 'at-point) + (lsp-ui-doc-delay 0.5) + (lsp-ui-sideline-enable t) + (lsp-ui-sideline-show-diagnostics t) + (lsp-ui-sideline-show-hover t) + (lsp-ui-sideline-show-code-actions t)) +#+end_src + +* Development Tools +Configure completion, snippets, and syntax checking. + +#+begin_src emacs-lisp +(use-package company + :hook (lsp-mode . company-mode) + :custom + (company-minimum-prefix-length 1) + (company-idle-delay 0.0)) + +(use-package company-box + :hook (company-mode . company-box-mode)) + +(use-package yasnippet + :config + (yas-global-mode 1)) + +(use-package yasnippet-snippets + :after yasnippet) + +(use-package flycheck + :init + (global-flycheck-mode)) +#+end_src + +* Version Control +Magit configuration for Git integration. + +#+begin_src emacs-lisp +(use-package magit + :bind ("C-M-;" . magit-status) + :commands (magit-status magit-get-current-branch) + :custom + (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) + +(use-package magit-todos + :after magit + :config + (magit-todos-mode 1)) +#+end_src + +* Terminal Support +Configure VTerm for terminal emulation. + +#+begin_src emacs-lisp +(use-package vterm + :commands vterm + :custom + (term-prompt-regexp "^[^#$%>\n]*[#$%>] *") + (vterm-max-scrollback 10000)) + +(use-package multi-vterm + :after vterm + :config + (add-hook 'vterm-mode-hook + (lambda () + (setq-local evil-insert-state-cursor 'box) + (evil-insert-state)))) +#+end_src + +* Tree-sitter Configuration +Modern syntax highlighting and parsing. + +#+begin_src emacs-lisp +(use-package treesit-auto + :config + (global-treesit-auto-mode)) + +(setq treesit-language-source-alist + '((bash "https://github.com/tree-sitter/tree-sitter-bash") + (cmake "https://github.com/uyha/tree-sitter-cmake") + (css "https://github.com/tree-sitter/tree-sitter-css") + (elisp "https://github.com/Wilfred/tree-sitter-elisp") + (go "https://github.com/tree-sitter/tree-sitter-go") + (html "https://github.com/tree-sitter/tree-sitter-html") + (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "master" "src") + (json "https://github.com/tree-sitter/tree-sitter-json") + (python "https://github.com/tree-sitter/tree-sitter-python") + (typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src") + (yaml "https://github.com/ikatyang/tree-sitter-yaml"))) + +;; Install tree-sitter languages +(defun efs/install-treesit-language (lang) + "Install tree-sitter grammar for LANG if it's not already installed." + (unless (treesit-language-available-p lang) + (treesit-install-language-grammar lang))) + +(dolist (lang '(bash cmake css elisp go html javascript json python typescript yaml)) + (efs/install-treesit-language lang)) + +;; Remap major modes to tree-sitter versions +(setq major-mode-remap-alist + '((python-mode . python-ts-mode) + (javascript-mode . js-ts-mode) + (js-mode . js-ts-mode) + (typescript-mode . typescript-ts-mode) + (json-mode . json-ts-mode) + (css-mode . css-ts-mode) + (yaml-mode . yaml-ts-mode) + (bash-mode . bash-ts-mode) + (go-mode . go-ts-mode))) +#+end_src diff --git a/init.el b/init.el index e1d2ee2..54ae9f9 100644 --- a/init.el +++ b/init.el @@ -1,355 +1,13 @@ -(scroll-bar-mode -1) -(tool-bar-mode -1) -(tooltip-mode -1) -(set-fringe-mode 10) -(menu-bar-mode -1) -(winner-mode 1) +;;; init.el --- Load org config -*- lexical-binding: t -*- +;;; Commentary: +;;; Load literate config from config.org -(setq inhibit-startup-message t) -(setq visible-bell nil) -(setq ring-bell-function 'ignore) -(setq auto-save-timeout '2) -(setq auto-save-interval '2) -(setq global-auto-revert-non-file-buffers t) -(setq custom-file (locate-user-emacs-file "custom-vars.el")) -(load custom-file 'noerror 'nomessage) +;;; Code: +(require 'org) +(org-babel-load-file + (expand-file-name + "config.org" + user-emacs-directory)) -(setq use-dialog-box nil) -(global-auto-revert-mode 1) -(setq global-auto-rever-non-file-buffers t) - -;;(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) -;;(require 'package) -;;(setq package-archives '(("melpa" . "https://melpa.org/packages/") -;; ("org" . "https://orgmode.org/elpa/") -;; ("elpa" . "https://elpa.gnu.org/packages/"))) -;;(package-initialize) -;;(package-refresh-contents) - -(require 'package) -(setq package-archives '(("melpa" . "https://melpa.org/packages/") - ("org" . "https://orgmode.org/elpa/") - ("elpa" . "https://elpa.gnu.org/packages/"))) -(package-initialize) - -;; Initialize use-package -(unless (package-installed-p 'use-package) - (package-refresh-contents) - (package-install 'use-package)) - -(require 'use-package) -(setq use-package-always-ensure t) - -(use-package catppuccin-theme) -(use-package doom-modeline - :ensure t - :init (doom-modeline-mode 1) - :custom (doom-modeline-height 35) - (nerd-icons-scale-factor 1.35) - (doom-modeline-minor-modes-icon nil) - (doom-modeline-major-modes-icon nil) - (doom-modeline-icon t) - (doom-modeline-time-live-icon t)) -(use-package command-log-mode) - -(global-set-key (kbd "") 'keyboard-escape-quit) - -(setq modus-themes-mode-line '(accented borderless padded)) -(load-theme 'modus-vivendi t) - -(column-number-mode) -(global-display-line-numbers-mode t) -(dolist (mode '(term-mode-hook - vterm-mode-hook)) - (add-hook mode (lambda () (display-line-numbers-mode 0)))) - -(use-package which-key - :init (which-key-mode) - :diminish which-key-mode - :config - (setq which-key-idle-delay 0)) - -(set-face-attribute 'default nil :font "FiraCode Nerd Font" :height 125) - -(use-package kagi - :ensure t - :custom - ;; Univernal Summarizer settings - (kagi-summarizer-engine "cecil") - (kagi-summarizer-default-language "EN") - (kagi-summarizer-cache t)) - -(use-package vterm - :commands vterm - :config - (setq term-prompt-regexp "^[^#$%>\n]*[#$%>] *") - (setq vterm-max-scrollback 10000)) - -(setq org-todo-keywords - '((sequence "TODO" "IN-PROGRESS" "BLOCKED" "DONE"))) - - -(setq org-tag-alist '(("work") ("garage"))) - -(setq wl-copy-process nil) -(defun wl-copy (text) - (setq wl-copy-process (make-process :name "wl-copy" - :buffer nil - :command '("wl-copy" "-f" "-n") - :connection-type 'pipe - :noquery t)) -(process-send-string wl-copy-process text) -(process-send-eof wl-copy-process)) -(defun wl-paste () - (if (and wl-copy-process (process-live-p wl-copy-process)) - nil ; should return nil if we're the current paste owner - (shell-command-to-string "wl-paste -n | tr -d \r"))) -(setq interprogram-cut-function 'wl-copy) -(setq interprogram-paste-function 'wl-paste) - -;; Enable Evil -(use-package evil - :ensure t - :init - (setq evil-want-integration t) - (setq evil-want-keybinding nil) - :config - (evil-mode 1)) - -(use-package evil-collection - :after evil - :ensure t - :config - (evil-collection-init)) - -;; org -(use-package org-roam - :ensure t - :custom - (org-roam-directory (file-truename "~/Documents/notes")) - (org-roam-dailies-directory (file-truename "~/Documents/notes/daily")) - (org-roam-completion-everywhere t) - (org-roam-dailies-capture-templates - '(("d" "default" entry "* %<%I:%M %p>: %?" - :if-new (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n")))) - :bind (("C-c n l" . org-roam-buffer-toggle) - ("C-c n f" . org-roam-node-find) - ("C-c n i" . org-roam-node-insert) - :map org-mode-map - ("C-M-i" . completion-at-point) - :map org-roam-dailies-map - ("Y" . org-roam-dailies-capture-yesterday) - ("T" . org-roam-dailies-capture-tomorrow)) - :bind-keymap - ("C-c n d" . org-roam-dailies-map) - :config - (require 'org-roam-dailies) ;; Ensure the keymap is available - (org-roam-db-autosync-mode)) - -(org-roam-db-autosync-mode) -;; Bind this to C-c n I -(defun org-roam-node-insert-immediate (arg &rest args) - (interactive "P") - (let ((args (cons arg args)) - (org-roam-capture-templates (list (append (car org-roam-capture-templates) - '(:immediate-finish t))))) - (apply #'org-roam-node-insert args))) - -(setq org-agenda-files '("~/Documents/notes/daily/")) -(save-place-mode 1) - -;; vertico -(unless (package-installed-p 'vertico) - (package-install 'vertico)) - -(use-package vertico - :ensure t - :bind (:map vertico-map - ("C-j" . vertico-next) - ("C-k" . vertico-previous) - ("C-f" . vertico-exit) - :map minibuffer-local-map - ("M-h" . backward-kill-word)) - :custom - (vertico-cycle t) - :init - (vertico-mode)) - -(use-package savehist - :init - (savehist-mode)) - -(use-package marginalia - :after vertico - :ensure t - :custom - (marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil)) - :init - (marginalia-mode)) - -;; lsp -(use-package lsp-mode - :ensure t) - -(use-package lsp-nix - :ensure lsp-mode - :after (lsp-mode) - :demand t - :custom - (lsp-nix-nil-formatter ["nixpkgs-fmt"])) - -(use-package nix-mode - :hook (nix-mode . lsp-deferred) - :ensure t) -;; optionally -(use-package lsp-ui - :commands lsp-ui-mode - :config - (setq lsp-ui-doc-enable t) - (setq lsp-ui-doc-header t) - (setq lsp-ui-doc-include-signature t) - (setq lsp-ui-doc-border (face-foreground 'default)) - (setq lsp-ui-sideline-show-code-actions t) - (setq lsp-ui-sideline-delay 0.05)) -;; optionally if you want to use debugger -(use-package dap-mode) - -(use-package magit - :bind ("C-M-;" . magit-status) - :commands (magit-status magit-get-current-branch) - :custom - (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) - -(use-package magit-todos - :after magit - :config (magit-todos-mode 1)) - -(use-package consult - :ensure t) - -(use-package consult-projectile - :ensure t) - -(defun dw/switch-project-action () - "Switch to a workspace with the project name and start `magit-status'." - (persp-switch (projectile-project-name)) - (magit-status)) - -(defun default-project-layout () - "Set up the default window layout for any project." - (delete-other-windows) ; Close all other windows - (split-window-below) ; Split the window horizontally - (other-window 1) ; Move to the new window - (projectile-run-vterm) ; Move to the new window - (other-window 1) ; Move to the new window - (dired (projectile-project-root)) ; Open Dired in the new window - (other-window -2)) ; Move back to the second window -(defun my-universal-project-setup () - "Set up the project-specific layout and settings for any project." - (default-project-layout)) - -(add-hook 'projectile-after-switch-project-hook 'my-universal-project-setup) -(use-package projectile - :diminish projectile-mode - :config (projectile-mode) - :demand t - :bind ("C-M-p" . projectile-find-file) - :bind-keymap - ("C-c p" . projectile-command-map) - :init - (setq projectile-project-search-path '("~/Code/git.dwavesys.local/" "~/Code/nikolaishields/" "~/.emacs.d/" "/etc/nixos" ))) - -(setq projectile-auto-discover t) -(setq projectile-enable-caching t) -(run-with-idle-timer 10 t #'projectile-discover-projects-in-search-path) -(setq projectile-indexing-method 'alien) - -(global-set-key (kbd "M-n") #'other-window) - -;; emacs-land leader-key -(define-prefix-command '*my-leader*) -(global-set-key (kbd "C-t") *my-leader*) - -;; example: -(define-key *my-leader* (kbd "C-b") #'previous-buffer) - -(use-package multi-vterm :ensure t) -(use-package multi-vterm - :ensure t - :config - (add-hook 'vterm-mode-hook - (lambda () - (setq-local evil-insert-state-cursor 'box) - (evil-insert-state))) - (define-key vterm-mode-map [return] #'vterm-send-return) - (setq vterm-keymap-exceptions nil) - (evil-define-key 'insert vterm-mode-map (kbd "C-e") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-f") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-a") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-v") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-b") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-w") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-u") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-d") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-n") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-m") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-p") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-j") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-k") #'Vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-r") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-t") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-g") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-c") #'vterm--self-insert) - (evil-define-key 'insert vterm-mode-map (kbd "C-SPC") #'vterm--self-insert) - (evil-define-key 'normal vterm-mode-map (kbd "C-d") #'vterm--self-insert) - (evil-define-key 'normal vterm-mode-map (kbd ",c") #'multi-vterm) - (evil-define-key 'normal vterm-mode-map (kbd ",n") #'multi-vterm-next) - (evil-define-key 'normal vterm-mode-map (kbd ",p") #'multi-vterm-prev) - (evil-define-key 'normal vterm-mode-map (kbd "i") #'evil-insert-resume) - (evil-define-key 'normal vterm-mode-map (kbd "o") #'evil-insert-resume) - (evil-define-key 'normal vterm-mode-map (kbd "") #'evil-insert-resume)) - -(use-package orderless - :ensure t - :custom - (completion-styles '(orderless basic)) - (completion-category-overrides '((file (styles basic partial-completion))))) - -(setq treesit-language-source-alist - '((bash "https://github.com/tree-sitter/tree-sitter-bash") - (cmake "https://github.com/uyha/tree-sitter-cmake") - (css "https://github.com/tree-sitter/tree-sitter-css") - (elisp "https://github.com/Wilfred/tree-sitter-elisp") - (go "https://github.com/tree-sitter/tree-sitter-go") - (html "https://github.com/tree-sitter/tree-sitter-html") - (javascript "https://github.com/tree-sitter/tree-sitter-javascript" "master" "src") - (json "https://github.com/tree-sitter/tree-sitter-json") - (make "https://github.com/alemuller/tree-sitter-make") - (markdown "https://github.com/ikatyang/tree-sitter-markdown") - (python "https://github.com/tree-sitter/tree-sitter-python") - (toml "https://github.com/tree-sitter/tree-sitter-toml") - (tsx "https://github.com/tree-sitter/tree-sitter-typescript" "master" "tsx/src") - (typescript "https://github.com/tree-sitter/tree-sitter-typescript" "master" "typescript/src") - (docker "https://github.com/camdencheek/tree-sitter-dockerfile") - (yaml "https://github.com/ikatyang/tree-sitter-yaml"))) - -(defun my-projectile-compile-project-silently () - "Compile the project using the preset command without prompting." - (interactive) - (let ((compilation-read-command nil)) ;; Prevent prompt - (projectile-compile-project nil))) - -(define-key projectile-mode-map (kbd "C-c m") 'my-projectile-compile-project-silently) -(with-eval-after-load 'ox-latex - ;; Add the `mimore` LaTeX class - (add-to-list 'org-latex-classes - '("mimore" - "\\documentclass{mimore} - [NO-DEFAULT-PACKAGES] - [PACKAGES] - [EXTRA]" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))) +(provide 'init) +;;; init.el ends here