;; NOTE: init.el is now generated from Emacs.org. Please edit that file ;; in Emacs and init.el will be generated automatically! (cond ((eq system-type 'darwin) ;; mac-specific code goes here. ;; You will most likely need to adjust this font size for your system! (defvar efs/default-font-size 220) (defvar efs/default-variable-font-size 220) ) ((eq system-type 'gnu/linux) ;; Linux-specific code goes here. ;; You will most likely need to adjust this font size for your system! (defvar efs/default-font-size 120) (defvar efs/default-variable-font-size 120) )) ;; Make frame transparency overridable (defvar efs/frame-transparency '(90 . 90)) ;; Electric pair mode (electric-pair-mode 1) ;; 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) ;; list the packages you want ;(setq package-list '(package use-package auto-package-update ; exec-path-from-shell org-auto-tangle ; rtags cmake-ide)) ;; Initialize package sources (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)) (package-install-selected-packages) ;; install the missing packages ;(dolist (package package-list) ;(unless (package-installed-p package) ; (package-install package))) (require 'use-package) ;; Initialize use-package on non-Linux platforms (unless (package-installed-p 'use-package) (package-install 'use-package)) (require 'exec-path-from-shell) ;; Initialize exec-path-from-shell on non-Linux platforms (unless (package-installed-p 'use-package) (package-install 'exec-path-from-shell)) ;; load Linux PATH (when (memq window-system '(mac ns x)) (exec-path-from-shell-initialize)) ;; if loaded as daemon (when (daemonp) (exec-path-from-shell-initialize)) (setq use-package-always-ensure t) (use-package auto-package-update :custom (auto-package-update-interval 30) (auto-package-update-prompt-before-update t) (auto-package-update-hide-results t) :config (auto-package-update-maybe) (auto-package-update-at-time "09:00")) ;; 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) ;; 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))) (cond ((eq system-type 'gnu/linux) (progn ( ;; credit: yorickvP on Github (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)) (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) )))) (setq inhibit-startup-message t) ;;(setq default-directory "~/.emacs.d") (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)))) (global-set-key (kbd "C-x l") 'load-file) (cond ((eq system-type 'darwin) ;; mac-specific code goes here. (set-face-attribute 'default nil :font "Comic Code" :height efs/default-font-size) ;; Set the fixed pitch face (set-face-attribute 'fixed-pitch nil :font "Comic Code" :height efs/default-font-size) ;; Set the variable pitch face (set-face-attribute 'variable-pitch nil :font "Comic Code" :height efs/default-variable-font-size :weight 'regular) ) ((eq system-type 'gnu/linux) ;; Linux-specific code goes here. (set-face-attribute 'default nil :font "Comic Code Regular" :height efs/default-font-size) ;; Set the fixed pitch face (set-face-attribute 'fixed-pitch nil :font "Comic Code Regular" :height efs/default-font-size) ;; Set the variable pitch face (set-face-attribute 'variable-pitch nil :font "Comic Code Regular" :height efs/default-variable-font-size :weight 'regular) )) ;(cond ;((eq system-type 'windows-nt) ;(progn ; (message "Microsoft Windows"))) ;((eq system-type 'darwin) ;(progn ;( ;(set-face-attribute 'default nil :font "BigBlueTermPlus Nerd Font" :height efs/default-font-size) ;; Set the fixed pitch face ;(set-face-attribute 'fixed-pitch nil :font "BigBlueTermPlus Nerd Font" :height efs/default-font-size) ;; Set the variable pitch face ;(set-face-attribute 'variable-pitch nil :font "BigBlueTermPlus Nerd Font" :height efs/default-variable-font-size :weight 'regular) ;) ;) ;) ;((eq system-type 'gnu/linux) ;(progn ;( ;) ;) ;)) ;; Make ESC quit prompts (global-set-key (kbd "") 'keyboard-escape-quit) (use-package general :after evil :config (general-create-definer efs/leader-keys :keymaps '(normal insert visual emacs) :prefix "SPC" :global-prefix "C-SPC") (efs/leader-keys "t" '(:ignore t :which-key "toggles") "tt" '(counsel-load-theme :which-key "choose theme") "fde" '(lambda () (interactive) (find-file (expand-file-name "~/.emacs.d/Emacs.org"))))) (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-palenight 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 auto-minor-mode) (use-package ivy :diminish :bind (("C-s" . swiper) :map ivy-minibuffer-map ("TAB" . ivy-alt-done) ("C-l" . ivy-alt-done) ("C-j" . ivy-next-line) ("C-k" . ivy-previous-line) :map ivy-switch-buffer-map ("C-k" . ivy-previous-line) ("C-l" . ivy-done) ("C-d" . ivy-switch-buffer-kill) :map ivy-reverse-i-search-map ("C-k" . ivy-previous-line) ("C-d" . ivy-reverse-i-search-kill)) :config (ivy-mode 1)) (use-package ivy-rich :after ivy :init (ivy-rich-mode 1)) (use-package counsel :bind (("C-M-j" . 'counsel-switch-buffer) :map minibuffer-local-map ("C-r" . 'counsel-minibuffer-history)) :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)) (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 :defer t) (defhydra hydra-text-scale (:timeout 4) "scale text" ("j" text-scale-increase "in") ("k" text-scale-decrease "out") ("f" nil "finished" :exit t)) (efs/leader-keys "ts" '(hydra-text-scale/body :which-key "scale text")) (defun flyspell-on-for-buffer-type () "Enable Flyspell appropriately for the major mode of the current buffer. Uses `flyspell-prog-mode' for modes derived from `prog-mode', so only strings and comments get checked. All other buffers get `flyspell-mode' to check all text. If flyspell is already enabled, does nothing." (interactive) (if (not (symbol-value flyspell-mode)) ; if not already on (progn (if (derived-mode-p 'prog-mode) (progn (message "Flyspell on (code)") (flyspell-prog-mode)) ;; else (progn (message "Flyspell on (text)") (flyspell-mode 1))) ;; I tried putting (flyspell-buffer) here but it didn't seem to work ))) (defun flyspell-toggle () "Turn Flyspell on if it is off, or off if it is on. When turning on, it uses `flyspell-on-for-buffer-type' so code-vs-text is handled appropriately." (interactive) (if (symbol-value flyspell-mode) (progn ; flyspell is on, turn it off (message "Flyspell off") (flyspell-mode -1)) ; else - flyspell is off, turn it on (flyspell-on-for-buffer-type))) (defun fd-switch-dictionary() (interactive) (let* ((dic ispell-current-dictionary) (change (if (string= dic "en_GB") "es_MX" "en_GB"))) (ispell-change-dictionary change) (message "Dictionary switched from %s to %s" dic change) )) (global-set-key (kbd "C-c f") 'flyspell-toggle) (add-hook 'find-file-hook 'flyspell-on-for-buffer-type) (global-set-key (kbd "C-c c") 'fd-switch-dictionary) ;; Automatically tangle our Emacs.org config file when we save it (defun efs/org-babel-tangle-config () (when (string-equal (file-name-directory (buffer-file-name)) (expand-file-name user-emacs-directory)) ;; Dynamic scoping to the rescue (let ((org-confirm-babel-evaluate nil)) (org-babel-tangle)))) (add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'efs/org-babel-tangle-config))) (defun efs/org-font-setup () ;; Replace list hyphen with dot (font-lock-add-keywords 'org-mode '(("^ *\\([-]\\) " (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))) ;; Set faces for heading levels (dolist (face '((org-level-1 . 1.2) (org-level-2 . 1.1) (org-level-3 . 1.05) (org-level-4 . 1.0) (org-level-5 . 1.1) (org-level-6 . 1.1) (org-level-7 . 1.1) (org-level-8 . 1.1))) (cond ((eq system-type 'darwin) ;; Mac-specific code goes here. (set-face-attribute (car face) nil :font "Comic Code" :weight 'regular :height (cdr face)) ) ((eq system-type 'gnu/linux) ;; Linux-specific code goes here. (set-face-attribute (car face) nil :font "Comic Code Regular" :weight 'regular :height (cdr face)) )) ) ;; Ensure that anything that should be fixed-pitch in Org files appears that way (set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch) (set-face-attribute 'org-table nil :inherit 'fixed-pitch) (set-face-attribute 'org-formula nil :inherit 'fixed-pitch) (set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch)) (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch)) (set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch) (set-face-attribute 'line-number nil :inherit 'fixed-pitch) (set-face-attribute 'line-number-current-line nil :inherit 'fixed-pitch)) (defun efs/org-mode-setup () (org-indent-mode) (variable-pitch-mode 1) (visual-line-mode 1)) (use-package org :pin org :commands (org-capture org-agenda) :hook (org-mode . efs/org-mode-setup) :config (setq org-ellipsis " ▾") (setq org-agenda-start-with-log-mode t) (setq org-log-done 'time) (setq org-log-into-drawer t) (setq org-agenda-files '("~/.emacs.d/OrgFiles/Tasks.org" "~/.emacs.d/OrgFiles/Habits.org" "~/.emacs.d/OrgFiles/Birthdays.org")) (require 'org-habit) (add-to-list 'org-modules 'org-habit) (setq org-habit-graph-column 60) (setq org-todo-keywords '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!)") (sequence "BACKLOG(b)" "PLAN(p)" "READY(r)" "ACTIVE(a)" "REVIEW(v)" "WAIT(w@/!)" "HOLD(h)" "|" "COMPLETED(c)" "CANC(k@)"))) (setq org-refile-targets '(("Archive.org" :maxlevel . 1) ("Tasks.org" :maxlevel . 1))) ;; Save Org buffers after refiling! (advice-add 'org-refile :after 'org-save-all-org-buffers) (setq org-tag-alist '((:startgroup) ; Put mutually exclusive tags here (:endgroup) ("@errand" . ?E) ("@home" . ?H) ("@work" . ?W) ("agenda" . ?a) ("planning" . ?p) ("publish" . ?P) ("batch" . ?b) ("note" . ?n) ("idea" . ?i))) ;; Configure custom agenda views (setq org-agenda-custom-commands '(("d" "Dashboard" ((agenda "" ((org-deadline-warning-days 7))) (todo "NEXT" ((org-agenda-overriding-header "Next Tasks"))) (tags-todo "agenda/ACTIVE" ((org-agenda-overriding-header "Active Projects"))))) ("n" "Next Tasks" ((todo "NEXT" ((org-agenda-overriding-header "Next Tasks"))))) ("W" "Work Tasks" tags-todo "+work-email") ;; Low-effort next actions ("e" tags-todo "+TODO=\"NEXT\"+Effort<15&+Effort>0" ((org-agenda-overriding-header "Low Effort Tasks") (org-agenda-max-todos 20) (org-agenda-files org-agenda-files))) ("w" "Workflow Status" ((todo "WAIT" ((org-agenda-overriding-header "Waiting on External") (org-agenda-files org-agenda-files))) (todo "REVIEW" ((org-agenda-overriding-header "In Review") (org-agenda-files org-agenda-files))) (todo "PLAN" ((org-agenda-overriding-header "In Planning") (org-agenda-todo-list-sublevels nil) (org-agenda-files org-agenda-files))) (todo "BACKLOG" ((org-agenda-overriding-header "Project Backlog") (org-agenda-todo-list-sublevels nil) (org-agenda-files org-agenda-files))) (todo "READY" ((org-agenda-overriding-header "Ready for Work") (org-agenda-files org-agenda-files))) (todo "ACTIVE" ((org-agenda-overriding-header "Active Projects") (org-agenda-files org-agenda-files))) (todo "COMPLETED" ((org-agenda-overriding-header "Completed Projects") (org-agenda-files org-agenda-files))) (todo "CANC" ((org-agenda-overriding-header "Cancelled Projects") (org-agenda-files org-agenda-files))))))) (setq org-capture-templates `(("t" "Tasks / Projects") ("tt" "Task" entry (file+olp "~/.emacs.d/OrgFiles/Tasks.org" "Inbox") "* TODO %?\n %U\n %a\n %i" :empty-lines 1) ("j" "Journal Entries") ("jj" "Journal" entry (file+olp+datetree "~/.emacs.d/OrgFiles/Journal.org") "\n* %<%I:%M %p> - Journal :journal:\n\n%?\n\n" ;; ,(dw/read-file-as-string "~/Notes/Templates/Daily.org") :clock-in :clock-resume :empty-lines 1) ("jm" "Meeting" entry (file+olp+datetree "~/.emacs.d/OrgFiles/Journal.org") "* %<%I:%M %p> - %a :meetings:\n\n%?\n\n" :clock-in :clock-resume :empty-lines 1) ("w" "Workflows") ("we" "Checking Email" entry (file+olp+datetree "~/.emacs.d/OrgFiles/Journal.org") "* Checking Email :email:\n\n%?" :clock-in :clock-resume :empty-lines 1) ("m" "Metrics Capture") ("mw" "Weight" table-line (file+headline "~/.emacs.d/OrgFiles/Metrics.org" "Weight") "| %U | %^{Weight} | %^{Notes} |" :kill-buffer t))) (define-key global-map (kbd "C-c j") (lambda () (interactive) (org-capture nil "jj"))) (efs/org-font-setup)) (use-package org-bullets :hook (org-mode . org-bullets-mode) :custom (org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●"))) (defun efs/org-mode-visual-fill () (setq visual-fill-column-width 100 visual-fill-column-center-text t) (visual-fill-column-mode 1)) (use-package visual-fill-column :hook (org-mode . efs/org-mode-visual-fill)) (with-eval-after-load 'org (org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (python . t))) (push '("conf-unix" . conf-unix) org-src-lang-modes)) (with-eval-after-load 'org ;; This is needed as of Org 9.2 (require 'org-tempo) (add-to-list 'org-structure-template-alist '("sh" . "src shell")) (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) (add-to-list 'org-structure-template-alist '("py" . "src python"))) (defun efs/lsp-mode-setup () (setq lsp-headerline-breadcrumb-segments '(path-up-to-project file symbols)) (lsp-headerline-breadcrumb-mode)) (use-package lsp-mode :commands (lsp lsp-deferred) :hook (lsp-mode . efs/lsp-mode-setup) :init (setq lsp-keymap-prefix "C-c l") ;; Or 'C-l', 's-l' :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 dap-mode ;; Uncomment the config below if you want all UI panes to be hidden by default! ;; :custom ;; (lsp-enable-dap-auto-configure nil) ;; :config ;; (dap-ui-mode 1) :commands dap-debug :config ;; Set up Node debugging (require 'dap-node) (dap-node-setup) ;; Automatically installs Node debug adapter if needed ;; Bind `C-c l d` to `dap-hydra` for easy access (general-define-key :keymaps 'lsp-mode-map :prefix lsp-keymap-prefix "d" '(dap-hydra t :wk "debugger"))) (use-package typescript-mode :mode "\\.ts\\'" :hook (typescript-mode . lsp-deferred) :config (setq typescript-indent-level 2)) (setq inferior-lisp-program "/usr/bin/sbcl") ;; cmake-ide (require 'rtags) ;; optional, must have rtags installed (require 'cmake-ide) (cmake-ide-setup) ;; Irony mode (add-hook 'c++-mode-hook 'irony-mode) (add-hook 'c-mode-hook 'irony-mode) (add-hook 'objc-mode-hook 'irony-mode) (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options) ;; cpputils-cmake ;;(add-hook 'c-mode-common-hook ;; (lambda () ;; (if (derived-mode-p 'c-mode 'c++-mode) ;; (cppcm-reload-all) ;; ))) ;; OPTIONAL, somebody reported that they can use this package with Fortran ;;(add-hook 'c90-mode-hook (lambda () (cppcm-reload-all))) ;; OPTIONAL, avoid typing full path when starting gdb ;;(global-set-key (kbd "C-c C-g") ;;'(lambda ()(interactive) (gud-gdb (concat "gdb --fullname " (cppcm-get-exe-path-current-buffer))))) ;; OPTIONAL, some users need specify extra flags forwarded to compiler ;;(setq cppcm-extra-preprocss-flags-from-user '("-I/usr/src/linux/include" "-DNDEBUG")) (use-package vterm :ensure t) ;; Now run `M-x vterm` and make sure it works! (use-package julia-snail :ensure t :hook (julia-mode . julia-snail-mode)) ;; Better configuration but rquires pdf-tools (use-package pdf-tools :ensure t :config (pdf-tools-install) (setq-default pdf-view-display-size 'fit-page) (setq pdf-annot-activate-created-annotations t) (define-key pdf-view-mode-map (kbd "C-s") 'isearch-forward) (define-key pdf-view-mode-map (kbd "C-r") 'isearch-backward) ;(add-hook 'pdf-view-mode-hook (lambda () ; (bms/pdf-midnite-amber))) ; automatically turns on midnight-mode for pdfs (add-hook 'pdf-view-mode-hook 'pdf-tools-enable-minor-modes) ) (use-package auctex-latexmk :ensure t :config (auctex-latexmk-setup) (setq auctex-latexmk-inherit-TeX-PDF-mode t)) (use-package reftex :ensure t :defer t :config (setq reftex-cite-prompt-optional-args t)) ;; Prompt for empty optional arguments in cite ;(use-package auto-dictionary ; :ensure t ; :init(add-hook 'flyspell-mode-hook (lambda () (auto-dictionary-mode 1)))) (use-package company-auctex :ensure t :init (company-auctex-init)) (use-package tex :ensure auctex :mode ("\\.tex\\'" . latex-mode) :config (progn (setq TeX-source-correlate-mode t) (setq TeX-source-correlate-method 'synctex) (setq TeX-auto-save t) (setq TeX-parse-self t) (setq-default TeX-master "0_front_matter.tex") (setq reftex-plug-into-AUCTeX t) (pdf-tools-install) (setq TeX-view-program-selection '((output-pdf "PDF Tools")) TeX-source-correlate-start-server t) ;; Update PDF buffers after successful LaTeX runs (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer) (add-hook 'LaTeX-mode-hook (lambda () (reftex-mode t) ;;(flyspell-mode t) )) )) (use-package rustic :ensure t :bind (("" . rustic-format-buffer)) :config (require 'lsp-rust) (setq lsp-rust-analyzer-completion-add-call-parenthesis nil) (setq rustic-analyzer-command '("/usr/local/bin/rust-analyzer")) (setq rustic-cargo-bin "/usr/share/cargo/bin/cargo")) (add-hook 'rust-mode-hook (lambda () (setq indent-tabs-mode nil))) (setq rust-format-on-save t) (add-hook 'rust-mode-hook (lambda () (prettify-symbols-mode))) (use-package python-mode :ensure t :hook (python-mode . lsp-deferred) :custom ;; NOTE: Set these if Python 3 is called "python3" on your system! ;; (python-shell-interpreter "python3") ;; (dap-python-executable "python3") (dap-python-debugger 'debugpy) :config (require 'dap-python)) (use-package pyvenv :after python-mode :config (pyvenv-mode 1)) (use-package zig-mode :ensure t :config (require 'lsp-mode) (setq lsp-zig-zls-executable "/usr/local/bin/zls") (add-hook 'zig-mode-hook #'lsp-deferred)) (add-hook 'after-init-hook 'global-company-mode) (use-package company :after lsp-mode :hook (lsp-mode . company-mode) :bind (:map company-active-map ("" . company-complete-selection)) (:map lsp-mode-map ("" . company-indent-or-complete-common)) :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)) :bind-keymap ("C-c p" . projectile-command-map) :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 evil-nerd-commenter :bind ("M-/" . evilnc-comment-or-uncomment-lines)) (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) (use-package term :commands term :config (setq explicit-shell-file-name "fish") ;; Change this to zsh, etc ;;(setq explicit-zsh-args '()) ;; Use 'explicit--args for shell-specific args ;; Match the default Bash shell prompt. Update this if you have a custom prompt (setq term-prompt-regexp "^[^#$%>\n]*[#$%>] *")) (use-package eterm-256color :hook (term-mode . eterm-256color-mode)) (use-package vterm :commands vterm :config (setq term-prompt-regexp "^[^#$%>\n]*[#$%>] *") ;; Set this to match your custom shell prompt ;;(setq vterm-shell "zsh") ;; Set this to customize the shell to launch (setq vterm-max-scrollback 10000)) (when (eq system-type 'windows-nt) (setq explicit-shell-file-name "powershell.exe") (setq explicit-powershell.exe-args '())) (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 eshell-git-prompt :after eshell) (use-package eshell :hook (eshell-first-time-mode . efs/configure-eshell) :config (with-eval-after-load 'esh-opt (setq eshell-destroy-buffer-when-process-dies t) (setq eshell-visual-commands '("htop" "zsh" "vim"))) (eshell-git-prompt-use-theme 'powerline)) (setq insert-directory-program "gls" dired-use-ls-dired t) (use-package dired :ensure nil :commands (dired dired-jump) :bind (("C-x C-j" . dired-jump)) :custom ((dired-listing-switches "-agho --group-directories-first")) ;:custom ((dired-listing-switches "-agho")) :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")))) (use-package dired-hide-dotfiles :hook (dired-mode . dired-hide-dotfiles-mode) :config (evil-collection-define-key 'normal 'dired-mode-map "H" 'dired-hide-dotfiles-mode)) (use-package mu4e :ensure nil :if (eq system-type 'darwin) :load-path "/opt/homebrew/share/emacs/site-lisp/mu4e" ;:defer 20 ; Wait until 20 seconds after startup ;:defer t :config ;; Make sure that moving a message (like to Trash) causes the ;; message to get a new file name. This helps to avoid the ;; dreaded "UID is N beyond highest assigned" error. ;; See this link for more info: https://stackoverflow.com/a/43461973 (setq mu4e-change-filenames-when-moving t) ;; Load org-mode integration ;(require 'org-mu4e) ;; Refresh mail using isync every 10 minutes (setq mu4e-update-interval (* 10 60)) (setq mu4e-get-mail-command "mbsync -a") (setq mu4e-maildir "~/Mail") (setq mu4e-drafts-folder "/Drafts") (setq mu4e-sent-folder "/Sent") (setq mu4e-refile-folder "/Archive") (setq mu4e-trash-folder "/Trash") (setq mu4e-maildir-shortcuts '(("/Inbox" . ?i) ("/Sent" . ?s) ("/Trash" . ?t) ("/Drafts" . ?d) ("/Spam" . ?z) ("/Archive" . ?a) )) ;(dw/leader-key-def ; "m" '(:ignore t :which-key "mail") ; "mm" 'mu4e ; "mc" 'mu4e-compose-new ; "mi" 'dw/go-to-inbox ; "ms" 'mu4e-update-mail-and-index) ;; Start mu4e in the background so that it syncs mail periodically (mu4e t) ) (setq smtpmail-default-smtp-server "mail.unix-talk.com") ; needs to be specified before the (require) (require 'smtpmail) (setq send-mail-function 'smtpmail-send-it) (setq message-send-mail-function 'smtpmail-send-it) (setq user-full-name "Administrator") (setq smtpmail-local-domain "unix-talk.com") (setq user-mail-address (concat "admin@" smtpmail-local-domain)) (setq smtpmail-smtp-server "mail.unix-talk.com" smtpmail-smtp-service 465 smtpmail-stream-type 'ssl smtpmail-auth-credentials "~/.authinfo.pgp") (setq message-send-mail-function 'smtpmail-send-it) (auth-source-pass-enable) ;; Make gc pauses faster by decreasing the threshold. (setq gc-cons-threshold (* 2 1000 1000))