diff options
Diffstat (limited to 'emacs/init.el')
| -rw-r--r-- | emacs/init.el | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/emacs/init.el b/emacs/init.el new file mode 100644 index 0000000..9e26acd --- /dev/null +++ b/emacs/init.el @@ -0,0 +1,317 @@ +;; -*- lexical-binding: t; -*- + +(require 'package) +(setq package-check-signature nil + package-archives '(("gnu" . "https://elpa.gnu.org/packages/") + ("nongnu" . "https://elpa.nongnu.org/packages/") + ("melpa" . "https://melpa.org/packages/"))) +(package-initialize) +(unless package-archive-contents + (package-refresh-contents)) + +(require 'use-package) +(require 'seq) +(require 'treesit) + +(setq use-package-always-ensure t + inhibit-startup-screen t + initial-scratch-message nil + initial-buffer-choice nil + ring-bell-function #'ignore + use-short-answers t + create-lockfiles nil + make-backup-files nil + auto-save-default nil + select-enable-clipboard t + select-enable-primary nil + save-interprogram-paste-before-kill nil + confirm-nonexistent-file-or-buffer nil + switch-to-buffer-obey-display-actions t + custom-file (expand-file-name "custom.el" user-emacs-directory) + display-line-numbers-type 'relative + mouse-wheel-scroll-amount '(3 ((shift) . 1)) + mouse-wheel-progressive-speed nil + mouse-wheel-scroll-amount-horizontal '(3 . 1) + pixel-scroll-precision-mode nil + split-height-threshold nil + split-width-threshold nil) + +(setq initial-major-mode 'text-mode) +(setq initial-buffer-choice t) + +(setq-default indent-tabs-mode nil + tab-width 4) + +(menu-bar-mode -1) + +(when (file-exists-p custom-file) + (load custom-file)) + +(global-display-line-numbers-mode 1) +(column-number-mode 1) +(electric-pair-mode 1) +(show-paren-mode 1) +(save-place-mode 1) +(recentf-mode 1) +(savehist-mode 1) +(xterm-mouse-mode 1) + +(use-package vertico + :init + (vertico-mode 1)) + +(use-package marginalia + :init + (marginalia-mode 1)) + +(use-package which-key + :init + (which-key-mode 1)) + +(use-package orderless + :custom + (completion-styles '(orderless basic))) + +(use-package consult + :bind (("C-x b" . consult-buffer) + ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line))) + +(use-package corfu + :custom + (corfu-auto t) + (corfu-auto-prefix 2) + :init + (global-corfu-mode 1)) + +(use-package evil + :init + (setq evil-want-keybinding nil + evil-want-C-u-scroll t + evil-want-Y-yank-to-eol t + evil-undo-system 'undo-redo + evil-shift-width 4 + evil-visual-x-select-clipboard nil) + :config + (evil-mode 1) + (setq evil-echo-state nil)) + +(use-package evil-collection + :after evil + :config + (evil-collection-init)) + +(use-package evil-surround + :after evil + :config + (global-evil-surround-mode 1)) + +(use-package evil-commentary + :after evil + :config + (evil-commentary-mode 1)) + +(make-directory "~/notes/" t) + +(use-package vterm) + +(use-package elcord + :config + (elcord-mode 1)) + +(use-package org + :ensure nil + :custom + (org-directory "~/notes/") + (org-agenda-files '("~/notes/")) + (org-default-notes-file "~/notes/inbox.org") + (org-startup-indented t) + (org-log-done 'time) + (org-todo-keywords + '((sequence "TODO(t)" "NEXT(n)" "WAIT(w)" "|" "DONE(d)" "CANC(c)"))) + (org-capture-templates + '(("t" "Todo" entry + (file+headline "~/notes/inbox.org" "Tasks") + "* TODO %?\n %U\n") + ("i" "Idea" entry + (file+headline "~/notes/inbox.org" "Ideas") + "* %?\n %U\n"))) + :config + (require 'org-tempo) + (add-hook 'org-mode-hook #'visual-line-mode)) + +(use-package evil-org + :after (evil org) + :hook (org-mode . evil-org-mode) + :config + (require 'evil-org-agenda) + (evil-org-agenda-set-keys)) + +(use-package denote + :custom + (denote-directory "~/notes/") + (denote-file-type 'org)) + +(use-package consult-denote + :after (consult denote) + :config + (consult-denote-mode 1)) + +(use-package eglot + :ensure nil + :hook ((c-mode . eglot-ensure) + (c++-mode . eglot-ensure) + (rust-mode . eglot-ensure) + (go-mode . eglot-ensure) + (zig-mode . eglot-ensure)) + :config + (add-to-list + 'eglot-server-programs + '((c-mode c++-mode) . ("clangd" "--background-index" "--header-insertion=never"))) + (add-to-list 'eglot-server-programs '(zig-mode . ("zls")))) + +(use-package flymake + :ensure nil + :hook (prog-mode . flymake-mode)) + +(use-package rust-mode + :mode "\\.rs\\'") + +(use-package go-mode + :mode "\\.go\\'") + +(use-package zig-mode + :mode "\\.zig\\'") + +(require 'warnings) +(add-to-list 'warning-suppress-types '(bytecomp)) + +(defvar coast-treesit-language-sources + '((bash . ("https://github.com/tree-sitter/tree-sitter-bash" "src")) + (c . ("https://github.com/tree-sitter/tree-sitter-c" "src")) + (cpp . ("https://github.com/tree-sitter/tree-sitter-cpp" "src")) + (css . ("https://github.com/tree-sitter/tree-sitter-css" "src")) + (go . ("https://github.com/tree-sitter/tree-sitter-go" "src")) + (haskell . ("https://github.com/tree-sitter/tree-sitter-haskell" "src")) + (html . ("https://github.com/tree-sitter/tree-sitter-html" "src")) + (javascript . ("https://github.com/tree-sitter/tree-sitter-javascript" "src")) + (json . ("https://github.com/tree-sitter/tree-sitter-json" "src")) + (lua . ("https://github.com/tree-sitter-grammars/tree-sitter-lua" "src")) + (make . ("https://github.com/tree-sitter-grammars/tree-sitter-make" "src")) + (markdown . ("https://github.com/tree-sitter/tree-sitter-markdown" "src")) + (python . ("https://github.com/tree-sitter/tree-sitter-python" "src")) + (rust . ("https://github.com/tree-sitter/tree-sitter-rust" "src")) + (toml . ("https://github.com/tree-sitter/tree-sitter-toml" "src")) + (tsx . ("https://github.com/tree-sitter/tree-sitter-typescript" "tsx/src")) + (typescript . ("https://github.com/tree-sitter/tree-sitter-typescript" "typescript/src")) + (yaml . ("https://github.com/tree-sitter-grammars/tree-sitter-yaml" "src")))) + +(defun coast-treesit-install (language) + (let* ((source (alist-get language coast-treesit-language-sources)) + (url (car source)) + (subdir (cadr source))) + (when source + (add-to-list + 'treesit-language-source-alist + (if subdir + (list language url nil subdir) + (list language url))) + (treesit-install-language-grammar language)))) + +(defun my/make-terminal-transparent (&optional frame) + (unless (display-graphic-p frame) + (let ((target-frame (or frame (selected-frame))) + (faces '(default line-number line-number-current-line fringe + window-divider vertical-border hl-line))) + (dolist (face faces) + (when (facep face) + (set-face-background face "unspecified-bg" target-frame))) + (set-terminal-parameter (frame-terminal target-frame) + 'background-mode 'dark)))) + +(add-hook 'window-setup-hook #'my/make-terminal-transparent) +(add-hook 'after-make-frame-functions #'my/make-terminal-transparent) +(advice-add 'load-theme :after + (lambda (&rest _) (my/make-terminal-transparent))) + +(use-package doom-themes) + +(defun coast/remove-scratch-buffer () + (let ((buffer (get-buffer "*scratch*"))) + (when (and buffer + (not (buffer-modified-p buffer)) + (not (get-buffer-window buffer t))) + (kill-buffer buffer)))) + +(add-hook 'after-init-hook #'coast/remove-scratch-buffer) + +(defun coast-treesit-install-missing () + (dolist (language (mapcar #'car coast-treesit-language-sources)) + (unless (treesit-language-available-p language) + (condition-case nil + (coast-treesit-install language) + (error nil))))) + +(add-hook 'after-init-hook #'coast-treesit-install-missing) + +(add-hook 'emacs-startup-hook + (lambda () + (delete-other-windows))) + +(add-to-list 'load-path "/home/coast/.emacs.d/user-lisp") +(require 'modeline) + +(use-package treemacs + :ensure t + :defer t + :config + (setq treemacs-collapse-dirs (if treemacs-python-executable 3 0) + treemacs-deferred-git-apply-delay 0.5 + treemacs-directory-name-transformer #'identity + treemacs-display-in-side-window t + treemacs-eldoc-display 'simple + treemacs-file-event-delay 5000 + treemacs-file-follow-delay 0.2 + treemacs-follow-after-init t + treemacs-expand-after-init t + treemacs-indentation 2 + treemacs-indentation-string " " + treemacs-is-other-window nil + treemacs-max-git-entries 5000 + treemacs-no-png-images nil + treemacs-persist-file (expand-file-name ".cache/treemacs-persist" user-emacs-directory) + treemacs-recenter-distance 0.1 + treemacs-file-watch-mode t + treemacs-fringe-indicator-mode 'always + treemacs-hide-gitignored-files-mode nil + treemacs-width 30) + + (treemacs-resize-icons 11) + (treemacs-follow-mode t) + (treemacs-project-follow-mode t) + (treemacs-filewatch-mode t) + (treemacs-hide-gitignored-files-mode -1)) + +(use-package treemacs-evil + :after (treemacs evil) + :ensure t) + +(use-package treemacs-icons-dired + :hook (dired-mode . treemacs-icons-dired-mode) + :ensure t) + +(use-package treemacs-magit + :after (treemacs magit) + :ensure t) + +(defun my/treemacs-open-current-dir () + "Toggle Treemacs open to current directory/project." + (interactive) + (require 'treemacs) + (let ((state (treemacs-current-visibility))) + (if (eq state 'visible) + (treemacs) + (treemacs-add-and-display-current-project-exclusively)))) + +(with-eval-after-load 'evil + (evil-define-key 'normal 'global (kbd "SPC e") #'my/treemacs-open-current-dir)) |
