Last active
March 21, 2023 21:54
-
-
Save james-nesbitt/cc34790185b7013190191f4704b03d9d to your computer and use it in GitHub Desktop.
emacs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; Initialize package handling | |
(require 'package) | |
(add-to-list 'package-archives '("gnu" . "https://elpa.gnu.org/packages/")) | |
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/")) | |
(package-initialize) | |
(unless (package-installed-p 'use-package) | |
(package-refresh-contents) | |
(package-install 'use-package)) | |
(eval-and-compile | |
(setq use-package-always-ensure t | |
use-package-expand-minimally t)) | |
(setq-default tab-width 4) | |
(global-set-key (kbd "S-C-<left>") 'shrink-window-horizontally) | |
(global-set-key (kbd "S-C-<right>") 'enlarge-window-horizontally) | |
(global-set-key (kbd "S-C-<down>") 'shrink-window) | |
(global-set-key (kbd "S-C-<up>") 'enlarge-window) | |
;; make whitespace-mode use just basic coloring | |
(progn | |
;; Make whitespace-mode with very basic background coloring for whitespaces. | |
;; http://xahlee.info/emacs/emacs/whitespace-mode.html | |
(setq whitespace-style (quote (face spaces tabs newline space-mark tab-mark newline-mark trailing))) | |
;; Make whitespace-mode and whitespace-newline-mode use “¶” for end of line char and “▷” for tab. | |
(setq whitespace-display-mappings | |
;; all numbers are unicode codepoint in decimal. e.g. (insert-char 182 1) | |
'( | |
(space-mark 32 [183] [46]) ; SPACE 32 「 」, 183 MIDDLE DOT 「·」, 46 FULL STOP 「.」 | |
(newline-mark 10 [182 10]) ; LINE FEED, | |
(tab-mark 9 [9655 9] [92 9]) ; tab | |
))) | |
;; standard dashboard | |
(use-package dashboard | |
:config | |
(dashboard-setup-startup-hook) | |
(setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*"))) | |
(setq dashboard-set-heading-icons t) | |
(setq dashboard-set-file-icons t) | |
(setq dashboard-projects-backend 'projectile) | |
(setq dashboard-items '((recents . 5) | |
(bookmarks . 5) | |
(projects . 5) | |
(agenda . 5) | |
(registers . 5)))) | |
(use-package dired-sidebar | |
:commands (dired-sidebar-toggle-sidebar)) | |
(use-package ibuffer-sidebar | |
:commands (ibuffer-sidebar-toggle-sidebar)) | |
;; Use meow modal editing globally | |
(use-package meow | |
:config | |
(setq meow-cheatsheet-layout meow-cheatsheet-layout-colemak) | |
(meow-motion-overwrite-define-key | |
'("<escape>" . ignore)) | |
(meow-leader-define-key | |
'("?" . meow-cheatsheet) | |
'("1" . meow-digit-argument) | |
'("2" . meow-digit-argument) | |
'("3" . meow-digit-argument) | |
'("4" . meow-digit-argument) | |
'("5" . meow-digit-argument) | |
'("6" . meow-digit-argument) | |
'("7" . meow-digit-argument) | |
'("8" . meow-digit-argument) | |
'("9" . meow-digit-argument) | |
'("0" . meow-digit-argument)) | |
(meow-normal-define-key | |
'("<up>" . meow-prev) | |
'("S-<up>" . meow-prev-expand) | |
'("<down>" . meow-next) | |
'("S-<down>" . meow-next-expand) | |
'("<left>" . meow-left) | |
'("S-<left>" . meow-left-expand) | |
'("<right>" . meow-right) | |
'("S-<right>" . meow-right-expand) | |
'("0" . meow-expand-0) | |
'("1" . meow-expand-1) | |
'("2" . meow-expand-2) | |
'("3" . meow-expand-3) | |
'("4" . meow-expand-4) | |
'("5" . meow-expand-5) | |
'("6" . meow-expand-6) | |
'("7" . meow-expand-7) | |
'("8" . meow-expand-8) | |
'("9" . meow-expand-9) | |
'("-" . negative-argument) | |
'(";" . meow-reverse) | |
'("," . meow-inner-of-thing) | |
'("." . meow-bounds-of-thing) | |
'("[" . meow-beginning-of-thing) | |
'("]" . meow-end-of-thing) | |
'("/" . meow-visit) | |
'("a" . meow-append) | |
'("A" . meow-open-below) | |
'("b" . meow-back-word) | |
'("B" . meow-back-symbol) | |
'("c" . meow-change) | |
'("d" . meow-delete) | |
'("D" . meow-backward-delete) | |
'("f" . meow-find) | |
'("g" . meow-cancel-selection) | |
'("G" . meow-grab) | |
'("i" . meow-insert) | |
'("I" . meow-open-above) | |
'("j" . meow-join) | |
'("k" . meow-kill) | |
'("l" . meow-line) | |
'("L" . meow-goto-line) | |
'("m" . meow-mark-word) | |
'("M" . meow-mark-symbol) | |
'("o" . meow-block) | |
'("O" . meow-to-block) | |
'("q" . meow-quit) | |
'("r" . meow-replace) | |
'("s" . meow-save) | |
'("S" . meow-search) | |
'("t" . meow-till) | |
'("u" . meow-undo) | |
'("U" . meow-undo-in-selection) | |
'("v" . meow-visit) | |
'("w" . meow-next-word) | |
'("W" . meow-next-symbol) | |
'("y" . meow-yank) | |
'("Y" . meow-yank-pop) | |
'("z" . meow-pop-selection) | |
'("'" . repeat) | |
'("<escape>" . ignore)) | |
(meow-global-mode 1)) | |
;; Ace-Window for window management | |
(use-package ace-window | |
:bind ("M-o" . ace-window)) | |
;; Enable projectile | |
(use-package projectile | |
:bind (:map projectile-mode-map | |
("C-c p" . projectile-command-map))) | |
;; Enable vertico | |
(use-package vertico | |
:init | |
(vertico-mode) | |
;; Different scroll margin | |
;; (setq vertico-scroll-margin 0) | |
;; Show more candidates | |
(setq vertico-count 20) | |
;; Grow and shrink the Vertico minibuffer | |
(setq vertico-resize t) | |
;; Optionally enable cycling for `vertico-next' and `vertico-previous'. | |
(setq vertico-cycle t)) | |
:config | |
;; Configure directory extension. | |
(use-package vertico-directory | |
:after vertico | |
:ensure nil | |
;; More convenient directory navigation commands | |
:bind (:map vertico-map | |
("RET" . vertico-directory-enter) | |
("DEL" . vertico-directory-delete-char) | |
("M-DEL" . vertico-directory-delete-word)) | |
;; Tidy shadowed file names | |
:hook (rfn-eshadow-update-overlay . vertico-directory-tidy)) | |
(use-package vertico-mouse | |
:after verico | |
:ensure nil) | |
;; Persist history over Emacs restarts. Vertico sorts by history position. | |
(use-package savehist | |
:init | |
(savehist-mode)) | |
;; Optionally use the `orderless' completion style. | |
(use-package orderless | |
:init | |
;; Configure a custom style dispatcher (see the Consult wiki) | |
;; (setq orderless-style-dispatchers '(+orderless-consult-dispatch orderless-affix-dispatch) | |
;; orderless-component-separator #'orderless-escapable-split-on-space) | |
(setq completion-styles '(orderless basic) | |
completion-category-defaults nil | |
completion-category-overrides '((file (styles partial-completion))))) | |
(use-package corfu | |
;; Optional customizations | |
:custom | |
(corfu-cycle t) ;; Enable cycling for `corfu-next/previous' | |
(corfu-auto t) ;; Enable auto completion | |
;; (corfu-separator ?\s) ;; Orderless field separator | |
;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary | |
;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match | |
;; (corfu-preview-current nil) ;; Disable current candidate preview | |
;; (corfu-preselect 'prompt) ;; Preselect the prompt | |
;; (corfu-on-exact-match nil) ;; Configure handling of exact matches | |
;; (corfu-scroll-margin 5) ;; Use scroll margin | |
;; Enable Corfu only for certain modes. | |
;; :hook ((prog-mode . corfu-mode) | |
;; (shell-mode . corfu-mode) | |
;; (eshell-mode . corfu-mode)) | |
;; Recommended: Enable Corfu globally. | |
;; This is recommended since Dabbrev can be used globally (M-/). | |
;; See also `corfu-excluded-modes'. | |
:init | |
(global-corfu-mode)) | |
;; Example configuration for Consult | |
(use-package consult | |
;; Replace bindings. Lazily loaded due by `use-package'. | |
:bind (;; C-c bindings (mode-specific-map) | |
("C-c M-x" . consult-mode-command) | |
("C-c h" . consult-history) | |
("C-c k" . consult-kmacro) | |
("C-c m" . consult-man) | |
("C-c i" . consult-info) | |
([remap Info-search] . consult-info) | |
;; C-x bindings (ctl-x-map) | |
("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command | |
("C-x b" . consult-buffer) ;; orig. switch-to-buffer | |
("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window | |
("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame | |
("C-x r b" . consult-bookmark) ;; orig. bookmark-jump | |
("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer | |
;; Custom M-# bindings for fast register access | |
("M-#" . consult-register-load) | |
("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) | |
("C-M-#" . consult-register) | |
;; Other custom bindings | |
("M-y" . consult-yank-pop) ;; orig. yank-pop | |
;; M-g bindings (goto-map) | |
("M-g e" . consult-compile-error) | |
("M-g f" . consult-flymake) ;; Alternative: consult-flycheck | |
("M-g g" . consult-goto-line) ;; orig. goto-line | |
("M-g M-g" . consult-goto-line) ;; orig. goto-line | |
("M-g o" . consult-outline) ;; Alternative: consult-org-heading | |
("M-g m" . consult-mark) | |
("M-g k" . consult-global-mark) | |
("M-g i" . consult-imenu) | |
("M-g I" . consult-imenu-multi) | |
;; M-s bindings (search-map) | |
("M-s d" . consult-find) | |
("M-s D" . consult-locate) | |
("M-s g" . consult-grep) | |
("M-s G" . consult-git-grep) | |
("M-s r" . consult-ripgrep) | |
("M-s l" . consult-line) | |
("M-s L" . consult-line-multi) | |
("M-s k" . consult-keep-lines) | |
("M-s u" . consult-focus-lines) | |
;; Isearch integration | |
("M-s e" . consult-isearch-history) | |
:map isearch-mode-map | |
("M-e" . consult-isearch-history) ;; orig. isearch-edit-string | |
("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string | |
("M-s l" . consult-line) ;; needed by consult-line to detect isearch | |
("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch | |
;; Minibuffer history | |
:map minibuffer-local-map | |
("M-s" . consult-history) ;; orig. next-matching-history-element | |
("M-r" . consult-history)) ;; orig. previous-matching-history-element | |
;; Enable automatic preview at point in the *Completions* buffer. This is | |
;; relevant when you use the default completion UI. | |
:hook (completion-list-mode . consult-preview-at-point-mode) | |
;; The :init configuration is always executed (Not lazy) | |
:init | |
;; Optionally configure the register formatting. This improves the register | |
;; preview for `consult-register', `consult-register-load', | |
;; `consult-register-store' and the Emacs built-ins. | |
(setq register-preview-delay 0.5 | |
register-preview-function #'consult-register-format) | |
;; Optionally tweak the register preview window. | |
;; This adds thin lines, sorting and hides the mode line of the window. | |
(advice-add #'register-preview :override #'consult-register-window) | |
;; Use Consult to select xref locations with preview | |
(setq xref-show-xrefs-function #'consult-xref | |
xref-show-definitions-function #'consult-xref) | |
;; Configure other variables and modes in the :config section, | |
;; after lazily loading the package. | |
:config | |
;; Optionally configure preview. The default value | |
;; is 'any, such that any key triggers the preview. | |
;; (setq consult-preview-key 'any) | |
;; (setq consult-preview-key "M-.") | |
;; (setq consult-preview-key '("S-<down>" "S-<up>")) | |
;; For some commands and buffer sources it is useful to configure the | |
;; :preview-key on a per-command basis using the `consult-customize' macro. | |
(consult-customize | |
consult-theme :preview-key '(:debounce 0.2 any) | |
consult-ripgrep consult-git-grep consult-grep | |
consult-bookmark consult-recent-file consult-xref | |
consult--source-bookmark consult--source-file-register | |
consult--source-recent-file consult--source-project-recent-file | |
;; :preview-key "M-." | |
:preview-key '(:debounce 0.4 any)) | |
;; Optionally configure the narrowing key. | |
;; Both < and C-+ work reasonably well. | |
(setq consult-narrow-key "<") ;; "C-+" | |
;; Optionally make narrowing help available in the minibuffer. | |
;; You may want to use `embark-prefix-help-command' or which-key instead. | |
;; (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help) | |
;; By default `consult-project-function' uses `project-root' from project.el. | |
;; Optionally configure a different project root function. | |
;;;; 1. project.el (the default) | |
;; (setq consult-project-function #'consult--default-project--function) | |
;;;; 2. vc.el (vc-root-dir) | |
;; (setq consult-project-function (lambda (_) (vc-root-dir))) | |
;;;; 3. locate-dominating-file | |
;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git"))) | |
;;;; 4. projectile.el (projectile-project-root) | |
;; (autoload 'projectile-project-root "projectile") | |
;; (setq consult-project-function (lambda (_) (projectile-project-root))) | |
;;;; 5. No project support | |
;; (setq consult-project-function nil) | |
) | |
(use-package marginalia | |
;; Either bind `marginalia-cycle' globally or only in the minibuffer | |
:bind (("M-A" . marginalia-cycle) | |
:map minibuffer-local-map | |
("M-A" . marginalia-cycle)) | |
:init | |
(marginalia-mode)) | |
(use-package embark | |
:bind | |
(("C-." . embark-act) ;; pick some comfortable binding | |
("C-;" . embark-dwim) ;; good alternative: M-. | |
("C-h B" . embark-bindings)) ;; alternative for `describe-bindings' | |
:init | |
;; Optionally replace the key help with a completing-read interface | |
(setq prefix-help-command #'embark-prefix-help-command) | |
;; Show the Embark target at point via Eldoc. You may adjust the Eldoc | |
;; strategy, if you want to see the documentation from multiple providers. | |
(add-hook 'eldoc-documentation-functions #'embark-eldoc-first-target) | |
;; (setq eldoc-documentation-strategy #'eldoc-documentation-compose-eagerly) | |
:config | |
;; Hide the mode line of the Embark live/completions buffers | |
(add-to-list 'display-buffer-alist | |
'("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*" | |
nil | |
(window-parameters (mode-line-format . none)))) | |
;; Consult users will also want the embark-consult package. | |
(use-package embark-consult | |
:hook | |
(embark-collect-mode . consult-preview-at-point-mode))) | |
;; org (agenda) configuration | |
(use-package org | |
:config | |
(use-package org-clock | |
:ensure nil | |
:after org | |
:config | |
(setq org-agenda-span 'day | |
org-agenda-files '("~/Documents/Mirantis/organization") | |
org-agenda-block-separator " "))) | |
(use-package org-roam | |
:custom | |
(org-roam-directory (file-truename "/path/to/org-files/")) | |
:bind (("C-c n l" . org-roam-buffer-toggle) | |
("C-c n f" . org-roam-node-find) | |
("C-c n g" . org-roam-graph) | |
("C-c n i" . org-roam-node-insert) | |
("C-c n c" . org-roam-capture) | |
;; Dailies | |
("C-c n j" . org-roam-dailies-capture-today)) | |
:config | |
;; If you're using a vertical completion framework, you might want a more informative completion interface | |
(setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) | |
(org-roam-db-autosync-mode) | |
;; If using org-roam-protocol | |
(require 'org-roam-protocol)) | |
;; A few more useful configurations... | |
(use-package emacs | |
:init | |
;; Add prompt indicator to `completing-read-multiple'. | |
;; We display [CRM<separator>], e.g., [CRM,] if the separator is a comma. | |
(defun crm-indicator (args) | |
(cons (format "[CRM%s] %s" | |
(replace-regexp-in-string | |
"\\`\\[.*?]\\*\\|\\[.*?]\\*\\'" "" | |
crm-separator) | |
(car args)) | |
(cdr args))) | |
(advice-add #'completing-read-multiple :filter-args #'crm-indicator) | |
;; Do not allow the cursor in the minibuffer prompt | |
(setq minibuffer-prompt-properties | |
'(read-only t cursor-intangible t face minibuffer-prompt)) | |
(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) | |
;; Emacs 28: Hide commands in M-x which do not work in the current mode. | |
;; Vertico commands are hidden in normal buffers. | |
;; (setq read-extended-command-predicate | |
;; #'command-completion-default-include-p) | |
;; Enable recursive minibuffers | |
(setq enable-recursive-minibuffers t) | |
;; TAB cycle if there are only few candidates | |
(setq completion-cycle-threshold 3) | |
;; Emacs 28: Hide commands in M-x which do not apply to the current mode. | |
;; Corfu commands are hidden, since they are not supposed to be used via M-x. | |
;; (setq read-extended-command-predicate | |
;; #'command-completion-default-include-p) | |
;; Enable indentation+completion using the TAB key. | |
;; `completion-at-point' is often bound to M-TAB. | |
(setq tab-always-indent 'complete) | |
(setq backup-directory-alist | |
`((".*" . ,temporary-file-directory))) | |
(setq auto-save-file-name-transforms | |
`((".*" ,temporary-file-directory t)))) | |
(use-package go-mode | |
:mode "\\.go\\'" | |
:hook | |
(go-mode . eglot-ensure)) | |
(use-package python-mode | |
:ensure nil | |
:hook | |
(python-mode . eglot-ensure)) ; connect to language server when py-file is opened | |
(use-package auto-virtualenv | |
:after python-mode | |
:init | |
(use-package pyvenv) | |
:config | |
:hook ((python-mode . auto-virtualenv-set-virtualenv) | |
(projectile-after-switch-project . auto-virtualenv-set-virtualenv))) ;; If using projectile | |
(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. | |
'(column-number-mode t) | |
'(current-language-environment "UTF-8") | |
'(custom-enabled-themes '(modus-vivendi)) | |
'(package-selected-packages | |
'(dired-sidebar ibuffer-sidebar all-the-icons-dired all-the-icons auto-virtualenv go-mode meow ace-window projectile vertico orderless corfu marginalia embark-consult)) | |
'(tool-bar-mode nil) | |
'(warning-suppress-types '((comp)))) | |
(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. | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment