diff --git a/home/laptop/programs/emacs/default.nix b/home/laptop/programs/emacs/default.nix index f620c35..3685a1f 100644 --- a/home/laptop/programs/emacs/default.nix +++ b/home/laptop/programs/emacs/default.nix @@ -18,20 +18,42 @@ package = with pkgs; (emacsPackagesFor emacs-unstable).emacsWithPackages (epkgs: with epkgs; [ + general + doom-themes treesit-grammars.with-all-grammars treesit-auto prisma-mode lsp-tailwindcss + evil + evil-collection + flycheck + ivy + ivy-rich + counsel + counsel-projectile + magit + forge + rainbow-delimiters + ivy-prescient + helpful + hydra + projectile + lsp-mode + lsp-ui + lsp-treemacs + lsp-ivy + company + company-box + dired-single + dired-open + bind-key + all-the-icons + all-the-icons-dired + smartparens + no-littering + command-log-mode + doom-modeline ]); - extraConfig = '' - (use-package treesit-auto - :config - (global-treesit-auto-mode)) - (use-package prisma-mode) - (add-hook 'prisma-mode-hook 'lsp) - (use-package lsp-tailwindcss - :init - (setq lsp-tailwindcss-add-on-mode t)) - ''; + extraConfig = builtins.readFile ./init.el; }; } diff --git a/home/laptop/programs/emacs/init.el b/home/laptop/programs/emacs/init.el new file mode 100644 index 0000000..9929ea2 --- /dev/null +++ b/home/laptop/programs/emacs/init.el @@ -0,0 +1,272 @@ +;; NOTE: init.el is now generated from Emacs.org. Please edit that file +;; in Emacs and init.el will be generated automatically! + +;; You will most likely need to adjust this font size for your system! +;; Make frame transparency overridable +(defvar efs/frame-transparency '(90 . 90)) + +;; The default is 800 kilobytes. Measured in bytes. +(setq gc-cons-threshold (* 50 1000 1000)) + +(defun efs/display-startup-time () + (message "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 #'efs/display-startup-time) + +;; NOTE: If you want to move everything out of the ~/.emacs.d folder +;; reliably, set `user-emacs-directory` before loading no-littering! +;(setq user-emacs-directory "~/.cache/emacs") + +(use-package no-littering) + +(use-package bind-key + :ensure t + :config + (add-to-list 'same-window-buffer-names "*Personal Keybindings*")) + +;; no-littering doesn't set this by default so we must place +;; auto save files in the same path as it uses for sessions +(setq auto-save-file-name-transforms + `((".*" ,(no-littering-expand-var-file-name "auto-save/") t))) + +(setq inhibit-startup-message t) + +(scroll-bar-mode -1) ; Disable visible scrollbar +(tool-bar-mode -1) ; Disable the toolbar +(tooltip-mode -1) ; Disable tooltips +(set-fringe-mode 10) ; Give some breathing room + +(menu-bar-mode -1) ; Disable the menu bar + +;; Set up the visible bell +(setq visible-bell t) + +(column-number-mode) +(global-display-line-numbers-mode t) + +;; Set frame transparency +(set-frame-parameter (selected-frame) 'alpha efs/frame-transparency) +(add-to-list 'default-frame-alist `(alpha . ,efs/frame-transparency)) +(set-frame-parameter (selected-frame) 'fullscreen 'maximized) +(add-to-list 'default-frame-alist '(fullscreen . maximized)) + +;; Disable line numbers for some modes +(dolist (mode '(org-mode-hook + term-mode-hook + shell-mode-hook + treemacs-mode-hook + eshell-mode-hook)) + (add-hook mode (lambda () (display-line-numbers-mode 0)))) + +;; Make ESC quit prompts +(global-set-key (kbd "") 'keyboard-escape-quit) +(use-package treesit-auto + :config + (global-treesit-auto-mode)) +(use-package prisma-mode) +(add-hook 'prisma-mode-hook 'lsp) +(use-package lsp-tailwindcss + :init + (setq lsp-tailwindcss-add-on-mode t)) + +(use-package general + :after evil + :config + (general-create-definer + :keymaps '(normal insert visual emacs) + :prefix "SPC" + :global-prefix "C-SPC")) + + +(use-package evil + :init + (setq evil-want-integration t) + (setq evil-want-keybinding nil) + (setq evil-want-C-u-scroll t) + (setq evil-want-C-i-jump nil) + :config + (evil-mode 1) + (define-key evil-insert-state-map (kbd "C-g") 'evil-normal-state) + (define-key evil-insert-state-map (kbd "C-h") 'evil-delete-backward-char-and-join) + + ;; Use visual line motions even outside of visual-line-mode buffers + (evil-global-set-key 'motion "j" 'evil-next-visual-line) + (evil-global-set-key 'motion "k" 'evil-previous-visual-line) + + (evil-set-initial-state 'messages-buffer-mode 'normal) + (evil-set-initial-state 'dashboard-mode 'normal)) + +(use-package evil-collection + :after evil + :config + (evil-collection-init)) + +(use-package command-log-mode + :commands command-log-mode) + +(use-package doom-themes + :init (load-theme 'doom-tokyo-night t)) + +(use-package all-the-icons) + +(use-package doom-modeline + :init (doom-modeline-mode 1) + :custom ((doom-modeline-height 15))) + +(use-package which-key + :defer 0 + :diminish which-key-mode + :config + (which-key-mode) + (setq which-key-idle-delay 1)) + +(use-package ivy + :diminish + :config + (ivy-mode 1)) + +(use-package ivy-rich + :after ivy + :init + (ivy-rich-mode 1)) + +(use-package counsel + :custom + (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only) + :config + (counsel-mode 1)) + +(use-package ivy-prescient + :after counsel + :custom + (ivy-prescient-enable-filtering nil) + :config + ;; Uncomment the following line to have sorting remembered across sessions! + ;(prescient-persist-mode 1) + (ivy-prescient-mode 1)) + +(add-hook 'lsp-mode-hook #'smartparens-mode) + +(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)) + +(use-package hydra + :defer t) + +(use-package lsp-mode + :after which-key + :commands (lsp lsp-deferred) + :config + (lsp-enable-which-key-integration t)) + +(use-package lsp-ui + :hook (lsp-mode . lsp-ui-mode) + :custom + (lsp-ui-doc-position 'bottom)) + +(use-package lsp-treemacs + :after lsp) + +(use-package lsp-ivy + :after lsp) + +(use-package typescript-ts-mode + :config + (setq typescript-indent-level 2)) + +(use-package company + :after lsp-mode + :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 projectile + :diminish projectile-mode + :config (projectile-mode) + :custom ((projectile-completion-system 'ivy)) + :init + ;; NOTE: Set this to the folder where you keep your Git repos! + (when (file-directory-p "~/Projects/Code") + (setq projectile-project-search-path '("~/Projects/Code"))) + (setq projectile-switch-project-action #'projectile-dired)) + +(use-package counsel-projectile + :after projectile + :config (counsel-projectile-mode)) + +(use-package magit + :commands magit-status + :custom + (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) + +;; NOTE: Make sure to configure a GitHub token before using this package! +;; - https://magit.vc/manual/forge/Token-Creation.html#Token-Creation +;; - https://magit.vc/manual/ghub/Getting-Started.html#Getting-Started +(use-package forge + :after magit) + +(use-package rainbow-delimiters + :hook (prog-mode . rainbow-delimiters-mode)) + +(defun efs/configure-eshell () + ;; Save command history when commands are entered + (add-hook 'eshell-pre-command-hook 'eshell-save-some-history) + + ;; Truncate buffer for performance + (add-to-list 'eshell-output-filter-functions 'eshell-truncate-buffer) + + ;; Bind some useful keys for evil-mode + (evil-define-key '(normal insert visual) eshell-mode-map (kbd "C-r") 'counsel-esh-history) + (evil-define-key '(normal insert visual) eshell-mode-map (kbd "") 'eshell-bol) + (evil-normalize-keymaps) + + (setq eshell-history-size 10000 + eshell-buffer-maximum-lines 10000 + eshell-hist-ignoredups t + eshell-scroll-to-bottom-on-input t)) + +(use-package dired + :ensure nil + :commands (dired dired-jump) + :config + (evil-collection-define-key 'normal 'dired-mode-map + "h" 'dired-single-up-directory + "l" 'dired-single-buffer)) + +(use-package dired-single + :commands (dired dired-jump)) + +(use-package all-the-icons-dired + :hook (dired-mode . all-the-icons-dired-mode)) + +(use-package dired-open + :commands (dired dired-jump) + :config + ;; Doesn't work as expected! + ;;(add-to-list 'dired-open-functions #'dired-open-xdg t) + (setq dired-open-extensions '(("png" . "feh") + ("mkv" . "mpv")))) + +;; Make gc pauses faster by decreasing the threshold. +(setq gc-cons-threshold (* 2 1000 1000)) + +(use-package prisma-mode) +(add-hook 'prisma-mode-hook 'lsp) +(use-package lsp-tailwindcss + :init + (setq lsp-tailwindcss-add-on-mode t)) + +(use-package typescript-ts-mode + :hook (typescript-ts-mode . lsp-mode)) +