dotfiles

Linux and macOS dotfiles
git clone https://github.com/michaelneuper/dotfiles.git
README | Files | Log | Refs

commit 649a096110d94dea4e5b85816c6d5ca8e5610474
parent ba8307a0830c4753067c6f1275352e24956fd86a
Author: Michael Neuper <73108749+michaelneuper@users.noreply.github.com>
Date:   Sun, 11 Jun 2023 15:34:04 +0200

Change to literate config

Diffstat:
M.config/doom/config.el | 345++++++++++++++++++++++++++++++++-----------------------------------------------
A.config/doom/config.org | 576+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/doom/custom.el | 15+++++++++++++++
M.config/doom/init.el | 2+-
M.config/doom/packages.el | 1+
5 files changed, 734 insertions(+), 205 deletions(-)

diff --git a/.config/doom/config.el b/.config/doom/config.el @@ -1,44 +1,3 @@ -;; __ __ _ _ -;; | \/ | \ | | -;; | \ / | \| | Michael Neuper -;; | |\/| | . ` | https://michaelneuper.com -;; | | | | |\ | https://github.com/michaelneuper -;; |_| |_|_| \_| -;; -;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- -;; Whenever you reconfigure a package, make sure to wrap your config in an -;; `after!' block, otherwise Doom's defaults may override your settings. E.g. -;; -;; (after! PACKAGE -;; (setq x y)) -;; -;; The exceptions to this rule: -;; -;; - Setting file/directory variables (like `org-directory') -;; - Setting variables which explicitly tell you to set them before their -;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). -;; - Setting doom variables (which start with 'doom-' or '+'). -;; -;; Here are some additional functions/macros that will help you configure Doom. -;; -;; - `load!' for loading external *.el files relative to this one -;; - `use-package!' for configuring packages -;; - `after!' for running code after a package has loaded -;; - `add-load-path!' for adding directories to the `load-path', relative to -;; this file. Emacs searches the `load-path' when you load packages with -;; `require' or `use-package'. -;; - `map!' for binding new keys -;; -;; To get information about any of these functions/macros, move the cursor over -;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). -;; This will open documentation for it, including demos of how they are used. -;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, -;; etc). -;; -;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how -;; they are implemented. - -;; CONFIGURATION (setq doom-theme 'doom-one) (setq doom-localleader-key "SPC l" @@ -63,18 +22,14 @@ (when (version< "29.0.50" emacs-version) (pixel-scroll-precision-mode)) + ;; (unless (eq system-type 'darwin) ;; (require 'good-scroll) ;; (good-scroll-mode 1)) -(setq-default spell-checking-enable-by-default nil) - -;; CREDENTIALS (setq user-full-name "Michael Neuper" user-mail-address "michael@michaelneuper.com") -;;FONTS - ; SPC h v doom-font (setq doom-font (font-spec :family "Fira Code" :size 12.5) doom-variable-pitch-font (font-spec :family "Noto Sans" :size 15)) @@ -86,7 +41,6 @@ '(font-lock-comment-face :slant italic) '(font-lock-keyword-face :slant italic)) - ; disable certain ligatures (plist-put! +ligatures-extra-symbols :and nil :or nil @@ -100,28 +54,15 @@ :list nil ) -;; WINDOW MANAGEMENT (setq evil-split-window-below t evil-vsplit-window-right t) -;; Ask what buffer to switch to when doing a split (defadvice! prompt-for-buffers (&rest _) :after '(evil-window-split evil-window-vsplit) (consult-buffer)) -;; EVIL MODE -(setq undo-limit 80000000 ; Raise undo limit to 80mb - evil-want-fine-undo t) ; Grandular changes when in insert mode - -;; INFO-COLORS -(use-package! info-colors - :commands (info-colors-fontify-node)) - -(add-hook 'Info-selection-hook - 'info-colors-fontify-node) - -;; DASHBOARD (setq doom-fallback-buffer-name "*dashboard*") + (use-package! dashboard :ensure t :init @@ -156,7 +97,12 @@ :config (dashboard-setup-startup-hook)) -;; MODELINE +(use-package! info-colors + :commands (info-colors-fontify-node)) + +(add-hook 'Info-selection-hook + 'info-colors-fontify-node) + (nyan-mode) (setq nyan-animate-nyancat t nyan-wavy-trail t) @@ -166,7 +112,6 @@ doom-modeline-persp-icon t doom-modeline-major-mode-icon t) -;; TABS (after! centaur-tabs :ensure t :config @@ -179,69 +124,97 @@ (centaur-tabs-mode t) (centaur-tabs-group-by-projectile-project)) -;; LATEX -(require 'org) -(add-to-list 'org-latex-packages-alist '("" "amsmath" t)) -(add-to-list 'org-latex-packages-alist '("" "amssymb" t)) -(setq org-preview-latex-default-process 'dvipng) +(require 'svg-tag-mode) -;; ORG MODE -(setq org-directory "~/Org" - org-use-property-inheritance t ; fix weird issue with src blocks - org-startup-with-inline-images t - org-startup-with-latex-preview t) +(defconst date-re "[0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\}") +(defconst time-re "[0-9]\\{2\\}:[0-9]\\{2\\}") +(defconst day-re "[A-Za-z]\\{3\\}") +(defconst day-time-re (format "\\(%s\\)? ?\\(%s\\)?" day-re time-re)) -(after! org - (setq org-agenda-files - '("~/Org/" "~/Documents/Org/agenda.org"))) +(defun svg-progress-percent (value) + (svg-image (svg-lib-concat + (svg-lib-progress-bar (/ (string-to-number value) 100.0) + nil :margin 0 :stroke 2 :radius 3 :padding 2 :width 11) + (svg-lib-tag (concat value "%") + nil :stroke 0 :margin 0)) :ascent 'center)) -;; Show ansi-color codes in org results -(defun my/babel-ansi () - (when-let ((beg (org-babel-where-is-src-block-result nil nil))) - (save-excursion - (goto-char beg) - (when (looking-at org-babel-result-regexp) - (let ((end (org-babel-result-end)) - (ansi-color-context-region nil)) - (ansi-color-apply-on-region beg end)))))) -(add-hook 'org-babel-after-execute-hook 'my/babel-ansi) +(defun svg-progress-count (value) + (let* ((seq (mapcar #'string-to-number (split-string value "/"))) + (count (float (car seq))) + (total (float (cadr seq)))) + (svg-image (svg-lib-concat + (svg-lib-progress-bar (/ count total) nil + :margin 0 :stroke 2 :radius 3 :padding 2 :width 11) + (svg-lib-tag value nil + :stroke 0 :margin 0)) :ascent 'center))) -;; ORG ROAM -(setq org-roam-directory "~/RoamNotes" - org-attach-id-dir "attachments/") +(setq svg-tag-tags + `( + ;; Org tags :TAG1:TAG2:TAG3: + (":\\([A-Za-z0-9]+\\)" . ((lambda (tag) (svg-tag-make tag)))) + (":\\([A-Za-z0-9]+[ \-]\\)" . ((lambda (tag) tag))) -(use-package! websocket - :after org-roam) + ;; Task priority [#A] [#B] [#C] + ("\\[#[A-Z]\\]" . ( (lambda (tag) + (svg-tag-make tag :face 'org-priority + :beg 2 :end -1 :margin 0)))) -(use-package! org-roam-ui - :after org-roam ;; or :after org - ;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have - ;; a hookable mode anymore, you're advised to pick something yourself - ;; if you don't care about startup time, use - ;; :hook (after-init . org-roam-ui-mode) - :config - (setq org-roam-ui-sync-theme t - org-roam-ui-follow t - org-roam-ui-update-on-save t - org-roam-ui-open-on-start t)) + ;; Progress [1/3] + ("\\(\\[[0-9]\\{1,3\\}%\\]\\)" . ((lambda (tag) + (svg-progress-percent (substring tag 1 -2))))) + ("\\(\\[[0-9]+/[0-9]+\\]\\)" . ((lambda (tag) + (svg-progress-count (substring tag 1 -1))))) -(setq org-roam-database-connector 'sqlite3) + ;; TODO / DONE + ("TODO" . ((lambda (tag) (svg-tag-make "TODO" :face 'org-todo :inverse t :margin 0)))) + ("DONE" . ((lambda (tag) (svg-tag-make "DONE" :face 'org-done :margin 0)))) -;; ELISP -(map! :leader - (:prefix ("e" . "evaluate") - :desc "Evaluate elisp in buffer" - "b" #'eval-buffer - :desc "Evaluate defun" - "d" #'eval-defun - :desc "Evaluate elisp expression" - "e" #'eval-expression - :desc "Evaluate last sexpression" - "l" #'eval-last-sexp - :desc "Evaluate elisp in region" - "r" #'eval-region)) + ;; Citation of the form [cite:@Knuth:1984] + ("\\(\\[cite:@[A-Za-z]+:\\)" . ((lambda (tag) + (svg-tag-make tag + :inverse t + :beg 7 :end -1 + :crop-right t)))) + ("\\[cite:@[A-Za-z]+:\\([0-9]+\\]\\)" . ((lambda (tag) + (svg-tag-make tag + :end -1 + :crop-left t)))) + + + ;; Active date (with or without day name, with or without time) <2021-12-24 Fri 14:00> + (,(format "\\(<%s>\\)" date-re) . + ((lambda (tag) + (svg-tag-make tag :beg 1 :end -1 :margin 0)))) + (,(format "\\(<%s \\)%s>" date-re day-time-re) . + ((lambda (tag) + (svg-tag-make tag :beg 1 :inverse nil :crop-right t :margin 0)))) + (,(format "<%s \\(%s>\\)" date-re day-time-re) . + ((lambda (tag) + (svg-tag-make tag :end -1 :inverse t :crop-left t :margin 0)))) + + ;; Inactive date (with or without day name, with or without time) [2021-12-24 Fri 14:00] + (,(format "\\(\\[%s\\]\\)" date-re) . + ((lambda (tag) + (svg-tag-make tag :beg 1 :end -1 :margin 0 :face 'org-date)))) + (,(format "\\(\\[%s \\)%s\\]" date-re day-time-re) . + ((lambda (tag) + (svg-tag-make tag :beg 1 :inverse nil :crop-right t :margin 0 :face 'org-date)))) + (,(format "\\[%s \\(%s\\]\\)" date-re day-time-re) . + ((lambda (tag) + (svg-tag-make tag :end -1 :inverse t :crop-left t :margin 0 :face 'org-date)))))) + +(add-hook! 'org-mode-hook '(svg-tag-mode t)) + +(setq lsp-enable-symbol-highlighting t + lsp-ui-doc-enable t + lsp-lens-enable t + lsp-headerline-breadcrumb-enable t + lsp-modeline-code-actions-enable t + lsp-diagnostics-provider :flycheck + lsp-ui-sideline-enable t + lsp-completion-show-detail t + lsp-completion-show-kind t) -;; COMPANY MODE (add-hook 'after-init-hook 'global-company-mode) ;; from modules/completion/company/config.el (use-package! company @@ -254,21 +227,26 @@ company-dabbrev-ignore-case nil) [...]) -;; LSP MODE -(setq lsp-enable-symbol-highlighting t - lsp-ui-doc-enable t - lsp-lens-enable t - lsp-headerline-breadcrumb-enable t - lsp-modeline-code-actions-enable t - lsp-diagnostics-provider :flycheck - lsp-ui-sideline-enable t - lsp-completion-show-detail t - lsp-completion-show-kind t) +(require 'org) +(add-to-list 'org-latex-packages-alist '("" "amsmath" t)) +(add-to-list 'org-latex-packages-alist '("" "amssymb" t)) +(setq org-preview-latex-default-process 'dvipng) + +(map! :leader + (:prefix ("e" . "evaluate") + :desc "Evaluate elisp in buffer" + "b" #'eval-buffer + :desc "Evaluate defun" + "d" #'eval-defun + :desc "Evaluate elisp expression" + "e" #'eval-expression + :desc "Evaluate last sexpression" + "l" #'eval-last-sexp + :desc "Evaluate elisp in region" + "r" #'eval-region)) -;; JAVA (after! lsp-mode (require 'lsp-java)) -;; Configure LSP Java (after! lsp-java (add-hook 'java-mode-hook #'lsp) (add-hook 'java-mode-hook @@ -284,14 +262,12 @@ ;; (setq lsp-java-server-install-dir "/bin/jdtls") ;; (setq lsp-java-workspace-dir "~/Projects/java") -;; Display ansi colour codes (after! text-mode (add-hook! 'text-mode-hook (unless (derived-mode-p 'org-mode) (with-silent-modifications (ansi-color-apply-on-region (point-min) (point-max) t))))) -;; SPOTIFY (require 'smudge) (load! "spotify-credentials.el") (setq smudge-status-location 'modeline) @@ -340,84 +316,45 @@ :desc "Toggle mute" "m" #'smudge-controller-voume-mute-unmute)) -;; SVG TAGS -(require 'svg-tag-mode) +(setq undo-limit 80000000) -(defconst date-re "[0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\}") -(defconst time-re "[0-9]\\{2\\}:[0-9]\\{2\\}") -(defconst day-re "[A-Za-z]\\{3\\}") -(defconst day-time-re (format "\\(%s\\)? ?\\(%s\\)?" day-re time-re)) - -(defun svg-progress-percent (value) - (svg-image (svg-lib-concat - (svg-lib-progress-bar (/ (string-to-number value) 100.0) - nil :margin 0 :stroke 2 :radius 3 :padding 2 :width 11) - (svg-lib-tag (concat value "%") - nil :stroke 0 :margin 0)) :ascent 'center)) - -(defun svg-progress-count (value) - (let* ((seq (mapcar #'string-to-number (split-string value "/"))) - (count (float (car seq))) - (total (float (cadr seq)))) - (svg-image (svg-lib-concat - (svg-lib-progress-bar (/ count total) nil - :margin 0 :stroke 2 :radius 3 :padding 2 :width 11) - (svg-lib-tag value nil - :stroke 0 :margin 0)) :ascent 'center))) +(setq evil-want-fine-undo t) -(setq svg-tag-tags - `( - ;; Org tags :TAG1:TAG2:TAG3: - (":\\([A-Za-z0-9]+\\)" . ((lambda (tag) (svg-tag-make tag)))) - (":\\([A-Za-z0-9]+[ \-]\\)" . ((lambda (tag) tag))) - - ;; Task priority [#A] [#B] [#C] - ("\\[#[A-Z]\\]" . ( (lambda (tag) - (svg-tag-make tag :face 'org-priority - :beg 2 :end -1 :margin 0)))) - - ;; Progress [1/3] - ("\\(\\[[0-9]\\{1,3\\}%\\]\\)" . ((lambda (tag) - (svg-progress-percent (substring tag 1 -2))))) - ("\\(\\[[0-9]+/[0-9]+\\]\\)" . ((lambda (tag) - (svg-progress-count (substring tag 1 -1))))) +(setq org-directory "~/Org" + org-use-property-inheritance t ; fix weird issue with src blocks + org-startup-with-inline-images t + org-startup-with-latex-preview t) - ;; TODO / DONE - ("TODO" . ((lambda (tag) (svg-tag-make "TODO" :face 'org-todo :inverse t :margin 0)))) - ("DONE" . ((lambda (tag) (svg-tag-make "DONE" :face 'org-done :margin 0)))) +(after! org + (setq org-agenda-files + '("~/Org/" "~/Documents/Org/agenda.org"))) - ;; Citation of the form [cite:@Knuth:1984] - ("\\(\\[cite:@[A-Za-z]+:\\)" . ((lambda (tag) - (svg-tag-make tag - :inverse t - :beg 7 :end -1 - :crop-right t)))) - ("\\[cite:@[A-Za-z]+:\\([0-9]+\\]\\)" . ((lambda (tag) - (svg-tag-make tag - :end -1 - :crop-left t)))) +(defun my/babel-ansi () + (when-let ((beg (org-babel-where-is-src-block-result nil nil))) + (save-excursion + (goto-char beg) + (when (looking-at org-babel-result-regexp) + (let ((end (org-babel-result-end)) + (ansi-color-context-region nil)) + (ansi-color-apply-on-region beg end)))))) +(add-hook 'org-babel-after-execute-hook 'my/babel-ansi) +(setq org-roam-directory "~/RoamNotes" + org-attach-id-dir "attachments/") - ;; Active date (with or without day name, with or without time) <2021-12-24 Fri 14:00> - (,(format "\\(<%s>\\)" date-re) . - ((lambda (tag) - (svg-tag-make tag :beg 1 :end -1 :margin 0)))) - (,(format "\\(<%s \\)%s>" date-re day-time-re) . - ((lambda (tag) - (svg-tag-make tag :beg 1 :inverse nil :crop-right t :margin 0)))) - (,(format "<%s \\(%s>\\)" date-re day-time-re) . - ((lambda (tag) - (svg-tag-make tag :end -1 :inverse t :crop-left t :margin 0)))) +(use-package! websocket + :after org-roam) - ;; Inactive date (with or without day name, with or without time) [2021-12-24 Fri 14:00] - (,(format "\\(\\[%s\\]\\)" date-re) . - ((lambda (tag) - (svg-tag-make tag :beg 1 :end -1 :margin 0 :face 'org-date)))) - (,(format "\\(\\[%s \\)%s\\]" date-re day-time-re) . - ((lambda (tag) - (svg-tag-make tag :beg 1 :inverse nil :crop-right t :margin 0 :face 'org-date)))) - (,(format "\\[%s \\(%s\\]\\)" date-re day-time-re) . - ((lambda (tag) - (svg-tag-make tag :end -1 :inverse t :crop-left t :margin 0 :face 'org-date)))))) +(use-package! org-roam-ui + :after org-roam ;; or :after org + ;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have + ;; a hookable mode anymore, you're advised to pick something yourself + ;; if you don't care about startup time, use + ;; :hook (after-init . org-roam-ui-mode) + :config + (setq org-roam-ui-sync-theme t + org-roam-ui-follow t + org-roam-ui-update-on-save t + org-roam-ui-open-on-start t)) -(add-hook! 'org-mode-hook '(svg-tag-mode t)) +(setq org-roam-database-connector 'sqlite3) diff --git a/.config/doom/config.org b/.config/doom/config.org @@ -0,0 +1,576 @@ +#+title: Doom Emacs Config +#+author: Michael Neuper + __ __ _ _ +| \/ | \ | | +| \ / | \| | Michael Neuper +| |\/| | . ` | https://michaelneuper.com +| | | | |\ | https://github.com/michaelneuper +|_| |_|_| \_| + +* Doom +Whenever you reconfigure a package, make sure to wrap your config in an +`after!' block, otherwise Doom's defaults may override your settings. E.g. + + (after! PACKAGE + (setq x y)) + +The exceptions to this rule: + - Setting file/directory variables (like `org-directory') + - Setting variables which explicitly tell you to set them before their + package is loaded (see 'C-h v VARIABLE' to look up their documentation). + - Setting doom variables (which start with 'doom-' or '+'). + +Here are some additional functions/macros that will help you configure Doom. + +- `load!' for loading external *.el files relative to this one +- `use-package!' for configuring packages +- `after!' for running code after a package has loaded +- `add-load-path!' for adding directories to the `load-path', relative to + this file. Emacs searches the `load-path' when you load packages with + `require' or `use-package'. +- `map!' for binding new keys + +To get information about any of these functions/macros, move the cursor over +the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). +This will open documentation for it, including demos of how they are used. +Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, +etc). + +You can also try 'gd' (or 'C-c c d') to jump to their definition and see how +they are implemented. + +* Configuration +** Theme +Use doom-one theme. + +#+begin_src emacs-lisp +(setq doom-theme 'doom-one) +#+end_src + +** Local Leader Key +Remap <localleader> from m to l to avoid conflict with spotify bindings. + +#+begin_src emacs-lisp +(setq doom-localleader-key "SPC l" + doom-localleader-alt-key "M-SPC l") +#+end_src + +** Faces +#+begin_src emacs-lisp +(custom-set-faces! + '(doom-dashboard-banner :inherit default) + '(doom-dashboard-loaded :inherit default)) + +(custom-set-faces! + '(dashboard-startup-banner :inherit default)) +#+end_src + +** Line Numbers +Use visual line numbers to avoid wrong line numbers in folded content. + +#+begin_src emacs-lisp +(setq display-line-numbers-type 'visual) +#+end_src + +** Column Indicator +Display column indicator after 80 characters in programming mode. + +#+begin_src emacs-lisp +(setq display-fill-column-indicator-column 80) +(add-hook 'prog-mode-hook #'display-fill-column-indicator-mode) +#+end_src + +** Auto-Save and Backup +#+begin_src emacs-lisp +;; (setq auto-save-default t +;; make-backup-files t) +#+end_src + +** Confirm Kill Emacs +Kill emacs without confirming. + +#+begin_src emacs-lisp +(setq confirm-kill-emacs nil) +#+end_src + +** Pixel Scroll +Enable pixel precision scrolling. + +#+begin_src emacs-lisp +(when (version< "29.0.50" emacs-version) + (pixel-scroll-precision-mode)) +#+end_src + +Enable smooth scrolling + +#+begin_src emacs-lisp +;; (unless (eq system-type 'darwin) +;; (require 'good-scroll) +;; (good-scroll-mode 1)) +#+end_src + +** Credentials +#+begin_src emacs-lisp +(setq user-full-name "Michael Neuper" + user-mail-address "michael@michaelneuper.com") +#+end_src + +** Fonts +Set doom fonts. + +#+begin_src emacs-lisp +(setq doom-font (font-spec :family "Fira Code" :size 12.5) + doom-variable-pitch-font (font-spec :family "Noto Sans" :size 15)) +#+end_src + +Italicize comments. + +#+begin_src emacs-lisp +(after! doom-themes + (setq doom-themes-enable-bold t + doom-themes-enable-italic t)) + +(custom-set-faces! + '(font-lock-comment-face :slant italic) + '(font-lock-keyword-face :slant italic)) +#+end_src + +Disable certain ligatures. + +#+begin_src emacs-lisp +(plist-put! +ligatures-extra-symbols + :and nil + :or nil + :not nil + :true nil + :false nil + :int nil + :float nil + :str nil + :bool nil + :list nil + ) +#+end_src + +* Window Management +** Split Window Behaviour +Window split behaviour. + +#+begin_src emacs-lisp +(setq evil-split-window-below t + evil-vsplit-window-right t) +#+end_src + +** Prompt for Buffers +Ask what buffer to switch to when doing a split. + +#+begin_src emacs-lisp +(defadvice! prompt-for-buffers (&rest _) + :after '(evil-window-split evil-window-vsplit) + (consult-buffer)) +#+end_src + +* Interface +** Dashboard +Switch to dashboard from doom-dashboard. + +#+begin_src emacs-lisp +(setq doom-fallback-buffer-name "*dashboard*") +#+end_src + +Configure dashboard + +#+begin_src emacs-lisp +(use-package! dashboard + :ensure t + :init + (setq dashboard-items '((recents . 3) + (projects . 3) + (bookmarks . 5)) + dashboard-show-shortcuts t + dashboard-center-content t + dashboard-startup-banner (concat doom-user-dir + "doom-banners/splashes/emacs/M-x_butterfly.png") + dashboard-banner-logo-title "Welcome back to Emacs!" + dashboard-display-icons-p t + dashboard-set-file-icons t + dashboard-set-heading-icons t + dashboard-set-navigator t) + ;; Format: "(icon title help action face prefix suffix)" + (setq dashboard-navigator-buttons + `(;; line 1 + ((,(all-the-icons-octicon "mark-github" :height 1.0 :v-adjust 0.0) + "GitHub" + "Browse GitHub" + (lambda (&rest _) (browse-url "https://github.com/michaelneuper")))) + (;; line 2 + (,(all-the-icons-faicon "calendar" :height 1.0 :v-adjust 0.0) + "Agenda" + "View org-agenda" + (lambda (&rest _) (org-agenda)) warning) + (,(all-the-icons-octicon "book" :height 1.0 :v-adjust 0.0) + "Docs" + "Show documentation" + (lambda (&rest _) (doom/help)) warning)))) + :config + (dashboard-setup-startup-hook)) +#+end_src + +** Info-Colors +#+begin_src emacs-lisp +(use-package! info-colors + :commands (info-colors-fontify-node)) + +(add-hook 'Info-selection-hook + 'info-colors-fontify-node) +#+end_src + +** Modeline +Enable nyan-cat in modeline. + +#+begin_src emacs-lisp +(nyan-mode) +(setq nyan-animate-nyancat t + nyan-wavy-trail t) +#+end_src + +Enable extra icons in doom-modeline. + +#+begin_src emacs-lisp +(setq doom-modeline-enable-word-count t + doom-modeline-persp-name t + doom-modeline-persp-icon t + doom-modeline-major-mode-icon t) +#+end_src + +** Tabs +#+begin_src emacs-lisp +(after! centaur-tabs + :ensure t + :config + (setq centaur-tabs-style "bar" + centaur-tabs-set-bar 'left + centaur-tabs-height 32 + centaur-tabs-set-icons t + centaur-tabs-gray-out-icons 'buffer) + (centaur-tabs-headline-match) + (centaur-tabs-mode t) + (centaur-tabs-group-by-projectile-project)) +#+end_src +** SVG Tags +Enable SVG tags in org mode. + +#+begin_src emacs-lisp +(require 'svg-tag-mode) + +(defconst date-re "[0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\}") +(defconst time-re "[0-9]\\{2\\}:[0-9]\\{2\\}") +(defconst day-re "[A-Za-z]\\{3\\}") +(defconst day-time-re (format "\\(%s\\)? ?\\(%s\\)?" day-re time-re)) + +(defun svg-progress-percent (value) + (svg-image (svg-lib-concat + (svg-lib-progress-bar (/ (string-to-number value) 100.0) + nil :margin 0 :stroke 2 :radius 3 :padding 2 :width 11) + (svg-lib-tag (concat value "%") + nil :stroke 0 :margin 0)) :ascent 'center)) + +(defun svg-progress-count (value) + (let* ((seq (mapcar #'string-to-number (split-string value "/"))) + (count (float (car seq))) + (total (float (cadr seq)))) + (svg-image (svg-lib-concat + (svg-lib-progress-bar (/ count total) nil + :margin 0 :stroke 2 :radius 3 :padding 2 :width 11) + (svg-lib-tag value nil + :stroke 0 :margin 0)) :ascent 'center))) + +(setq svg-tag-tags + `( + ;; Org tags :TAG1:TAG2:TAG3: + (":\\([A-Za-z0-9]+\\)" . ((lambda (tag) (svg-tag-make tag)))) + (":\\([A-Za-z0-9]+[ \-]\\)" . ((lambda (tag) tag))) + + ;; Task priority [#A] [#B] [#C] + ("\\[#[A-Z]\\]" . ( (lambda (tag) + (svg-tag-make tag :face 'org-priority + :beg 2 :end -1 :margin 0)))) + + ;; Progress [1/3] + ("\\(\\[[0-9]\\{1,3\\}%\\]\\)" . ((lambda (tag) + (svg-progress-percent (substring tag 1 -2))))) + ("\\(\\[[0-9]+/[0-9]+\\]\\)" . ((lambda (tag) + (svg-progress-count (substring tag 1 -1))))) + + ;; TODO / DONE + ("TODO" . ((lambda (tag) (svg-tag-make "TODO" :face 'org-todo :inverse t :margin 0)))) + ("DONE" . ((lambda (tag) (svg-tag-make "DONE" :face 'org-done :margin 0)))) + + ;; Citation of the form [cite:@Knuth:1984] + ("\\(\\[cite:@[A-Za-z]+:\\)" . ((lambda (tag) + (svg-tag-make tag + :inverse t + :beg 7 :end -1 + :crop-right t)))) + ("\\[cite:@[A-Za-z]+:\\([0-9]+\\]\\)" . ((lambda (tag) + (svg-tag-make tag + :end -1 + :crop-left t)))) + + + ;; Active date (with or without day name, with or without time) <2021-12-24 Fri 14:00> + (,(format "\\(<%s>\\)" date-re) . + ((lambda (tag) + (svg-tag-make tag :beg 1 :end -1 :margin 0)))) + (,(format "\\(<%s \\)%s>" date-re day-time-re) . + ((lambda (tag) + (svg-tag-make tag :beg 1 :inverse nil :crop-right t :margin 0)))) + (,(format "<%s \\(%s>\\)" date-re day-time-re) . + ((lambda (tag) + (svg-tag-make tag :end -1 :inverse t :crop-left t :margin 0)))) + + ;; Inactive date (with or without day name, with or without time) [2021-12-24 Fri 14:00] + (,(format "\\(\\[%s\\]\\)" date-re) . + ((lambda (tag) + (svg-tag-make tag :beg 1 :end -1 :margin 0 :face 'org-date)))) + (,(format "\\(\\[%s \\)%s\\]" date-re day-time-re) . + ((lambda (tag) + (svg-tag-make tag :beg 1 :inverse nil :crop-right t :margin 0 :face 'org-date)))) + (,(format "\\[%s \\(%s\\]\\)" date-re day-time-re) . + ((lambda (tag) + (svg-tag-make tag :end -1 :inverse t :crop-left t :margin 0 :face 'org-date)))))) + +(add-hook! 'org-mode-hook '(svg-tag-mode t)) +#+end_src + +* Programming +** LSP +#+begin_src emacs-lisp +(setq lsp-enable-symbol-highlighting t + lsp-ui-doc-enable t + lsp-lens-enable t + lsp-headerline-breadcrumb-enable t + lsp-modeline-code-actions-enable t + lsp-diagnostics-provider :flycheck + lsp-ui-sideline-enable t + lsp-completion-show-detail t + lsp-completion-show-kind t) +#+end_src + +** Company +#+begin_src emacs-lisp +(add-hook 'after-init-hook 'global-company-mode) +;; from modules/completion/company/config.el +(use-package! company + :commands (company-mode global-company-mode company-complete + company-complete-common company-manual-begin company-grab-line) + :config + (setq company-idle-delay 0.3 + company-tooltip-limit 10 + company-dabbrev-downcase nil + company-dabbrev-ignore-case nil) + [...]) +#+end_src + +** Languages +*** LaTeX +#+begin_src emacs-lisp +(require 'org) +(add-to-list 'org-latex-packages-alist '("" "amsmath" t)) +(add-to-list 'org-latex-packages-alist '("" "amssymb" t)) +(setq org-preview-latex-default-process 'dvipng) +#+end_src + +*** Emacs Lisp +Set elisp evaluate keybindings. + +#+begin_src emacs-lisp +(map! :leader + (:prefix ("e" . "evaluate") + :desc "Evaluate elisp in buffer" + "b" #'eval-buffer + :desc "Evaluate defun" + "d" #'eval-defun + :desc "Evaluate elisp expression" + "e" #'eval-expression + :desc "Evaluate last sexpression" + "l" #'eval-last-sexp + :desc "Evaluate elisp in region" + "r" #'eval-region)) +#+end_src + +*** Java +Enable LSP mode for java. + +#+begin_src emacs-lisp +(after! lsp-mode (require 'lsp-java)) +#+end_src + +Configure LSP java. + +#+begin_src emacs-lisp +(after! lsp-java + (add-hook 'java-mode-hook #'lsp) + (add-hook 'java-mode-hook + (lambda () + (setq c-basic-offset 4 + tab-width 4 + indent-tabs-mode nil)))) + +(setq lsp-java-format-on-type-enabled nil + lsp-java-format-enabled nil) +;; Set path to the language server executable +;; (set-lsp-priority! 'eclipse-jdt .80) +;; (setq lsp-java-server-install-dir "/bin/jdtls") +;; (setq lsp-java-workspace-dir "~/Projects/java") +#+end_src + +Display ansi colour codes in java output. + +#+begin_src emacs-lisp +(after! text-mode + (add-hook! 'text-mode-hook + (unless (derived-mode-p 'org-mode) + (with-silent-modifications + (ansi-color-apply-on-region (point-min) (point-max) t))))) +#+end_src +* Spotify +Enable smudge. + +#+begin_src emacs-lisp +(require 'smudge) +(load! "spotify-credentials.el") +(setq smudge-status-location 'modeline) +#+end_src + +Keybindings + +#+begin_src emacs-lisp +(map! :leader + (:prefix ("m" . "music") + :desc "Toggle shuffle" + "s" #'smudge-controller-toggle-shuffle + :desc "Toggle repeat" + "r" #'smudge-controller-toggle-repeat + :desc "Play/pause" + "SPC" #'smudge-controller-toggle-play + :desc "Next track" + "f" #'smudge-controller-next-track + :desc "Previous track" + "b" #'smudge-controller-previous-track + :desc "My playlists" + "m" #'smudge-my-playlists + :desc "Select playback device" + "d" #'smudge-select-device)) +#+end_src + +Playlist keybindings. + +#+begin_src emacs-lisp +(map! :leader + (:prefix ("m p" . "playlists") + :desc "Featured playlists" + "f" #'smudge-featured-playlists + :desc "Search playlists" + "s" #'smudge-playlist-search + :desc "Show user's playlists" + "u" #'smudge-user-playlists + :desc "Create new playlist" + "c" #'smudge-create-playlist)) +#+end_src + +Track keybindings. + +#+begin_src emacs-lisp +(map! :leader + (:prefix ("m t" . "tracks") + :desc "List recently played tracks" + "r" #'smudge-recently-played + :desc "Search for trakcs" + "s" #'smudge-track-search)) +#+end_src + +Volume keybindings. + +#+begin_src emacs-lisp +(map! :leader + (:prefix ("m v" . "volume") + :desc "Increase volume" + "u" #'smudge-controller-volume-up + :desc "Decrease volume" + "d" #'smudge-controller-volume-down + :desc "Toggle mute" + "m" #'smudge-controller-voume-mute-unmute)) +#+end_src + +* Evil Mode +Raise undo limit to 80mb. + +#+begin_src emacs-lisp +(setq undo-limit 80000000) +#+end_src + +Grandular changes when in insert mode + +#+begin_src emacs-lisp +(setq evil-want-fine-undo t) +#+end_src + +* Org +** Org Mode +*** View +#+begin_src emacs-lisp +(setq org-directory "~/Org" + org-use-property-inheritance t ; fix weird issue with src blocks + org-startup-with-inline-images t + org-startup-with-latex-preview t) +#+end_src + +*** Org Agenda +#+begin_src emacs-lisp +(after! org + (setq org-agenda-files + '("~/Org/" "~/Documents/Org/agenda.org"))) +#+end_src + +*** Ansi Colour Codes +Display ansi colour codes in org babel results. + +#+begin_src emacs-lisp +(defun my/babel-ansi () + (when-let ((beg (org-babel-where-is-src-block-result nil nil))) + (save-excursion + (goto-char beg) + (when (looking-at org-babel-result-regexp) + (let ((end (org-babel-result-end)) + (ansi-color-context-region nil)) + (ansi-color-apply-on-region beg end)))))) +(add-hook 'org-babel-after-execute-hook 'my/babel-ansi) +#+end_src + +** Org Roam +*** Roam Directories +#+begin_src emacs-lisp +(setq org-roam-directory "~/RoamNotes" + org-attach-id-dir "attachments/") +#+end_src + +*** Roam UI +#+begin_src emacs-lisp +(use-package! websocket + :after org-roam) + +(use-package! org-roam-ui + :after org-roam ;; or :after org + ;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have + ;; a hookable mode anymore, you're advised to pick something yourself + ;; if you don't care about startup time, use + ;; :hook (after-init . org-roam-ui-mode) + :config + (setq org-roam-ui-sync-theme t + org-roam-ui-follow t + org-roam-ui-update-on-save t + org-roam-ui-open-on-start t)) + +(setq org-roam-database-connector 'sqlite3) +#+end_src diff --git a/.config/doom/custom.el b/.config/doom/custom.el @@ -0,0 +1,15 @@ +(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. + '(custom-safe-themes + '("7a424478cb77a96af2c0f50cfb4e2a88647b3ccca225f8c650ed45b7f50d9525" "0c860c4fe9df8cff6484c54d2ae263f19d935e4ff57019999edbda9c7eda50b8" default)) + '(package-selected-packages '(emacsql-sqlite))) +(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. + '(font-lock-comment-face ((t (:slant italic)))) + '(font-lock-keyword-face ((t (:slant italic))))) diff --git a/.config/doom/init.el b/.config/doom/init.el @@ -226,7 +226,7 @@ ;;twitter ; twitter client https://twitter.com/vnought :config - ;;literate + literate (default +bindings +smartparens)) diff --git a/.config/doom/packages.el b/.config/doom/packages.el @@ -64,6 +64,7 @@ ;; (package! good-scroll) (package! svg-lib) (package! svg-tag-mode) +(package! info-colors) ;; CODE (package! company-lsp)