;; General Settings (setq inhibit-startup-screen t) (setq vc-follow-symlinks t) (setq backup-directory-alist `((".*" . "~/.emacs.d/saves")) delete-old-versions t) (setq auto-save-file-name-transforms `((".*" ,temporary-file-directory t))) (setq gc-cons-threshold 50000000) (setq large-file-warning-threshold 100000000) (global-auto-revert-mode t) (fset 'yes-or-no-p 'y-or-n-p) (prefer-coding-system 'utf-8) (set-default-coding-systems 'utf-8) (set-terminal-coding-system 'utf-8) (set-keyboard-coding-system 'utf-8) ;; (define-key key-translation-map (kbd "ESC") (kbd "C-g")) (add-hook 'text-mode-hook (lambda () (setq fill-column 100) (turn-on-auto-fill))) (put 'narrow-to-region 'disabled nil) ;; (require 'server) ;; (if (not (server-running-p)) (server-start)) (add-hook 'prog-mode (lambda () (modify-syntax-entry ?_ "w"))) (setq default-directory "/home/joe") (setq-default display-line-numbers 'relative) (make-variable-buffer-local 'global-hl-line-mode) (set-window-margins nil 0) (setq-default right-fringe-width 10) (setq scroll-margin 0 scroll-conservatively 100000 scroll-preserve-screen-position 1) (global-hl-line-mode +1) (column-number-mode +1) (dolist (mode '(dashboard-mode-hook org-mode-hook term-mode-hook eww-mode-hook vterm-mode-hook eshell-mode-hook dired-mode-hook shell-mode-hook magit-mode-hook)) (add-hook mode (lambda () (display-line-numbers-mode 0)))) (set-face-attribute 'default nil :font "Fira Code Nerd Font" :height 105) ;; Visuals (scroll-bar-mode -1) (tool-bar-mode -1) (menu-bar-mode -1) (tooltip-mode -1) ;; Text Settings (setq-default c-basic-offset 4) ;; This is annoying (setq-default indent-tabs-mode nil) (setq-default tab-width 4) (setq indent-line-function 'insert-tab) (set-default 'truncate-lines t) (set-default 'truncate-partial-width-windows nil) (setq-default line-spacing 5) (add-hook 'dashboard-mode-hook (lambda () (setq-local line-spacing 12))) (add-hook 'before-save-hook 'whitespace-cleanup) ;; (setq visible-bell nil ring-bell-function 'joe/flash-mode-line) ;; (defun joe/flash-mode-line () ;; (invert-face 'mode-line) ;; (run-with-timer 0.1 nil #'invert-face 'mode-line)) ;; (set-face-foreground 'minibuffer-prompt nil) (defadvice text-scale-increase (around all-buffers (arg) activate) (dolist (buffer (buffer-list)) (with-current-buffer buffer ad-do-it))) (defun joe/edit-init() "Edit 'init.el' quickly" (interactive) (find-file user-init-file)) (defun joe/show-full-path () "Show the full path file name in the minibuffer." (interactive) (message (buffer-file-name))) (defun joe/toggle-buffer-mode () "Toggles the current major mode between actual and fundamental mode. This will act as a way to easily get all of the evil keybindings in buffers like magit, without compromises." (interactive) (let ((previous-mode major-mode)) (unless (boundp 'joe/buffer-previous-mode) (setq-local joe/buffer-previous-mode major-mode)) (if (equal major-mode 'fundamental-mode) (funcall joe/buffer-previous-mode) (progn (fundamental-mode) (setq-local joe/buffer-previous-mode previous-mode))))) (defun joe/revert-buffer-no-confirm () "Revert buffer without confirmation." (interactive) (revert-buffer :ignore-auto :noconfirm)) ;; Packages (require 'package) (setq package-archives '(("org" . "http://orgmode.org/elpa/") ("gnu" . "http://elpa.gnu.org/packages/") ("melpa" . "https://melpa.org/packages/"))) ;; ("marmalade" . "http://marmalade-repo.org/packages/"))) (package-initialize) ;; Why we use this line ;; https://www.reddit.com/r/emacs/comments/1rdstn/set_packageenableatstartup_to_nil_for_slightly/ (setq package-enable-at-startup nil) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(ansi-color-faces-vector [default default default italic underline success warning error]) '(custom-safe-themes '("aaa4c36ce00e572784d424554dcc9641c82d1155370770e231e10c649b59a074" default)) '(flycheck-color-mode-line-face-to-color 'mode-line-buffer-id) '(frame-background-mode 'dark) '(ignored-local-variable-values '((eval add-hook 'after-save-hook '(lambda nil (org-babel-tangle)) nil t))) '(org-agenda-files '("~/todo.org")) '(package-selected-packages '(org-kanban embark-consult embark olivetti vertico-posframe orderless vertico eglot-fsharp consult-eglot eglot nano-modeline mini-modeline pdf-tools consult all-the-icons-completion kind-icon mini-modeline shelldon pcomplete-extension corfu-doc esh-autosuggest fish-completion cape corfu highlight-quoted dirvish ranger magit multi-vterm evil-collection smartparens vterm all-the-icons org-bullets fsharp-mode fish-mode find-file-in-project helpful ahk-mode rainbow-delimiters doom-themes marginalia avy evil-commentary evil-surround undo-tree which-key dashboard)) '(safe-local-variable-values '((eval add-hook 'after-save-hook '(lambda nil (org-babel-tangle)) nil t))) '(window-divider-mode nil)) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(magit-diff-hunk-heading-highlight ((t (:extend t :background "cornflower blue" :foreground "#212337" :weight bold))))) (dolist (p package-selected-packages) (when (not (package-installed-p p)) (package-install p))) (setq custom-safe-themes t) (load-theme 'doom-vibrant t) ;; (load-theme 'doom-flatwhite t) (setq evil-want-keybinding nil) (setq evil-undo-system 'undo-tree) (setq evil-want-C-u-scroll t) (setq evil-want-Y-yank-to-eol t) (require 'highlight-quoted) (add-hook 'emacs-lisp-mode-hook 'highlight-quoted-mode) (global-undo-tree-mode) (setq undo-tree-visualizer-diff t) (setq undo-tree-history-directory-alist '(("." . "~/.emacs.vanilla/undo"))) (require 'evil) (evil-mode) (require 'evil-collection) (evil-collection-init) (save-place-mode t) (setq save-place-file "~/.emacs.vanilla/places") (setq org-edit-src-content-indentation 0) (require 'dired) (require 'dirvish) (setq delete-by-moving-to-trash t) (setq dired-dwim-target t) (setq dirvish-preview-dispatchers (cl-substitute 'pdf-preface 'pdf dirvish-preview-dispatchers)) (dirvish-define-preview exa (file) "Use `exa' to generate directory preview." :require ("exa") ; tell Dirvish to check if we have the executable (when (file-directory-p file) ; we only interest in directories here `(shell . ("exa" "--color=always" "-al" ,file)))) ; use the command output as preview (setq dired-listing-switches "-l --almost-all --human-readable --time-style=long-iso --group-directories-first --no-group") (add-to-list 'dirvish-preview-dispatchers 'exa) (evil-define-key 'normal dirvish-mode-map (kbd "q") 'dirvish-quit) (defun joe/dired-open-file () "In dired, open the file named on this line." (interactive) (let* ((file (dired-get-filename nil t))) (call-process "xdg-open" nil 0 nil file))) (defun joe/bookmark-set-and-save () "In dired, open the file named on this line." (interactive) (bookmark-set) (bookmark-save)) (defun lsp-related-stuff () (evil-define-key 'normal 'global (kbd "M-s") 'consult-imenu) (evil-define-key 'normal 'global (kbd "M-i") 'eldoc) (evil-define-key 'normal 'global (kbd "M-e") 'flymake-goto-next-error) (evil-define-key 'normal 'global (kbd "M-E") 'flymake-goto-prev-error)) (add-hook 'prog-mode-hook 'lsp-related-stuff) (require 'dashboard) (dashboard-setup-startup-hook) (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*"))) (setq dashboard-startup-banner 'logo) (setq dashboard-center-content t) (setq dashboard-set-file-icons t) (setq dashboard-set-heading-icons t) (require 'which-key) (setq which-key-idle-delay 0.3) (which-key-mode) (which-key-add-keymap-based-replacements evil-normal-state-map "f" '("Files") "b" '("Buffers") "d" '("Dired") "g" '("Git") "t" '("Tabs") "p" '("Packages") "s" '("Shell (vterm)") "h" '("Help")) (evil-set-leader 'normal (kbd "SPC")) ;; TODO: We need 3 bindings; 1.) close buffer 2.) close window 3.) close buffer and window ;; To disable a keybinding just bind it to nil (evil-define-key 'normal 'global (kbd "w") 'save-buffer) (evil-define-key 'normal 'global (kbd "q") 'kill-buffer-and-window) (evil-define-key 'normal 'global (kbd "h") 'help-command) (evil-define-key 'normal 'global (kbd "k") 'kill-this-buffer) (evil-define-key 'normal 'global (kbd "hf") 'helpful-callable) (evil-define-key 'normal 'global (kbd "hv") 'helpful-variable) (evil-define-key 'normal 'global (kbd "hk") 'helpful-key) (evil-define-key 'normal 'global (kbd "ho") 'helpful-symbol) (evil-define-key 'normal 'global (kbd "hg") 'helpful-at-point) (evil-define-key 'normal 'global (kbd "fb") 'bookmark-jump) (evil-define-key 'normal 'global (kbd "fr") 'consult-recent-file) (evil-define-key 'normal 'global (kbd "ff") 'ffip) (evil-define-key 'normal 'global (kbd "fi") 'joe/edit-init) (evil-define-key 'normal 'global (kbd "bl") 'mode-line-other-buffer) (evil-define-key 'normal 'global (kbd "bb") 'switch-to-buffer) (evil-define-key 'normal 'global (kbd "bi") 'ibuffer) (evil-define-key 'normal 'global (kbd "bm") 'joe/toggle-buffer-mode) (evil-define-key 'normal 'global (kbd "br") 'joe/revert-buffer-no-confirm) (evil-define-key 'normal 'global (kbd "bk") 'kill-this-buffer) (evil-define-key 'normal 'global (kbd "gg") 'magit-status) (evil-define-key 'normal 'global (kbd "gc") 'magit-clone) (evil-define-key 'normal 'global (kbd "pi") 'package-install) (evil-define-key 'normal 'global (kbd "pd") 'package-delete) (evil-define-key 'normal 'global (kbd "pf") 'package-refresh-contents) (evil-define-key 'normal 'global (kbd "pl") 'package-list-packages) (evil-define-key 'normal 'global (kbd "pr") 'package-reinstall) (evil-define-key 'normal 'global (kbd "tt") 'multi-vterm) (evil-define-key 'normal 'global (kbd "tn") 'multi-vterm-next) (evil-define-key 'normal 'global (kbd "tv") 'vterm-other-window) (evil-define-key 'normal 'global (kbd "Ba") 'joe/bookmark-set-and-save) (evil-define-key 'normal 'global (kbd "Bd") 'bookmark-delete) (evil-define-key 'normal 'global (kbd "cr") 'joe/compile-run) (evil-define-key 'normal 'global (kbd "cc") 'joe/compile-comp) (evil-define-key 'normal 'global (kbd "ct") 'consult-theme) (evil-define-key 'normal 'global (kbd "C-h") 'evil-window-left) (evil-define-key 'normal 'global (kbd "C-j") 'evil-window-down) (evil-define-key 'normal 'global (kbd "C-k") 'evil-window-up) (evil-define-key 'normal 'global (kbd "C-l") 'evil-window-right) (evil-define-key 'normal 'global (kbd "M-h") 'tab-previous) (evil-define-key 'normal 'global (kbd "M-l") 'tab-next) (evil-define-key 'normal 'global (kbd "tn") 'tab-new) (evil-define-key 'normal 'global (kbd "tc") 'tab-close) ;; (evil-define-key 'normal 'global (kbd "M-h") 'tab-line-switch-to-prev-tab) ;; (evil-define-key 'normal 'global (kbd "M-l") 'tab-line-switch-to-next-tab) (defvar global-evil-leader-map (make-sparse-keymap)) (evil-define-key 'normal 'global-evil-leader-map (kbd "SPC") 'evil-send-leader) (define-minor-mode global-evil-leader-mode "Minor mode to make evil leader global" :global t :keymap global-evil-leader-map) (global-evil-leader-mode) ;; (require 'mini-modeline) ;; (mini-modeline-mode 1) (require 'nano-modeline) (nano-modeline-mode 1) (require 'evil-surround) (global-evil-surround-mode 1) (require 'evil-snipe) (evil-snipe-override-mode 1) (require 'evil-commentary) (evil-commentary-mode) (require 'avy) (setq avy-keys '(?a ?s ?d ?f ?w ?e ?r ?u ?i ?o ?h ?j ?k ?l ?x ?c ?m)) (setq avy-all-windows t) (setq avy-background t) (defvar avy-map (make-sparse-keymap)) (define-key evil-normal-state-map (kbd ",") avy-map) (define-key avy-map "b" #'avy-goto-word-0-above) (define-key avy-map "w" #'avy-goto-word-0-below) (define-key avy-map "c" #'avy-goto-char-timer) (require 'org-bullets) (defun joe/org-mode-setup () (org-bullets-mode) (org-indent-mode)) (add-hook 'org-mode-hook 'joe/org-mode-setup) (setq org-todo-keywords '((sequence "TODO" "IN-PROGRESS" "|" "DONE" "BACKLOG"))) (require 'org-tempo) (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) (setq org-edit-src-content-indentation 0) (require 'olivetti) (setq olivetti-minimum-body-width 120) ;; VEMCO (require 'vertico) (vertico-mode) (vertico-multiform-mode) (define-key vertico-map "\M-G" #'vertico-multiform-mode) (require 'vertico-posframe) (setq vertico-posframe-min-width 150) (setq vertico-posframe-min-height 30) (vertico-posframe-mode) (require 'embark) (require 'embark-consult) (define-key vertico-map "\M-e" #'embark-act) (require 'marginalia) (marginalia-mode t) (setq marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil)) (require 'orderless) (setq completion-styles '(orderless basic) completion-category-overrides '((file (styles basic partial-completion)))) (require 'savehist) (savehist-mode) (require 'recentf) (setq recentf-max-saved-items 1000) (setq recentf-max-menu-items 500) (recentf-mode t) (run-at-time t (* 5 60) 'recentf-save-list) (defun recentf-push-buffers-in-frame () (walk-windows (lambda (win) (let ((bfn (buffer-local-value 'buffer-file-name (window-buffer win)))) (and bfn (recentf-add-file bfn)))))) (add-to-list 'window-configuration-change-hook 'recentf-push-buffers-in-frame) (defun recentf-add-dired-directory () (when (and (stringp dired-directory) (equal "" (file-name-nondirectory dired-directory))) (recentf-add-file dired-directory))) (add-hook 'dired-mode-hook 'recentf-add-dired-directory) ;; Magic advice to rename entries in recentf when moving files in ;; dired. (defun rjs/recentf-rename-notify (oldname newname &rest args) (if (file-directory-p newname) (rjs/recentf-rename-directory oldname newname) (rjs/recentf-rename-file oldname newname))) (defun rjs/recentf-rename-file (oldname newname) (setq recentf-list (mapcar (lambda (name) (if (string-equal name oldname) newname name)) recentf-list))) (defun rjs/recentf-rename-directory (oldname newname) ;; oldname, newname and all entries of recentf-list should already ;; be absolute and normalised so I think this can just test whether ;; oldname is a prefix of the element. (setq recentf-list (mapcar (lambda (name) (if (string-prefix-p oldname name) (concat newname (substring name (length oldname))) name)) recentf-list))) ;; (advice-add 'dired-rename-file :after #'rjs/recentf-rename-notify) (require 'smartparens) (smartparens-global-mode +1) (show-paren-mode +1) (sp-pair "'" nil :actions :rem) (require 'vterm) (setq vterm-shell "/bin/fish") (setq vterm-timer-delay 0.01) (setq vterm-buffer-name-string "VTerm - %s") (setq vterm-max-scrollback 100000) (add-hook 'vterm-mode-hook (lambda () (setq global-hl-line-mode nil)) (evil-define-key 'normal vterm-mode-map (kbd "(") 'vterm-previous-prompt) (evil-define-key 'normal vterm-mode-map (kbd ")") 'vterm-next-prompt)) (require 'find-file-in-project) (setq ffip-use-rust-fd 't) (require 'evil-goggles) (evil-goggles-mode) (setq evil-goggles-duration 0.075) (setq evil-goggles-pulse t) (setq evil-goggles-async-duration 0.55) (modify-all-frames-parameters '((right-divider-width . 5) (internal-border-width . 10))) ;; (dolist (face '(window-divider ;; window-divider-first-pixel ;; window-divider-last-pixel)) ;; (face-spec-reset-face face) ;; (set-face-foreground face "#333")) ;; (set-face-background 'fringe (face-attribute 'default :background)) (require 'corfu) (global-corfu-mode) (setq corfu-auto t) (setq corfu-scroll-margin 10) (setq corfu-preselect-first nil) (setq corfu-preview-current t) (setq corfu-echo-documentation t) (setq corfu-quit-no-match t) (setq corfu-auto-prefix 1) (setq corfu-auto-delay 0) (setq corfu-max-width 100 corfu-min-width 50) (require 'kind-icon) (setq kind-icon-default-face 'corfu-default) (add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter) (require 'all-the-icons-completion) (all-the-icons-completion-mode) (add-hook 'marginalia-mode-hook #'all-the-icons-completion-marginalia-setup) (require 'ligature) (global-ligature-mode) (ligature-set-ligatures 'prog-mode '("|||>" "<|||" "<==>" "" "---" "-<<" "<~~" "<~>" "<*>" "<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->" "<--" "<-<" "<<=" "<<-" "<<<" "<+>" "" "###" "#_(" "..<" "..." "+++" "/==" "///" "_|_" "www" "&&" "^=" "~~" "~@" "~=" "~>" "~-" "**" "*>" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|" "[|" "]#" "::" ":=" ":>" ":<" "$>" "==" "=>" "!=" "!!" ">:" ">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:" "<$" "<=" "<>" "<-" "<<" "<+" "" "++" "?:" "?=" "?." "??" ";;" "/*" "/=" "/>" "//" "__" "~~" "(*" "*)" "\\\\" "://")) (add-to-list 'completion-at-point-functions #'cape-file) (define-key corfu-map (kbd "M-d") #'corfu-doc-toggle) (define-key corfu-map (kbd "M-p") #'corfu-doc-scroll-down) (define-key corfu-map (kbd "M-n") #'corfu-doc-scroll-up) (require 'lsp) (require 'consult) ;; (require 'consult-lsp) ;; (require 'dap-mode) ;; (require 'dap-netcore) ;; (require 'dap-gdb-lldb) ;; (setq dap-print-io t) (require 'eglot) (require 'eglot-fsharp) (require 'consult-eglot) (defun joe/compile-run () (interactive) (compile "make run")) (defun joe/compile-comp () (interactive) (compile "make")) ;; (require 'tree-sitter) ;; (require 'tree-sitter-langs) ;; (require 'evil-textobj-tree-sitter) ;; (define-key evil-outer-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.outer")) ;; (define-key evil-inner-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.inner")) ;; (define-key evil-normal-state-map (kbd "]f") (lambda () ;; (interactive) ;; (evil-textobj-tree-sitter-goto-textobj "function.outer"))) ;; (define-key evil-normal-state-map (kbd "[f") (lambda () ;; (interactive) ;; (evil-textobj-tree-sitter-goto-textobj "function.outer" t))) (setq display-buffer-alist `((,(rx bos (| (literal "*compilation") (literal "*shell") (literal "*eshell") (literal "*Compile-Log"))) display-buffer-in-direction (window . ;reference window t) ;either `t' (selected window), `main', `root', or an arbitrary valid window (direction . below) ;`below' (window) or `bottom' (of frame) ;absolute (10) or relative (0.3) (window-height . 0.33)))) ;; (dap-register-debug-template "NetCoreDdg Launch (4)" ;; (list :type "coreclr" ;; :request "launch" ;; :mode "launch" ;; :name "NetCoreDbg Launch" ;; :cwd nil ;; :dap-compilation "dotnet build" ;; :program "${workspaceFolder}/bin/Debug/net6.0/${workspaceFolderBasename}")) ;; (dap-register-debug-provider ;; "coreclr" ;; 'dap-netcore--populate-args) ;; (add-to-list 'load-path (expand-file-name "~/.emacs.vanilla/elpa/aweshell/")) ;; (require 'aweshell) ;; (require 'fish-completion) ;; (global-fish-completion-mode) ;; (setq evil-collection-company-use-tng nil) ;; (require 'slime) ;; (setq inferior-lisp-program "/usr/bin/sbcl") ;; (add-hook 'slime-mode-hook ;; (lambda () ;; ;; (setq global-hl-line-mode nil) ;; (evil-define-key 'normal slime-repl-mode-map (kbd "(") 'slime-repl-previous-prompt) ;; (evil-define-key 'normal slime-repl-mode-map (kbd ")") 'slime-repl-next-prompt) ;; (evil-define-key 'normal slime-repl-mode-map (kbd "C-j") 'evil-window-down) ;; (evil-define-key 'normal slime-repl-mode-map (kbd "C-k") 'evil-window-up))) ;; (setq slime-contribs '(slime-fancy slime-company)) ;; (require 'eglot) ;; (require 'eglot-fsharp) ;; (require 'consult-eglot) ;; TODO: Packages to check out ;; expand-region ;; projectile ;; Hydra (we can use it for some of the ideas I've had about repeating and arranging stuff) ;; CTRLF (figure out if it does anything interesting) ;; exec-path-from-shell ;; markdown-preview-mode ;; markdown-mode