diff options
| author | cashmere <cashmere@autistici.org> | 2025-10-29 22:02:06 +0100 |
|---|---|---|
| committer | cashmere <cashmere@autistici.org> | 2025-10-29 22:02:06 +0100 |
| commit | 93a59bb2570b15ada9f0389c6bba8e80f8e350bd (patch) | |
| tree | 5442e4697148760a53bb45534453528e2df64728 | |
| parent | f6eaffedacb5d3d845723ed2fdd0192bed544d99 (diff) | |
| download | emacs-93a59bb2570b15ada9f0389c6bba8e80f8e350bd.tar.gz | |
sync
| -rw-r--r-- | config.el | 1550 | ||||
| -rw-r--r-- | config.org | 1107 |
2 files changed, 1680 insertions, 977 deletions
@@ -24,8 +24,6 @@ (setq kept-new-versions 5) (setq kept-old-versions 5) -;;; EMACS -;; This is biggest one. Keep going, plugins (oops, I mean packages) will be shorter :) (use-package emacs :straight nil :ensure nil @@ -76,7 +74,7 @@ ;; Configure font settings based on the operating system. ;; Ok, this kickstart is meant to be used on the terminal, not on GUI. ;; But without this, I fear you could start Graphical Emacs and be sad :( - (set-face-attribute 'default nil :family "MonoLisa" :height 150) + ;; (set-face-attribute 'default nil :family "Maple Mono NF" :height 150) ;; (when (eq system-type 'darwin) ;; Check if the system is macOS. ;; (setq mac-command-modifier 'meta) ;; Set the Command key to act as the Meta key. ;; (set-face-attribute 'default nil :family "Fragment Mono" :height 130)) @@ -93,12 +91,13 @@ :init ;; Initialization settings that apply before the package is loaded. (tool-bar-mode -1) + (menu-bar-mode -1) (scroll-bar-mode -1) (add-to-list 'default-frame-alist '(vertical-scroll-bars . nil)) (add-to-list 'default-frame-alist '(horizontal-scroll-bars . nil)) - (set-frame-parameter (selected-frame) 'alpha-background 60) - (add-to-list 'default-frame-alist '(alpha-background . 60)) + (set-frame-parameter (selected-frame) 'alpha-background 80) + (add-to-list 'default-frame-alist '(alpha-background . 80)) (global-hl-line-mode -1) ;; Disable highlight of the current line (global-auto-revert-mode 1) ;; Enable global auto-revert mode to keep buffers up to date with their corresponding files. (indent-tabs-mode -1) ;; Disable the use of tabs for indentation (use spaces instead). @@ -129,53 +128,43 @@ (length (hash-table-keys straight--recipe-cache)))))))) (defcustom ek-use-nerd-fonts t - "Configuration for using Nerd Fonts Symbols." - :type 'boolean - :group 'appearance) + "Configuration for using Nerd Fonts Symbols." + :type 'boolean + :group 'appearance) -;;; WINDOW -;; This section configures window management in Emacs, enhancing the way buffers -;; are displayed for a more efficient workflow. The `window' use-package helps -;; streamline how various buffers are shown, especially those related to help, -;; diagnostics, and completion. -;; -;; Note: I have left some commented-out code below that may facilitate your -;; Emacs journey later on. These configurations can be useful for displaying -;; other types of buffers in side windows, allowing for a more organized workspace. - (use-package window - :straight nil - :ensure nil ;; This is built-in, no need to fetch it. - :custom - (display-buffer-alist - '( - ;; ("\\*.*e?shell\\*" - ;; (display-buffer-in-side-window) - ;; (window-height . 0.25) - ;; (side . bottom) - ;; (slot . -1)) +(use-package window + :straight nil + :ensure nil ;; This is built-in, no need to fetch it. + :custom + (display-buffer-alist + '( + ;; ("\\*.*e?shell\\*" + ;; (display-buffer-in-side-window) + ;; (window-height . 0.25) + ;; (side . bottom) + ;; (slot . -1)) - ("\\*\\(Backtrace\\|Warnings\\|Compile-Log\\|[Hh]elp\\|Messages\\|Bookmark List\\|Ibuffer\\|Occur\\|eldoc.*\\)\\*" - (display-buffer-in-side-window) - (window-height . 0.25) - (side . bottom) - (slot . 0)) + ("\\*\\(Backtrace\\|Warnings\\|Compile-Log\\|[Hh]elp\\|Messages\\|Bookmark List\\|Occur\\|eldoc.*\\)\\*" + (display-buffer-in-side-window) + (window-height . 0.25) + (side . bottom) + (slot . 0)) - ;; Example configuration for the LSP help buffer, - ;; keeps it always on bottom using 25% of the available space: - ("\\*\\(lsp-help\\)\\*" - (display-buffer-in-side-window) - (window-height . 0.25) - (side . bottom) - (slot . 0)) + ;; Example configuration for the LSP help buffer, + ;; keeps it always on bottom using 25% of the available space: + ("\\*\\(lsp-help\\)\\*" + (display-buffer-in-side-window) + (window-height . 0.25) + (side . bottom) + (slot . 0)) - ;; Configuration for displaying various diagnostic buffers on - ;; bottom 25%: - ("\\*\\(Flymake diagnostics\\|xref\\|ivy\\|Swiper\\|Completions\\)" - (display-buffer-in-side-window) - (window-height . 0.25) - (side . bottom) - (slot . 1)) - ))) + ;; Configuration for displaying various diagnostic buffers on + ;; bottom 25%: + ("\\*\\(Flymake diagnostics\\|xref\\|ivy\\|Swiper\\|Completions\\)" + (display-buffer-in-side-window) + (window-height . 0.25) + (side . bottom) + (slot . 1))))) (use-package dired :straight nil @@ -185,29 +174,24 @@ (dired-dwim-target t) (dired-guess-shell-alist-user '(("\\.\\(png\\|jpe?g\\|tiff\\)" "feh" "xdg-open" "open") - ("\\.\\(mp[34]\\|m4a\\|ogg\\|flac\\|webm\\|mkv\\)" "mpv" "xdg-open" "open") - (".*" "open" "xdg-open"))) + ("\\.\\(mp[34]\\|m4a\\|ogg\\|flac\\|webm\\|mkv\\)" "mpv" "xdg-open" "open") + (".*" "open" "xdg-open"))) (dired-kill-when-opening-new-dired-buffer t) :config ;; (dired-async-mode 1) (when (eq system-type 'darwin) - (let ((gls (executable-find "gls"))) - (when gls - (setq insert-directory-program gls))))) - -(use-package async - :ensure t - :defer t) - + (let ((gls (executable-find "gls"))) + (when gls + (setq insert-directory-program gls))))) (use-package erc -:straight nil - :defer t ;; Load ERC when needed rather than at startup. (Load it with `M-x erc RET') - :custom - (erc-join-buffer 'window) ;; Open a new window for joining channels. - (erc-hide-list '("JOIN" "PART" "QUIT")) ;; Hide messages for joins, parts, and quits to reduce clutter. - (erc-timestamp-format "[%H:%M]") ;; Format for timestamps in messages. - (erc-autojoin-channels-alist '((".*\\.libera\\.chat" "#emacs"))));; Automatically join the #emacs channel on Libera.Chat. + :straight nil + :defer t ;; Load ERC when needed rather than at startup. (Load it with `M-x erc RET') + :custom + (erc-join-buffer 'window) ;; Open a new window for joining channels. + (erc-hide-list '("JOIN" "PART" "QUIT")) ;; Hide messages for joins, parts, and quits to reduce clutter. + (erc-timestamp-format "[%H:%M]") ;; Format for timestamps in messages. + (erc-autojoin-channels-alist '((".*\\.libera\\.chat" "#emacs"))));; Automatically join the #emacs channel on Libera.Chat. (defvar my/centered-cursor-enabled nil) @@ -230,15 +214,15 @@ (message "centered-cursor on")))) (use-package isearch -:straight nil - :ensure nil ;; This is built-in, no need to fetch it. - :config - (setq isearch-lazy-count t) ;; Enable lazy counting to show current match information. - (setq lazy-count-prefix-format "(%s/%s) ") ;; Format for displaying current match count. - (setq lazy-count-suffix-format nil) ;; Disable suffix formatting for match count. - (setq search-whitespace-regexp ".*?") ;; Allow searching across whitespace. - :bind (("C-s" . isearch-forward) ;; Bind C-s to forward isearch. - ("C-r" . isearch-backward))) ;; Bind C-r to backward isearch. + :straight nil + :ensure nil ;; This is built-in, no need to fetch it. + :config + (setq isearch-lazy-count t) ;; Enable lazy counting to show current match information. + (setq lazy-count-prefix-format "(%s/%s) ") ;; Format for displaying current match count. + (setq lazy-count-suffix-format nil) ;; Disable suffix formatting for match count. + (setq search-whitespace-regexp ".*?") ;; Allow searching across whitespace. + :bind (("C-s" . isearch-forward) ;; Bind C-s to forward isearch. + ("C-r" . isearch-backward))) ;; Bind C-r to backward isearch. (use-package vc :straight nil @@ -252,43 +236,43 @@ :config ;; Better colors for <leader> g b (blame file) (setq vc-annotate-color-map - '((20 . "#f5e0dc") - (40 . "#f2cdcd") - (60 . "#f5c2e7") - (80 . "#cba6f7") - (100 . "#f38ba8") - (120 . "#eba0ac") - (140 . "#fab387") - (160 . "#f9e2af") - (180 . "#a6e3a1") - (200 . "#94e2d5") - (220 . "#89dceb") - (240 . "#74c7ec") - (260 . "#89b4fa") - (280 . "#b4befe")))) + '((20 . "#f5e0dc") + (40 . "#f2cdcd") + (60 . "#f5c2e7") + (80 . "#cba6f7") + (100 . "#f38ba8") + (120 . "#eba0ac") + (140 . "#fab387") + (160 . "#f9e2af") + (180 . "#a6e3a1") + (200 . "#94e2d5") + (220 . "#89dceb") + (240 . "#74c7ec") + (260 . "#89b4fa") + (280 . "#b4befe")))) (use-package smerge-mode -:straight nil - :ensure nil ;; This is built-in, no need to fetch it. - :defer t - :bind (:map smerge-mode-map -("C-c ^ u" . smerge-keep-upper) ;; Keep the changes from the upper version. -("C-c ^ l" . smerge-keep-lower) ;; Keep the changes from the lower version. -("C-c ^ n" . smerge-next) ;; Move to the next conflict. -("C-c ^ p" . smerge-previous))) ;; Move to the previous conflict. + :straight nil + :ensure nil ;; This is built-in, no need to fetch it. + :defer t + :bind (:map smerge-mode-map + ("C-c ^ u" . smerge-keep-upper) ;; Keep the changes from the upper version. + ("C-c ^ l" . smerge-keep-lower) ;; Keep the changes from the lower version. + ("C-c ^ n" . smerge-next) ;; Move to the next conflict. + ("C-c ^ p" . smerge-previous))) ;; Move to the previous conflict. (use-package eldoc -:straight nil - :ensure nil ;; This is built-in, no need to fetch it. - :after lspce-mode - :config - (setq eldoc-idle-delay 0.001) ;; Automatically fetch doc help - (setq eldoc-echo-area-use-multiline-p t) ;; We use the "K" floating help instead -;; set to t if you want docs on the echo area -(setq eldoc-help-at-pt t) -(setq eldoc-echo-area-display-truncation-message nil) - :init - (global-eldoc-mode)) + :straight nil + :ensure nil ;; This is built-in, no need to fetch it. + :after lspce-mode + :config + (setq eldoc-idle-delay 0.001) ;; Automatically fetch doc help + (setq eldoc-echo-area-use-multiline-p t) ;; We use the "K" floating help instead + ;; set to t if you want docs on the echo area + (setq eldoc-help-at-pt t) + (setq eldoc-echo-area-display-truncation-message nil) + :init + (global-eldoc-mode)) (use-package eldoc-box :ensure t @@ -303,18 +287,27 @@ (use-package flymake :straight nil - :ensure nil ;; This is built-in, no need to fetch it. - :defer t - :hook (prog-mode . flymake-mode) - :custom - (flymake-margin-indicators-string - '((error "!»" compilation-error) (warning "»" compilation-warning) -(note "»" compilation-info)))) + :ensure nil ;; This is built-in, no need to fetch it. + :defer t + ;; :hook (prog-mode . flymake-mode) + :custom + (flymake-margin-indicators-string + '((error "!»" compilation-error) (warning "»" compilation-warning) + (note "»" compilation-info)))) (setq trusted-content '("~/.emacs.d/config.el" "~/.emacs.d/init.el")) +(use-package flycheck + :ensure t + :config + (add-hook 'after-init-hook #'global-flycheck-mode)) + +(use-package flycheck-rust + :ensure t + :hook (flycheck-mode . flycheck-rust-setup)) + (use-package xref :straight nil :ensure nil) @@ -323,10 +316,10 @@ :straight nil :ensure nil) +(setq org-directory "~/org/") (use-package org :straight nil :ensure nil - :defer t :config (require 'org-tempo) @@ -380,9 +373,15 @@ org-appear-autolinks t ;; Show links org-appear-autosubmarkers t)) ;; Show sub- and superscripts +(setq org-agenda-inhibit-startup t + org-agenda-use-tag-inheritance nil + org-agenda-dim-blocked-tasks nil + org-startup-indented nil + org-startup-folded 'overview) + (use-package org-modern - :ensure t - ) + :ensure t) + (with-eval-after-load 'org (global-org-modern-mode)) (setq org-modern-star 'fold) @@ -390,92 +389,330 @@ (setq org-modern-star 'replace) (setq org-modern-replace-stars "◉○◉○◉") -(setq org-agenda-start-on-weekday nil - org-agenda-block-separator nil - org-agenda-remove-tags t) +;; (setq org-agenda-start-on-weekday nil +;; org-agenda-block-separator nil +;; org-agenda-remove-tags t) + +;; (setq org-agenda-skip-scheduled-if-done t +;; org-agenda-skip-deadline-if-done t +;; org-agenda-include-deadlines t +;; org-agenda-block-separator nil +;; org-agenda-compact-blocks t +;; org-agenda-start-day nil +;; org-agenda-span 1 +;; org-agenda-start-on-weekday nil +;; org-agenda-hide-tags-regexp "task" +;; org-agenda-prefix-format +;; '((agenda . " %i %?-12t% s") +;; (todo . " %i ") +;; (tags . " %i ") +;; (search . " %i "))) + +(use-package yequake + :custom + (yequake-frames + '(("org-capture" + (buffer-fns . (yequake-org-capture)) + (width . 0.75) + (height . 0.5) + ;; (alpha . 0.95) + (frame-parameters . ((undecorated . t) + (skip-taskbar . t) + (sticky . t))))))) + +(defun my/org-capture-denote-deadline () + (let* ((context (read-string "Task with deadline: ")) + (deadline (org-read-date t nil nil "Deadline: ")) + (file-name (denote nil '("task")))) + (find-file file-name) + (goto-char (point-min)) + (forward-line 4) + (insert (format "* %s\nDEADLINE: <%s>\n\n" context deadline)) + (current-buffer))) + +(defun my/org-capture-denote-scheduled () + (let* ((context (read-string "Scheduled task: ")) + (schedule (org-read-date t nil nil "Schedule: ")) + (file-name (denote nil '("task")))) + (find-file file-name) + (goto-char (point-min)) + (forward-line 4) + (insert (format "* %s\nSCHEDULED: <%s>\n\n" context schedule)) + (current-buffer))) + +(defun my/org-capture-denote-task () + (let* ((context (read-string "Task: ")) + (todo-state (completing-read "TODO state: " + '("ACTIVE" "NEXT" "TODO" "WAIT" "PLAN" "FUN"))) + (file-name (denote nil '("task")))) + (find-file file-name) + (goto-char (point-min)) + (forward-line 4) + (insert (format "\n* %s %s\n\n" todo-state context)) + (point))) + +(with-eval-after-load 'org + (setq org-capture-templates + '(("t" "Task" plain + (function my/org-capture-denote-task) + "" :immediate-finish t :jump-to-captured t) + ("d" "Deadline" plain + (function my/org-capture-denote-deadline) + "" :immediate-finish t :jump-to-captured t) + ("s" "Scheduled" plain + (function my/org-capture-denote-scheduled) + "" :immediate-finish t :jump-to-captured t)))) + +(setq org-agenda-span 'day) (use-package org-super-agenda :after org-agenda :init - (setq org-agenda-skip-scheduled-if-done t - org-agenda-skip-deadline-if-done t - org-agenda-include-deadlines t - org-agenda-block-separator nil - org-agenda-compact-blocks t - org-agenda-start-day nil - org-agenda-span 1 - org-agenda-start-on-weekday nil - org-agenda-hide-tags-regexp "task" - org-agenda-prefix-format - '((agenda . " %i %?-12t% s") - (todo . " %i ") - (tags . " %i ") - (search . " %i "))) - (setq org-agenda-custom-commands - '(("c" "Super view" - ((agenda "" ((org-agenda-overriding-header "") - (org-super-agenda-groups - '((:name "Today" - :time-grid t - :date t - :deadline today - :scheduled future - :order 1))))) - (alltodo "" ((org-agenda-overriding-header "") - (org-super-agenda-groups - '((:discard (:todo "FUN")) ; <- HIER ist die korrekte Position - (:log t) - (:name "ACTIVE" - :todo "ACTIVE") - (:name "NEXT" - :todo "NEXT") - (:name "TODO" - :todo "TODO") - (:name "WAIT" - :todo "WAIT")))))) - ((org-agenda-exporter-settings - '((ps-number-of-columns 2) - (ps-landscape-mode t) - (org-agenda-add-entry-text-maxlines 5) - (htmlize-output-type 'css))))))) :config (org-super-agenda-mode)) +(use-package org-ql + :ensure t + :after org-super-agenda + :config + (setq org-agenda-custom-commands + '(("w" "Weekly Overview" + ((org-ql-block '(and (or (deadline auto) + (scheduled :to 7)) + (not (done)) + (not (habit))) + ((org-ql-block-header "Weekly Tasks") + (org-super-agenda-groups + '((:name "Deadlines" + :deadline t + :order 1) + (:name "Schedule" + :scheduled t + :order 2) + (:discard (:anything t)))))) + (org-ql-block '(and (ts-active :from today :to 7 :with-time t) + (not (done)) + (not (habit))) + ((org-ql-block-header "Appointments") + (org-super-agenda-groups + '((:name "This Week" + :anything t + :order 1))))) + (org-ql-block '(and (habit) + (not (done))) + ((org-ql-block-header "Habits") + (org-super-agenda-groups + '((:name "Daily Habits" + :habit t + :order 1) + (:discard (:anything t))))))))))) + (setq org-todo-keywords - '((sequence "WAIT(w@/!)" "HABIT(h)" "TODO(t)" "NEXT(n)" "|" "DONE(d!)") - (sequence "BACKLOG(b)" "PLAN(p)" "READY(r)" "ACTIVE(a)" "REVIEW(v)" - "FUN(f)" "|" "COMPLETED(c)" "CANC(k@)"))) + '((sequence "WAIT(w@/!)" "HABIT(h)" "TODO(t)" "NEXT(n)" "|" "DONE(d!)") + (sequence "BACKLOG(b)" "PLAN(p)" "READY(r)" "ACTIVE(a)" "REVIEW(v)" + "FUN(f)" "|" "COMPLETED(c)" "CANC(k@)"))) (use-package ox-typst :straight (:host github :repo "jmpunkt/ox-typst") :after org) +(use-package org-cliplink + :ensure t + :defer t) + +(use-package org-download + :ensure t + :hook (org-mode . org-download-enable) + :config + (setq-default org-download-image-dir "~/org/attachments/") + (setq org-download-method 'directory) + (setq org-download-timestamp "%Y%m%d-%H%M%S_") + (setq org-download-heading-lvl nil)) + +(setq org-publish-project-alist + '(("wiki" + :author "cashmere" + :email "cashmere@cashmere.rs" + :preserve-breaks t + :preserve-indent t + :with-title t + :base-directory "/home/cashmere/wiki/" + :base-extension "org" + :publishing-directory "/home/cashmere/wiki/html/" + :recursive t + :publishing-function org-html-publish-to-html + :with-toc nil + :section-numbers nil + :html-head "<link rel=\"stylesheet\" href=\"/style.css\" type=\"text/css\"/>" + :preparation-function (lambda (_) + (require 'denote-org) + (dolist (file (directory-files-recursively + "/home/cashmere/wiki/" "\\.org$")) + (with-current-buffer (find-file-noselect file) + (ignore-errors + (denote-org-extras-convert-links-to-file-type)) + (save-buffer))))))) + +(setq org-export-with-broken-links t) + (use-package denote - :ensure t - :hook (dired-mode . denote-dired-mode) - :config - (setq denote-rename-buffer-mode 1 -denote-directory (expand-file-name "~/org/"))) + :ensure t + :hook (dired-mode . denote-dired-mode) + :config + (setq denote-rename-buffer-mode 1 + denote-directory (expand-file-name "~/org/"))) (use-package denote-agenda :ensure t + :after org :config (setq denote-agenda-include-regexp "task") (denote-agenda-insinuate)) +(defcustom my/denote-task-filename-component-regexp + "\\(?:[-_.]\\|:\\)task\\(?:[-_.]\\|:\\|$\\)" + "Regexp matching a filename component that denotes the 'task' tag. +Works on the base filename (without extension), e.g. matches \"-task\", \":task:\", \"_task_\"." + :type 'string) + +(defun my/denote--make-unique-filename (dir base ext) + "Return a unique filepath in DIR for BASE+EXT by adding -1, -2... if needed." + (let* ((extstr (if (and ext (not (string-empty-p ext))) (concat "." ext) "")) + (candidate (expand-file-name (concat base extstr) dir)) + (count 1)) + (while (file-exists-p candidate) + (setq candidate (expand-file-name (format "%s-%d%s" base count extstr) dir)) + (setq count (1+ count))) + candidate)) + +(defun my/denote-remove-task-filetag-and-silent-rename () + "If current headline became DONE in a Denote note, remove :task: filetag and remove 'task' from filename silently. +- Only acts if there are no other non-DONE TODOs in the same file. +- Does not call Denote's interactive rename command (no buffers opened)." + (when (and (derived-mode-p 'org-mode) + (string= (org-get-todo-state) "DONE") + (buffer-file-name) + ;; detect Denote note by presence of #+identifier: + (save-excursion + (goto-char (point-min)) + (re-search-forward "^#\\+identifier:" nil t))) + ;; only proceed if no other active TODOs remain in the file + (let ((has-other + (catch 'has + (org-map-entries + (lambda () + (let ((s (org-get-todo-state))) + (when (and s (not (string= s "DONE"))) + (throw 'has t)))) + nil 'file) + nil))) + (unless has-other + ;; 1) Remove :task: from #+filetags: + (save-excursion + (goto-char (point-min)) + (when (re-search-forward "^#\\+filetags:\\s-*\\(.*\\)$" nil t) + (let* ((tags (match-string 1)) + (clean (replace-regexp-in-string ":task:" "" tags)) + (clean (replace-regexp-in-string "::+" ":" clean)) + (clean (replace-regexp-in-string "^:\\|:$" "" clean))) + (if (string-empty-p clean) + (delete-region (line-beginning-position) (1+ (line-end-position))) + (beginning-of-line) + (kill-line) + (insert (concat "#+filetags: :" clean ":")))))) + ;; 2) Compute new filename (silent, non-interactive) + (let* ((file (buffer-file-name)) + (dir (file-name-directory file)) + (name (file-name-nondirectory file)) + (ext (file-name-extension name)) ;; "org" + (base (file-name-sans-extension name)) + ;; remove the task component from the base + (new-base (replace-regexp-in-string my/denote-task-filename-component-regexp + "" + base))) + (when (and new-base (not (string= new-base base))) + ;; cleanup repeated separators: convert multiple '-'/'_'/'..' to single '-' + (setq new-base (replace-regexp-in-string "[-_.:]+" + "-" + new-base)) + ;; strip leading/trailing separators + (setq new-base (replace-regexp-in-string "\\`[-_.:-]+" "" new-base)) + (setq new-base (replace-regexp-in-string "[-_.:-]+\\'" "" new-base)) + ;; ensure unique filename to avoid overwrite without prompt + (let ((target (my/denote--make-unique-filename dir new-base ext))) + (condition-case err + (progn + (rename-file file target 1) ;; 1 = ok to overwrite, but we avoid collisions by uniqueness + ;; update current buffer to visit the new filename silently + (set-visited-file-name target t t) + ;; save changes (filetags update + new filename) + (save-buffer) + (message "Denote: removed 'task' component from filename -> %s" (file-name-nondirectory target))) + (error + (message "Denote rename failed: %s" (error-message-string err))))))))))) + +(add-hook 'org-after-todo-state-change-hook #'my/denote-remove-task-filetag-and-silent-rename) + + + (use-package denote-menu :ensure t + :defer t :config (setq denote-menu-title-column-width 40 - denote-menu-show-file-type nil)) + denote-menu-show-file-type nil)) (use-package denote-org :ensure t) -(use-package denote-explore +(use-package consult-denote + :straight (:host github :repo "protesilaos/consult-denote") :ensure t :defer t) +(defun my/convert-all-denote-links-in-directory (directory) + "Converts all denote: links to file: links in a specific directory." + (interactive "DDirectory: ") + (let ((org-files (directory-files directory t "\\.org$"))) + (dolist (file org-files) + (with-current-buffer (find-file-noselect file) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "\\[\\[denote:\\([0-9T]+\\)\\]\\(?:\\[\\([^]]*\\)\\]\\)?\\]" nil t) + (let* ((id (match-string 1)) + (description (match-string 2)) + (target-file (seq-find + (lambda (f) + (string-match-p (regexp-quote id) (file-name-nondirectory f))) + org-files))) + (when target-file + (let* ((target-filename (file-name-nondirectory target-file)) + (new-link (if description + (format "[[file:./%s][%s]]" target-filename description) + (format "[[file:./%s]]" target-filename)))) + (replace-match new-link t t)))))) + (save-buffer) + (kill-buffer))))) + +(defvar my-org-export-output-directory-prefix "./export_") + +(defun my-org-export-create-directory (fn extension &rest args) + (let ((export-dir (format "%s%s" my-org-export-output-directory-prefix extension))) + (unless (file-directory-p export-dir) + (make-directory export-dir))) + (apply fn extension args)) + +(advice-add #'org-export-output-file-name :around #'my-org-export-create-directory) +(setq denote-excluded-directories-regexp "export_.*") + +(use-package ox-json + :ensure t + ) + +(use-package denote-explore + :ensure t + ) + (use-package which-key :ensure t :defer t @@ -485,45 +722,41 @@ denote-directory (expand-file-name "~/org/"))) (which-key-idle-delay 0.3)) (use-package vertico - :ensure t - :straight t - :hook - (after-init . vertico-mode) - :custom - (vertico-count 10) - (vertico-resize nil) - (vertico-cycle nil) - :bind (:map vertico-map - ("C-j" . vertico-next) - ("C-k" . vertico-previous)) - :config - (advice-add #'vertico--format-candidate :around -(lambda (orig cand prefix suffix index _start) -(setq cand (funcall orig cand prefix suffix index _start)) -(concat - (if (= vertico--index index) -(propertize "» " 'face '(:foreground "#80adf0" :weight bold)) - " ") - cand)))) - -;; (use-package vertico-posframe -;; :init -;; (setq vertico-posframe-parameters '((left-fringe . 12) ;; Fringes -;; (right-fringe . 12) -;; (undecorated . nil))) ;; Rounded frame -;; :config -;; (vertico-posframe-mode 1) -;; (setq vertico-posframe-width 96 ;; Narrow frame -;; vertico-posframe-height vertico-count ;; Default height -;; ;; Don't create posframe for these commands -;; vertico-multiform-commands '((consult-line (:not posframe)) -;; (consult-ripgrep (:not posframe))))) + :ensure t + :straight t + :hook + (after-init . vertico-mode) + :custom + (vertico-count 10) + (vertico-resize nil) + (vertico-cycle nil) + :bind (:map vertico-map + ("C-j" . vertico-next) + ("C-k" . vertico-previous)) + :config + (advice-add #'vertico--format-candidate :around + (lambda (orig cand prefix suffix index _start) + (setq cand (funcall orig cand prefix suffix index _start)) + (concat + (if (= vertico--index index) + (propertize "» " 'face '(:foreground "#80adf0" :weight bold)) + " ") + cand)))) -;;; CONSULT -;; Consult provides powerful completion and narrowing commands for Emacs. -;; It integrates well with other completion frameworks like Vertico, enabling -;; features like previews and enhanced register management. It's useful for -;; navigating buffers, files, and xrefs with ease. +(use-package vertico-posframe + :init + (setq vertico-posframe-parameters '((left-fringe . 12) ;; Fringes + (right-fringe . 12) + (accept-focus . t))) + ;; (undecorated . nil) ;; Rounded frame + + :config + (vertico-posframe-mode 1) + (setq vertico-posframe-width 96 ;; Narrow frame + vertico-posframe-height vertico-count ;; Default height + ;; Don't create posframe for these commands + vertico-multiform-commands '((consult-line (:not posframe)) + (consult-ripgrep (:not posframe))))) (use-package consult :ensure t @@ -552,39 +785,13 @@ denote-directory (expand-file-name "~/org/"))) "\\`\\*Native-compile-Log\\*\\'" "\\`\\*Async-native-compile-log\\*\\'"))) -;;; MARKDOWN-MODE -;; Markdown Mode provides support for editing Markdown files in Emacs, -;; enabling features like syntax highlighting, previews, and more. -;; It’s particularly useful for README files, as it can be set -;; to use GitHub Flavored Markdown for enhanced compatibility. (use-package markdown-mode :defer t :straight t :ensure t :mode ("README\\.md\\'" . gfm-mode) ;; Use gfm-mode for README.md files. - :init (setq markdown-command "multimarkdown")) ;; Set the Markdown processing command. - -;; (use-package corfu -;; :ensure t -;; :straight t -;; :defer t -;; :custom -;; (corfu-auto t) ;; Only completes when hitting TAB -;; (corfu-cycle t) -;; (text-mode-ispell-word-completion nil) -;; (corfu-auto-delay 0.08) ;; Delay before popup (enable if corfu-auto is t) -;; (corfu-auto-prefix 1) ;; Trigger completion after typing 1 character -;; (corfu-quit-no-match t) ;; Quit popup if no match -;; (corfu-scroll-margin 5) ;; Margin when scrolling completions -;; (corfu-max-width 50) ;; Maximum width of completion popup -;; (corfu-min-width 50) ;; Minimum width of completion popup -;; (corfu-popupinfo-delay 0.12) ;; Delay before showing documentation popup -;; :config -;; (if ek-use-nerd-fonts -;; (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) -;; :init -;; (global-corfu-mode) -;; (corfu-popupinfo-mode t)) + :init + (setq markdown-command "multimarkdown")) ;; Set the Markdown processing command. (use-package treesit-auto :ensure t @@ -596,30 +803,11 @@ denote-directory (expand-file-name "~/org/"))) (treesit-auto-add-to-auto-mode-alist 'all) (global-treesit-auto-mode t)) -;;; EMBARK -;; Embark provides a powerful contextual action menu for Emacs, allowing -;; you to perform various operations on completion candidates and other items. -;; It extends the capabilities of completion frameworks by offering direct -;; actions on the candidates. -;; Just `<leader> .' over any text, explore it :) (use-package embark :ensure t :straight t :defer t) - -;;; NERD-ICONS-CORFU -;; Provides Nerd Icons to be used with CORFU. -;; (use-package nerd-icons-corfu -;; :if ek-use-nerd-fonts -;; :ensure t -;; :straight t -;; :defer t -;; :after (:all corfu)) - -;;; EMBARK-CONSULT -;; Embark-Consult provides a bridge between Embark and Consult, ensuring -;; that Consult commands, like previews, are available when using Embark. (use-package embark-consult :ensure t :straight t @@ -636,24 +824,12 @@ denote-directory (expand-file-name "~/org/"))) completion-category-defaults nil ;; Clear default category settings. completion-category-overrides '((file (styles partial-completion))))) ;; Customize file completion styles. -;; Marginalia enhances the completion experience in Emacs by adding -;; additional context to the completion candidates. This includes -;; helpful annotations such as documentation and other relevant -;; information, making it easier to choose the right option. (use-package marginalia :ensure t :straight t :hook (after-init . marginalia-mode)) -;; (use-package nerd-icons-corfu -;; :if ek-use-nerd-fonts -;; :ensure t -;; :straight t -;; :defer t -;; :after (:all corfu)) - - (use-package typst-ts-mode :straight t :mode "\\.typ\\'" @@ -665,14 +841,6 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi ;; `(typst-ts-mode . ,(eglot-alternatives '("tinymist" "typst-lsp"))))) ) -;; (use-package rustic -;; :ensure t -;; :defer t -;; ;; :custom -;; ;; (rustic-lsp-client 'eglot) -;; ) - - (use-package f :ensure t) @@ -685,6 +853,17 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :ensure t :after yasnippet) +(straight-use-package + `(lspce :type git :host github :repo "zbelial/lspce" + :files (:defaults ,(pcase system-type + ('gnu/linux "lspce-module.so") + ('darwin "lspce-module.dylib"))) + :pre-build ,(pcase system-type + ('gnu/linux '(("cargo" "build" "--release") + ("cp" "./target/release/liblspce_module.so" "./lspce-module.so"))) + ('darwin '(("cargo" "build" "--release") + ("cp" "./target/release/liblspce_module.dylib" "./lspce-module.dylib")))))) + (use-package company :straight t :hook (after-init . global-company-mode) @@ -705,65 +884,60 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (setq company-require-match nil) (setq company-backends '((company-capf :with company-yasnippet) company-files - company-dabbrev-code)) + company-dabbrev-code + )) (setq company-dabbrev-code-everywhere t) (setq company-dabbrev-code-ignore-case t)) -(defun lspce-nixd-initializationOptions () - (let ((flake-path "/home/cashmere/nix") - (config-name "x12")) - `(:nixpkgs (:expr ,(format "import (builtins.getFlake \"%s\").inputs.nixpkgs { }" flake-path)) - :formatting (:command ["nixfmt"]) - :options (:nixos (:expr ,(format "(builtins.getFlake \"%s\").nixosConfigurations.%s.options" flake-path config-name)) - :home-manager (:expr ,(format "(builtins.getFlake \"%s\").nixosConfigurations.%s.config.home-manager.users.cashmere.options" flake-path config-name)))))) - -(use-package envrc - :ensure t - :config - (envrc-global-mode)) - - -(straight-use-package - `(lspce :type git :host github :repo "zbelial/lspce" - :files (:defaults ,(pcase system-type - ('gnu/linux "lspce-module.so") - ('darwin "lspce-module.dylib"))) - :pre-build ,(pcase system-type - ('gnu/linux '(("cargo" "build" "--release") - ("cp" "./target/release/liblspce_module.so" "./lspce-module.so"))) - ('darwin '(("cargo" "build" "--release") - ("cp" "./target/release/liblspce_module.dylib" "./lspce-module.dylib")))))) - (use-package lspce - :after (f yasnippet markdown-mode envrc) + :ensure nil :config (setq lspce-send-changes-idle-time 0.05) (setq lspce-idle-delay 0.05) (setq lspce-show-log-level-in-modeline t) (setq lspce-enable-eldoc t) (setq lspce-eldoc-enable-hover t) - (setq lspce-eldoc-enable-signature t) + (setq lspce-eldoc-enable-signature nil) + (setq lspce-enable-flymake nil) (setq lspce--doc-max-height 10) - (setq eldoc-echo-area-use-multiline-p 2) + (setq eldoc-echo-area-use-multiline-p 0) (setq eldoc-echo-area-display-truncation-message nil) - (setq lspce-log-level 5) - + (setq lspce-xref-append-implementations-to-definitions t) (setq lspce-envs-pass-to-subprocess '("PATH" "PYTHON_PATH" "NIX_PATH" "NIX_PROFILES")) - (setq lspce-server-programs `(("rust" "rust-analyzer" "" lspce-ra-initializationOptions) - ("python" "pylsp" "" ) + ("python" "pylsp" "" ) ("nix" "nixd" "" lspce-nixd-initializationOptions) ("nushell" "nu" "--lsp" "")))) +(use-package nix-mode + :ensure t + :mode "\\.nix\\'" + :hook (nix-mode . lspce-mode)) + +(defun lspce-nixd-initializationOptions () + (let ((flake-path "/home/cashmere/nix") + (config-name "x12")) + `(:nixpkgs (:expr ,(format "import (builtins.getFlake \"%s\").inputs.nixpkgs { }" flake-path)) + :formatting (:command ["nixfmt"]) + :options (:nixos (:expr ,(format "(builtins.getFlake \"%s\").nixosConfigurations.%s.options" flake-path config-name)) + :home-manager (:expr ,(format "(builtins.getFlake \"%s\").nixosConfigurations.%s.config.home-manager.users.cashmere.options" flake-path config-name)))))) + +(use-package envrc + :ensure t + :config + (envrc-global-mode)) + (use-package python-mode :ensure t :mode "\\.py\\'" - :hook ((python-mode python-ts-mode) . lspce-mode)) + :hook (python-mode . lspce-mode) + ) (use-package flymake-pyrefly :ensure t - :hook (python-base-mode . pyrefly-setup-flymake-backend)) + ;; :hook (python-base-mode . pyrefly-setup-flymake-backend) + ) (use-package python-black :ensure t @@ -775,21 +949,28 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :mode "\\.rs\\'" :hook (rust-mode . lspce-mode)) -(use-package nix-mode - :ensure t - :mode "\\.nix\\'" - :hook (nix-mode . lspce-mode)) +;; (use-package rustic +;; :ensure t +;; :config +;; (setq rustic-format-on-save nil) +;; (setq rustic-lsp-client nil) +;; :custom +;; (rustic-cargo-use-last-stored-arguments t)) (use-package nushell-mode :ensure t :mode "\\.nu\\'" - :hook (nushell-mode . lspce-mode)) + ;; :hook (nushell-mode . lspce-mode) + ) (use-package vterm :ensure t :defer t) (setq vterm-shell "nu") +(use-package multi-vterm + :ensure t + :defer t) (use-package olivetti :ensure t @@ -801,24 +982,30 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :ensure t :hook (find-file . (lambda () - (global-diff-hl-mode) ;; Enable Diff-HL mode for all files. - (diff-hl-flydiff-mode) ;; Automatically refresh diffs. - (diff-hl-margin-mode))) ;; Show diff indicators in the margin. + (global-diff-hl-mode) ;; Enable Diff-HL mode for all files. + (diff-hl-flydiff-mode) ;; Automatically refresh diffs. + (diff-hl-margin-mode))) ;; Show diff indicators in the margin. :custom (diff-hl-side 'left) ;; Set the side for diff indicators. (diff-hl-margin-symbols-alist '((insert . "┃") ;; Customize symbols for each change type. - (delete . "-") - (change . "┃") - (unknown . "┆") - (ignored . "i")))) + (delete . "-") + (change . "┃") + (unknown . "┆") + (ignored . "i")))) (use-package magit :ensure t :straight t :config (if ek-use-nerd-fonts ;; Check if nerd fonts are being used - (setopt magit-format-file-function #'magit-format-file-nerd-icons)) ;; Turns on magit nerd-icons - :defer t) + (setopt magit-format-file-function #'magit-format-file-nerd-icons)) ;; Turns on magit nerd-icons + ) +(defun my/magit-kill-buffers () + "kills all magit buffers" + (interactive) + (let ((buffers (magit-mode-get-buffers))) + (magit-restore-window-configuration) + (mapc #'kill-buffer buffers))) (use-package indent-guide :defer t @@ -853,11 +1040,20 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (setq evil-want-keybinding nil) (setq evil-want-C-u-delete t) (setq evil-want-C-u-scroll t) - (setq evil-undo-system 'undo-tree) + (setq evil-undo-system 'undo-tree) + (setq evil-split-window-below t) + (setq evil-vsplit-window-right t) :config (evil-mode 1) (define-key evil-normal-state-map "u" 'undo-tree-undo) - (define-key evil-normal-state-map (kbd "C-r") 'undo-tree-redo)) + (define-key evil-normal-state-map (kbd "C-r") 'undo-tree-redo) + + (evil-set-initial-state 'help-mode 'emacs) + (evil-set-initial-state 'messages-buffer-mode 'normal) + (evil-set-initial-state 'dired-mode 'normal) + (evil-set-initial-state 'ibuffer-mode 'normal)) + +(modify-syntax-entry ?_ "w") (use-package smartparens :ensure t @@ -876,7 +1072,6 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :config (evil-collection-init)) - (use-package evil-surround :ensure t :straight t @@ -898,14 +1093,11 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (define-key evil-inner-text-objects-map "b" 'evil-textobj-anyblock-inner-block) (define-key evil-outer-text-objects-map "b" 'evil-textobj-anyblock-a-block) - ;; (define-key evil-inner-text-objects-map "q" 'evil-textobj-anyblock-inner-quote) - ;; (define-key evil-outer-text-objects-map "q" 'evil-textobj-anyblock-a-quote) - (setq evil-textobj-anyblock-blocks - '(("(" . ")") - ("{" . "}") - ("\\[" . "\\]") - ("<" . ">")))) + '(("(" . ")") + ("{" . "}") + ("\\[" . "\\]") + ("<" . ">")))) (evil-define-text-object my-evil-textobj-anyblock-inner-quote (count &optional beg end type) @@ -957,8 +1149,8 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :init (setq undo-tree-visualizer-timestamps t undo-tree-visualizer-diff t - undo-tree-auto-save-history nil - undo-tree-history-directory-alist nil + undo-tree-auto-save-history t + undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo-tree-history/")) undo-limit 800000 undo-strong-limit 12000000 undo-outer-limit 120000000) @@ -986,23 +1178,47 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :straight t :ensure t :hook - (after-init . pulsar-global-mode) + ;; (after-init . pulsar-global-mode) + :init + (setq pulsar-pulse-on-window-change nil) :config (setq pulsar-pulse t) (setq pulsar-delay 0.025) (setq pulsar-iterations 10) (setq pulsar-face 'evil-ex-lazy-highlight) - (add-to-list 'pulsar-pulse-functions 'evil-scroll-down) - (add-to-list 'pulsar-pulse-functions 'flymake-goto-next-error) - (add-to-list 'pulsar-pulse-functions 'flymake-goto-prev-error) - (add-to-list 'pulsar-pulse-functions 'evil-yank) - (add-to-list 'pulsar-pulse-functions 'evil-yank-line) - (add-to-list 'pulsar-pulse-functions 'evil-delete) - (add-to-list 'pulsar-pulse-functions 'evil-delete-line) - (add-to-list 'pulsar-pulse-functions 'evil-jump-item) - (add-to-list 'pulsar-pulse-functions 'diff-hl-next-hunk) - (add-to-list 'pulsar-pulse-functions 'diff-hl-previous-hunk)) + (add-hook 'org-agenda-mode-hook + (lambda () (pulsar-mode -1))) + + (setq pulsar-pulse-functions + '(evil-scroll-down + flymake-goto-next-error + flymake-goto-prev-error + evil-yank + evil-yank-line + evil-delete + evil-delete-line + evil-jump-item + diff-hl-next-hunk + diff-hl-previous-hunk + recenter-top-bottom + move-to-window-line-top-bottom + reposition-window + bookmark-jump + other-window + delete-window + delete-other-windows + forward-page + backward-page + scroll-up-command + scroll-down-command + windmove-right + windmove-left + windmove-up + windmove-down + tab-new + tab-close + tab-next))) (use-package evil-org :ensure t @@ -1013,20 +1229,12 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (require 'evil-org-agenda) (evil-org-agenda-set-keys)) -;;; NERD ICONS -;; The `nerd-icons' package provides a set of icons for use in Emacs. These icons can -;; enhance the visual appearance of various modes and packages, making it easier to -;; distinguish between different file types and functionalities. (use-package nerd-icons :if ek-use-nerd-fonts ;; Load the package only if the user has configured to use nerd fonts. :ensure t ;; Ensure the package is installed. :straight t :defer t) ;; Load the package only when needed to improve startup time. - ;;; NERD ICONS Dired -;; The `nerd-icons-dired' package integrates nerd icons into the Dired mode, -;; providing visual icons for files and directories. This enhances the Dired -;; interface by making it easier to identify file types at a glance. (use-package nerd-icons-dired :if ek-use-nerd-fonts ;; Load the package only if the user has configured to use nerd fonts. :ensure t ;; Ensure the package is installed. @@ -1044,30 +1252,6 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (nerd-icons-completion-mode) ;; Activate nerd icons for completion interfaces. (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) ;; Setup icons in the marginalia mode for enhanced completion display. -;;; CATPPUCCIN THEME -;; The `catppuccin-theme' package provides a visually pleasing color theme -;; for Emacs that is inspired by the popular Catppuccin color palette. -;; This theme aims to create a comfortable and aesthetic coding environment -;; with soft colors that are easy on the eyes. -;; (use-package catppuccin-theme -;; :ensure t -;; :straight t -;; :config -;; (setq catppuccin-flavor 'frappe) - -;; (load-theme 'catppuccin :no-confirm) - -;; (custom-set-faces -;; `(diff-hl-change ((t (:background unspecified :foreground ,(catppuccin-get-color 'blue)))))) - -;; (custom-set-faces -;; `(diff-hl-delete ((t (:background unspecified :foreground ,(catppuccin-get-color 'red)))))) - -;; (custom-set-faces -;; `(diff-hl-insert ((t (:background unspecified :foreground ,(catppuccin-get-color 'green))))))) - - -;;; UTILITARY FUNCTION TO INSTALL EMACS-KICK (defun ek/first-install () "dired" (interactive) ;; Allow this function to be called interactively. @@ -1084,8 +1268,6 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (read-key) ;; Wait for the user to press any key. (kill-emacs)) ;; Close Emacs after installation is complete. -;;; init.el ends here - (require 'battery) (require 'nerd-icons) @@ -1228,35 +1410,35 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi 'help-echo (format "%d note(s)" note-count)))))))) (setq-default header-line-format - '("%e" - (:propertize " " display (raise +0.4)) - (:propertize " " display (raise -0.4)) - - (:propertize "λ " face font-lock-comment-face) - mode-line-frame-identification - mode-line-buffer-identification - - (:eval (when-let (vc vc-mode) - (list (propertize " " 'face 'font-lock-comment-face) - (propertize (truncate-string-to-width - (substring vc 5) 50) - 'face 'font-lock-comment-face)))) - - (:eval (my-lspce-diagnostics-string)) - - (:propertize " %4l:%c" face mode-line-buffer-id) - - (:eval (propertize - " " 'display - `((space :align-to - (- (+ right right-fringe right-margin) - ,(+ 3 - (string-width (or my-battery-string "")) - (string-width (or display-time-string "")))))))) - - (:eval my-battery-string) - " " - (:eval display-time-string))) + '("%e" + (:propertize " " display (raise +0.4)) + (:propertize " " display (raise -0.4)) + + (:propertize "λ " face font-lock-comment-face) + mode-line-frame-identification + mode-line-buffer-identification + + (:eval (when-let (vc vc-mode) + (list (propertize " " 'face 'font-lock-comment-face) + (propertize (truncate-string-to-width + (substring vc 5) 50) + 'face 'font-lock-comment-face)))) + + (:eval (my-lspce-diagnostics-string)) + + (:propertize " %4l:%c" face mode-line-buffer-id) + + (:eval (propertize + " " 'display + `((space :align-to + (- (+ right right-fringe right-margin) + ,(+ 3 + (string-width (or my-battery-string "")) + (string-width (or display-time-string "")))))))) + + (:eval my-battery-string) + " " + (:eval display-time-string))) (setq-default mode-line-format nil) @@ -1300,32 +1482,31 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :defer t :bind (:map custom-bindings-map ("C-c h m" . hide-mode-line-mode))) +;; (use-package doom-modeline +;; :ensure t +;; :hook (after-init . doom-modeline-mode) +;; :config +;; (setq doom-modeline-buffer-file-name-style 'buffer-name)) + (use-package adaptive-wrap :ensure t :hook ((text-mode . adaptive-wrap-prefix-mode)) :config (add-hook 'org-mode-hook - (lambda () - (when (bound-and-true-p adaptive-wrap-prefix-mode) - (adaptive-wrap-prefix-mode -1))))) + (lambda () + (when (bound-and-true-p adaptive-wrap-prefix-mode) + (adaptive-wrap-prefix-mode -1))))) (setq package-gnupghome-dir "~/.gnupg") (blink-cursor-mode 0) (setq-default cursor-type 'bar) -(defvar cashmere/font-height 150) - -;; (when (member "Fragment Mono" (font-family-list)) -;; (set-face-attribute 'default nil :font "Fragment Mono" :height cashmere/font-height) -;; (set-face-attribute 'fixed-pitch nil :family "Fragment Mono" :height cashmere/font-height)) +(defvar cashmere/font-height 140) -;; (when (member "Maple Mono NF" (font-family-list)) -;; (set-face-attribute 'variable-pitch nil :family "Maple Mono NF" :height cashmere/font-height)) - -(set-face-attribute 'default nil :family "MonoLisa" :weight 'semi-bold :height cashmere/font-height) -(set-face-attribute 'fixed-pitch nil :family "MonoLisa" :weight 'regular) -(set-face-attribute 'variable-pitch nil :family "MonoLisa" :weight 'regular :height 1.1) +(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :weight 'regular :height cashmere/font-height) +(set-face-attribute 'fixed-pitch nil :family "RobotoMono Nerd Font" :weight 'regular) +(set-face-attribute 'variable-pitch nil :family "RobotoMono Nerd Font" :weight 'regular :height 1.1) (use-package mixed-pitch :straight t @@ -1336,29 +1517,165 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (use-package autothemer :straight t :defer t) - (use-package doom-themes - :straight t - :ensure t - :custom - ;; Global settings (defaults) - (doom-themes-enable-bold t) ; if nil, bold is universally disabled - (doom-themes-enable-italic t) ; if nil, italics is universally disabled - ;; for treemacs users - (doom-themes-treemacs-theme "doom-nord-light") ; use "doom-colors" for less minimal icon theme - :config - (load-theme 'doom-nord-light t) +;; (use-package doom-themes +;; :straight t +;; :ensure t +;; :custom +;; ;; Global settings (defaults) +;; (doom-themes-enable-bold t) ; if nil, bold is universally disabled +;; (doom-themes-enable-italic t) ; if nil, italics is universally disabled +;; ;; for treemacs users +;; (doom-themes-treemacs-theme "doom-nord-light") ; use "doom-colors" for less minimal icon theme +;; :config +;; (load-theme 'doom-nord-light t) + +;; ;; Enable flashing mode-line on errors +;; (doom-themes-visual-bell-config) +;; ;; Enable custom neotree theme (nerd-icons must be installed!) +;; ;; or for treemacs users +;; (doom-themes-treemacs-config) +;; ;; Corrects (and improves) org-mode's native fontification. +;; (doom-themes-org-config)) + +(use-package catppuccin-theme + :ensure t + :straight t + :config + (setq catppuccin-flavor 'mocha) + + (load-theme 'catppuccin :no-confirm) + + (custom-set-faces + `(diff-hl-change ((t (:background unspecified :foreground ,(catppuccin-get-color 'blue)))))) + + (custom-set-faces + `(diff-hl-delete ((t (:background unspecified :foreground ,(catppuccin-get-color 'red)))))) - ;; Enable flashing mode-line on errors - (doom-themes-visual-bell-config) - ;; Enable custom neotree theme (nerd-icons must be installed!) - ;; or for treemacs users - (doom-themes-treemacs-config) - ;; Corrects (and improves) org-mode's native fontification. - (doom-themes-org-config)) + (custom-set-faces + `(diff-hl-insert ((t (:background unspecified :foreground ,(catppuccin-get-color 'green))))))) + +;; (use-package modus-themes +;; :ensure nil +;; :defer t +;; :custom +;; (modus-themes-italic-constructs t) +;; (modus-themes-bold-constructs t) +;; (modus-themes-mixed-fonts nil) +;; (modus-themes-prompts '(bold intense)) +;; (modus-themes-common-palette-overrides +;; `((accent-0 "#1e66f5") +;; (accent-1 "#04a5e5") +;; (bg-active bg-main) +;; (bg-added "#d3f0d0") +;; (bg-added-refine "#b8e6b3") +;; (bg-changed "#dde5f5") +;; (bg-changed-refine "#c4d4f0") +;; (bg-completion "#ccd0da") +;; (bg-completion-match-0 "#eff1f5") +;; (bg-completion-match-1 "#eff1f5") +;; (bg-completion-match-2 "#eff1f5") +;; (bg-completion-match-3 "#eff1f5") +;; (bg-hl-line "#e6e9ef") +;; (bg-hover-secondary "#9ca0b0") +;; (bg-line-number-active unspecified) +;; (bg-line-number-inactive "#eff1f5") +;; (bg-main "#eff1f5") +;; (bg-mark-delete "#f5d9e0") +;; (bg-mark-select "#dde5f5") +;; (bg-mode-line-active "#e6e9ef") +;; (bg-mode-line-inactive "#e6e9ef") +;; (bg-prominent-err "#f5d9e0") +;; (bg-prompt unspecified) +;; (bg-prose-block-contents "#dce0e8") +;; (bg-prose-block-delimiter bg-prose-block-contents) +;; (bg-region "#9ca0b0") +;; (bg-removed "#f5d9e0") +;; (bg-removed-refine "#f0c9d1") +;; (bg-tab-bar "#eff1f5") +;; (bg-tab-current bg-main) +;; (bg-tab-other "#eff1f5") +;; (border-mode-line-active nil) +;; (border-mode-line-inactive nil) +;; (builtin "#1e66f5") +;; (comment "#7c7f93") +;; (constant "#d20f39") +;; (cursor "#dc8a78") +;; (date-weekday "#1e66f5") +;; (date-weekend "#fe640b") +;; (docstring "#5c5f77") +;; (err "#d20f39") +;; (fg-active fg-main) +;; (fg-completion "#4c4f69") +;; (fg-completion-match-0 "#1e66f5") +;; (fg-completion-match-1 "#d20f39") +;; (fg-completion-match-2 "#40a02b") +;; (fg-completion-match-3 "#fe640b") +;; (fg-heading-0 "#d20f39") +;; (fg-heading-1 "#fe640b") +;; (fg-heading-2 "#df8e1d") +;; (fg-heading-3 "#40a02b") +;; (fg-heading-4 "#04a5e5") +;; (fg-line-number-active "#7287fd") +;; (fg-line-number-inactive "#9ca0b0") +;; (fg-link "#1e66f5") +;; (fg-main "#4c4f69") +;; (fg-mark-delete "#d20f39") +;; (fg-mark-select "#1e66f5") +;; (fg-mode-line-active "#4c4f69") +;; (fg-mode-line-inactive "#9ca0b0") +;; (fg-prominent-err "#d20f39") +;; (fg-prompt "#8839ef") +;; (fg-prose-block-delimiter "#7c7f93") +;; (fg-prose-verbatim "#40a02b") +;; (fg-region "#4c4f69") +;; (fnname "#1e66f5") +;; (fringe "#eff1f5") +;; (identifier "#8839ef") +;; (info "#179299") +;; (keyword "#8839ef") +;; (keyword "#8839ef") +;; (name "#1e66f5") +;; (number "#fe640b") +;; (property "#1e66f5") +;; (string "#40a02b") +;; (type "#df8e1d") +;; (variable "#fe640b") +;; (warning "#df8e1d"))) +;; :config +;; (modus-themes-with-colors +;; (custom-set-faces +;; `(change-log-acknowledgment ((,c :foreground "#7287fd"))) +;; `(change-log-date ((,c :foreground "#40a02b"))) +;; `(change-log-name ((,c :foreground "#fe640b"))) +;; `(diff-context ((,c :foreground "#1e66f5"))) +;; `(diff-file-header ((,c :foreground "#ea76cb"))) +;; `(diff-header ((,c :foreground "#1e66f5"))) +;; `(diff-hunk-header ((,c :foreground "#fe640b"))) +;; `(gnus-button ((,c :foreground "#1e66f5"))) +;; `(gnus-group-mail-3 ((,c :foreground "#1e66f5"))) +;; `(gnus-group-mail-3-empty ((,c :foreground "#1e66f5"))) +;; `(gnus-header-content ((,c :foreground "#04a5e5"))) +;; `(gnus-header-from ((,c :foreground "#8839ef"))) +;; `(gnus-header-name ((,c :foreground "#40a02b"))) +;; `(gnus-header-subject ((,c :foreground "#1e66f5"))) +;; `(log-view-message ((,c :foreground "#7287fd"))) +;; `(match ((,c :background "#c4d4f0" :foreground "#4c4f69"))) +;; `(modus-themes-search-current ((,c :background "#d20f39" :foreground "#eff1f5"))) +;; `(modus-themes-search-lazy ((,c :background "#c4d4f0" :foreground "#4c4f69"))) +;; `(newsticker-extra-face ((,c :foreground "#7c7f93" :height 0.8 :slant italic))) +;; `(newsticker-feed-face ((,c :foreground "#d20f39" :height 1.2 :weight bold))) +;; `(newsticker-treeview-face ((,c :foreground "#4c4f69"))) +;; `(newsticker-treeview-selection-face ((,c :background "#c4d4f0" :foreground "#4c4f69"))) +;; `(tab-bar ((,c :background "#eff1f5" :foreground "#4c4f69"))) +;; `(tab-bar-tab ((,c :background "#eff1f5" :underline t))) +;; `(tab-bar-tab-group-current ((,c :background "#eff1f5" :foreground "#4c4f69" :underline t))) +;; `(tab-bar-tab-group-inactive ((,c :background "#eff1f5" :foreground "#7c7f93"))) +;; `(tab-bar-tab-inactive ((,c :background "#eff1f5" :foreground "#5c5f77"))) +;; `(vc-dir-file ((,c :foreground "#1e66f5"))) +;; `(vc-dir-header-value ((,c :foreground "#7287fd"))))) +;; :init +;; (load-theme 'modus-operandi t)) -;; (use-package nord-theme -;; :ensure t) -;; (load-theme 'nord t) (use-package dirvish :straight t :init @@ -1390,7 +1707,7 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (define-globalized-minor-mode my/global-olivetti-mode olivetti-mode (lambda () (olivetti-mode 1))) (my/centered-cursor) -;; (my/global-olivetti-mode) +(my/global-olivetti-mode) (use-package org-modern-indent :straight (:host github :repo "jdtsmith/org-modern-indent") @@ -1413,19 +1730,6 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi "^\\*ts-ls\\*$" "^\\*ts-ls::stderr\\*$")) -(use-package eat - :ensure t - :defer t - :init - (defun my/eat-reset-key () - (when (boundp 'eat-emacs-mode-map) - (define-key eat-emacs-mode-map (kbd "C-l") #'eat-reset))) - :hook (eat-mode . my/eat-reset-key) - :config - (when (fboundp 'eat-global-mode) - (eat-global-mode) - (setq eat-kill-buffer-on-exit t))) - (use-package projectile :ensure t :demand t @@ -1453,24 +1757,26 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :ensure t :defer t) +(use-package pdf-tools + :ensure t + :magic ("%PDF" . pdf-view-mode) + :config + (pdf-tools-install :no-query) + :hook (pdf-view-mode . (lambda () (display-line-numbers-mode -1)))) -(defun my/eldoc-box-describe-and-jump () +(defun ek/lsp-describe-and-jump () (interactive) - (eldoc-box-help-at-point) - (let ((eldoc-buffer "*eldoc-box*")) - (when (get-buffer eldoc-buffer) - (switch-to-buffer-other-window eldoc-buffer)))) - -(use-package pdf-tools -:ensure t -:magic ("%PDF" . pdf-view-mode) -:config -(pdf-tools-install :no-query) -:hook (pdf-view-mode . (lambda () (display-line-numbers-mode -1)))) + (lspce-help-at-point) + (let ((help-buffer "*lsp-help*")) + (when (get-buffer help-buffer) + (switch-to-buffer-other-window help-buffer)))) +(evil-define-key 'normal 'global (kbd "K") + (if (>= emacs-major-version 31) + #'eldoc-box-help-at-point + #'ek/lsp-describe-and-jump)) (defun my/format-buffer () - "Format buffer based on major mode" (interactive) (cond ((eq major-mode 'rust-mode) (rust-format-buffer)) @@ -1484,10 +1790,11 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi "SPC" '((lambda () (interactive) (if (projectile-project-p) - (projectile-find-file) + (consult-projectile-find-file) (projectile-switch-project))) :wk "find file/switch project") - "sp" '(consult-ripgrep :wk "search project") + "sp" '(consult-projectile :wk "search project") + "ss" '(consult-line :wk "search project") "/" '(consult-ripgrep :wk "search project") "." '(find-file :wk "find file") "," '(consult-buffer :wk "switch buffer") @@ -1517,7 +1824,9 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi "pp" '(projectile-switch-project :wk "switch project") "pf" '(projectile-find-file :wk "find file") "ps" '(consult-ripgrep :wk "search") - "pb" '(consult-projectile-buffer :wk "buffers") "pk" '(projectile-kill-buffers :wk "kill buffers") "pd" '(projectile-dired :wk "root dir") + "pb" '(consult-projectile-buffer :wk "buffers") + "pk" '(projectile-kill-buffers :wk "kill buffers") + "pd" '(projectile-dired :wk "root dir") "pr" '(projectile-recentf :wk "recent files") "pa" '(projectile-add-known-project :wk "add project") "pc" '(projectile-compile-project :wk "compile") @@ -1528,14 +1837,19 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi "gc" '(magit-clone :wk "clone") "gg" '(magit-status :wk "status") "gl" '(magit-log-current :wk "log") - "gd" '(xref-find-definitions :wk "go to definition") + "gd" '(lsp-find-definition :wk "go to definition") + "gD" '(lsp-find-definition-other-window :wk "definition other window") + "gi" '(lsp-find-implementation :wk "go to implementation") + "gI" '((lambda () (interactive) + (let ((current-prefix-arg 4)) + (call-interactively #'lsp-find-implementation))) + :wk "implementation other window") + "gt" '(lsp-find-type-definition :wk "go to type definition") + "gr" '(lsp-find-references :wk "find references") "gs" '(magit-file-stage :wk "stage file") "gb" '(vc-annotate :wk "blame") "o" '(:ignore t :wk "open") - ;; "op" '(neotree-toggle :wk "neotree") - ;; "oP" '(dired-jump :wk "dired") - ;; "od" '(dirvish :wk "dirvish") "h" '(:ignore t :wk "help") "hm" '(describe-mode :wk "mode") @@ -1543,35 +1857,24 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi "hv" '(describe-variable :wk "variable") "hk" '(describe-key :wk "key") - "w c" '(evil-window-delete :wk "Close window") - "w n" '(evil-window-new :wk "New window") - "w s" '(evil-window-split :wk "Horizontal split window") - "w v" '(evil-window-vsplit :wk "Vertical split window") - ;; Window motions - "w h" '(evil-window-left :wk "Window left") - "w j" '(evil-window-down :wk "Window down") - "w k" '(evil-window-up :wk "Window up") - "w l" '(evil-window-right :wk "Window right") - "w w" '(evil-window-next :wk "Goto next window") - ;; Move Windows - "w H" '(buf-move-left :wk "Buffer move left") - "w J" '(buf-move-down :wk "Buffer move down") - "w K" '(buf-move-up :wk "Buffer move up") - "w L" '(buf-move-right :wk "Buffer move right") + "w c" '(evil-window-delete :wk "Close window") + "w n" '(evil-window-new :wk "New window") + "w s" '(evil-window-split :wk "Horizontal split window") + "w v" '(evil-window-vsplit :wk "Vertical split window") + "w h" '(evil-window-left :wk "Window left") + "w j" '(evil-window-down :wk "Window down") + "w k" '(evil-window-up :wk "Window up") + "w l" '(evil-window-right :wk "Window right") + "w w" '(evil-window-next :wk "Goto next window") + "w H" '(buf-move-left :wk "Buffer move left") + "w J" '(buf-move-down :wk "Buffer move down") + "w K" '(buf-move-up :wk "Buffer move up") + "w L" '(buf-move-right :wk "Buffer move right") "c" '(:ignore t :wk "code") "ca" '(lspce-code-actions :wk "code actions") - "cx" '(consult-flymake :wk "code actions") "cr" '(lspce-rename :wk "lsp rename") -"cf" '(my/format-buffer :wk "format buffer") - - "m" '(:ignore t :wk "mode") - "mp" (list (lambda () - (interactive) - (shell-command (concat "prettier --write " - (shell-quote-argument (buffer-file-name)))) - (revert-buffer t t t)) - :wk "format prettier") + "cf" '(my/format-buffer :wk "format buffer") "q" '(:ignore t :wk "quit") "qq" '(save-buffers-kill-terminal :wk "quit emacs") @@ -1581,6 +1884,7 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi "u" '(undo-tree-visualize :wk "undo tree") "P" '(consult-yank-from-kill-ring :wk "paste history")) + (defun my/avy-enabled-p () (and (not (derived-mode-p 'magit-mode 'dired-mode 'ibuffer-mode)) (not (eq major-mode 'dirvish-mode)))) @@ -1595,6 +1899,104 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (maximum-scroll-margin 0)) (call-interactively 'evil-avy-goto-char-2))))) +(general-def 'normal 'override + "]d" 'flymake-goto-next-error + "[d" 'flymake-goto-prev-error + "]c" 'diff-hl-next-hunk + "[c" 'diff-hl-previous-hunk + "]b" 'switch-to-next-buffer + "[b" 'switch-to-prev-buffer + "]t" 'tab-next + "[t" 'tab-previous + "P" 'consult-yank-from-kill-ring + "gcc" (lambda () + (interactive) + (unless (use-region-p) + (comment-or-uncomment-region + (line-beginning-position) + (line-end-position))))) + +(general-def 'visual 'override + "gc" (lambda () + (interactive) + (when (use-region-p) + (comment-or-uncomment-region + (region-beginning) + (region-end))))) + +(my-local-leader + :keymaps 'org-mode-map + "h" '(consult-org-heading :wk "search headings") + "n" '(my-toggle-org-tree-indirect-buffer :wk "toggle narrow")) + +(my-leader + :keymaps 'org-mode-map + "c" '(:wk "Clock" :ignore) + + "cs" '(org-schedule :wk "Schedule") + "cd" '(org-deadline :wk "Deadline") + + "l" '(:wk "Link" :ignore) + "lc" '(org-cliplink :wk "Cliplink") + "li" '(org-download-clipboard :wk "Image") + "ll" '(org-insert-link :wk "Link various things") + + "t" '(org-todo :wk "TODO") + + "RET" '(org-open-at-point)) + +(with-eval-after-load 'denote-menu + (general-def 'normal denote-menu-mode-map + "r" 'denote-menu-filter + "c" 'denote-menu-clear-filters + "e" 'denote-menu-export-to-dired + "o" 'denote-menu-filter-out-keyword)) + +(general-def 'normal dirvish-mode-map + "?" 'dirvish-dispatch + "q" 'dirvish-quit + "b" 'dirvish-quick-access + "f" 'dirvish-file-info-menu + "p" 'dirvish-yank + "S" 'dirvish-quicksort + "F" 'dirvish-layout-toggle + "z" 'dirvish-history-jump + "gh" 'dirvish-subtree-up + "gl" 'dirvish-subtree-toggle + "h" 'dired-up-directory + "l" 'dired-find-file + "TAB" 'dirvish-subtree-toggle + "[h" 'dirvish-history-go-backward + "]h" 'dirvish-history-go-forward) + +(general-def '(normal visual) dirvish-mode-map + :prefix "y" + "l" 'dirvish-copy-file-true-path + "n" 'dirvish-copy-file-name + "p" 'dirvish-copy-file-path + "y" 'dired-do-copy) + +(general-def 'normal dirvish-mode-map + :prefix "s" + "s" 'dirvish-symlink + "S" 'dirvish-relative-symlink + "h" 'dirvish-hardlink) + +(my-local-leader + "a" '(org-agenda :wk "org agenda") + "t" '(multi-vterm :wk "terminal") + "c" '(my/centered-cursor :wk "center cursor") + "d" '(dirvish :wk "dired") + "z" '(zoom-mode :wk "zoom/golden ratio") + "m" '(mu4e :wk "mail")) + +(global-set-key (kbd "M-<delete>") 'delete-word) +(global-set-key (kbd "M-<backspace>") 'backward-delete-word) +(global-set-key (kbd "C-<delete>") 'delete-word) +(global-set-key (kbd "C-<backspace>") 'backward-delete-word) +(global-set-key (kbd "C-=") 'text-scale-increase) +(global-set-key (kbd "C--") 'text-scale-decrease) + (use-package elfeed :ensure t :defer t @@ -1603,7 +2005,7 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :config (setq elfeed-search-filter "@2-weeks-ago +unread" elfeed-search-title-max-width 110)) - + (use-package elfeed-org :ensure t @@ -1680,138 +2082,10 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi (add-hook 'message-send-mail-hook 'mu4e-set-msmtp-account)) -(general-def 'normal 'override - "K" 'my/eldoc-box-describe-and-jump) - -(defun my/ibuffer-smart () - (interactive) - (ibuffer) - (local-set-key (kbd "RET") - (lambda () - (interactive) - (ibuffer-visit-buffer) - (kill-buffer "*Ibuffer*"))) - (local-set-key (kbd "q") - (lambda () - (interactive) - (kill-buffer "*Ibuffer*")))) - -(my-leader - "bi" 'my/ibuffer-smart) - -(my-local-leader - "a" '(org-agenda :wk "org agenda") - "t" '(vterm :wk "terminal") - "c" '(my/centered-cursor :wk "center cursor") - "d" '(dirvish :wk "dired") - "z" '(zoom-mode :wk "zoom/golden ratio")) - -(general-def 'normal 'override - "]d" 'flymake-goto-next-error - "[d" 'flymake-goto-prev-error - "]c" 'diff-hl-next-hunk - "[c" 'diff-hl-previous-hunk - "]b" 'switch-to-next-buffer - "[b" 'switch-to-prev-buffer - "]t" 'tab-next - "[t" 'tab-previous - "P" 'consult-yank-from-kill-ring - "gcc" (lambda () - (interactive) - (unless (use-region-p) - (comment-or-uncomment-region - (line-beginning-position) - (line-end-position))))) - -(general-def 'visual 'override - "gc" (lambda () - (interactive) - (when (use-region-p) - (comment-or-uncomment-region - (region-beginning) - (region-end))))) - -(general-def 'normal dirvish-mode-map - "?" 'dirvish-dispatch - "q" 'dirvish-quit - "b" 'dirvish-quick-access - "f" 'dirvish-file-info-menu - "p" 'dirvish-yank - "S" 'dirvish-quicksort - "F" 'dirvish-layout-toggle - "z" 'dirvish-history-jump - "gh" 'dirvish-subtree-up - "gl" 'dirvish-subtree-toggle - "h" 'dired-up-directory - "l" 'dired-find-file - "TAB" 'dirvish-subtree-toggle - "[h" 'dirvish-history-go-backward - "]h" 'dirvish-history-go-forward) - -(general-def '(normal visual) dirvish-mode-map - :prefix "y" - "l" 'dirvish-copy-file-true-path - "n" 'dirvish-copy-file-name - "p" 'dirvish-copy-file-path - "y" 'dired-do-copy) - -(general-def 'normal dirvish-mode-map - :prefix "s" - "s" 'dirvish-symlink - "S" 'dirvish-relative-symlink - "h" 'dirvish-hardlink) - -(my-local-leader - :keymaps 'org-mode-map - "h" '(consult-org-heading :wk "search headings") - "n" '(my-toggle-org-tree-indirect-buffer :wk "toggle narrow")) - -(general-def 'normal eat-mode-map - "C-l" 'eat-reset) - -(define-key minibuffer-local-map [escape] 'abort-recursive-edit) -(define-key minibuffer-local-ns-map [escape] 'abort-recursive-edit) -(define-key minibuffer-local-completion-map [escape] 'abort-recursive-edit) -(define-key minibuffer-local-must-match-map [escape] 'abort-recursive-edit) -(define-key minibuffer-local-isearch-map [escape] 'abort-recursive-edit) - -(defun delete-word (arg) - (interactive "p") - (delete-region (point) (progn (forward-word arg) (point)))) - -(defun backward-delete-word (arg) - (interactive "p") - (delete-word (- arg))) -(global-set-key (kbd "M-<delete>") 'delete-word) -(global-set-key (kbd "M-<backspace>") 'backward-delete-word) -(global-set-key (kbd "C-<delete>") 'delete-word) -(global-set-key (kbd "C-<backspace>") 'backward-delete-word) -(global-set-key (kbd "C-=") 'text-scale-increase) -(global-set-key (kbd "C--") 'text-scale-decrease) - -(defun my/convert-all-denote-links-in-directory (directory) - "Converts all denote: links to file: links in a specific directory." - (interactive "DDirectory: ") - (let ((org-files (directory-files directory t "\\.org$"))) - (dolist (file org-files) - (with-current-buffer (find-file-noselect file) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "\\[\\[denote:\\([0-9T]+\\)\\]\\(?:\\[\\([^]]*\\)\\]\\)?\\]" nil t) - (let* ((id (match-string 1)) - (description (match-string 2)) - (target-file (seq-find - (lambda (f) - (string-match-p (regexp-quote id) (file-name-nondirectory f))) - org-files))) - (when target-file - (let* ((target-filename (file-name-nondirectory target-file)) - (new-link (if description - (format "[[file:./%s][%s]]" target-filename description) - (format "[[file:./%s]]" target-filename)))) - (replace-match new-link t t)))))) - (save-buffer) - (kill-buffer))))) +;; (profiler-start 'cpu) +;; (org-agenda nil "c") +;; (profiler-report) +;; (profiler-stop) (provide 'init) @@ -88,7 +88,7 @@ ;; Configure font settings based on the operating system. ;; Ok, this kickstart is meant to be used on the terminal, not on GUI. ;; But without this, I fear you could start Graphical Emacs and be sad :( - (set-face-attribute 'default nil :family "MonoLisa" :height 150) + ;; (set-face-attribute 'default nil :family "Maple Mono NF" :height 150) ;; (when (eq system-type 'darwin) ;; Check if the system is macOS. ;; (setq mac-command-modifier 'meta) ;; Set the Command key to act as the Meta key. ;; (set-face-attribute 'default nil :family "Fragment Mono" :height 130)) @@ -105,12 +105,13 @@ :init ;; Initialization settings that apply before the package is loaded. (tool-bar-mode -1) + (menu-bar-mode -1) (scroll-bar-mode -1) (add-to-list 'default-frame-alist '(vertical-scroll-bars . nil)) (add-to-list 'default-frame-alist '(horizontal-scroll-bars . nil)) - (set-frame-parameter (selected-frame) 'alpha-background 60) - (add-to-list 'default-frame-alist '(alpha-background . 60)) + (set-frame-parameter (selected-frame) 'alpha-background 80) + (add-to-list 'default-frame-alist '(alpha-background . 80)) (global-hl-line-mode -1) ;; Disable highlight of the current line (global-auto-revert-mode 1) ;; Enable global auto-revert mode to keep buffers up to date with their corresponding files. (indent-tabs-mode -1) ;; Disable the use of tabs for indentation (use spaces instead). @@ -155,17 +156,17 @@ :custom (display-buffer-alist '( - ;; ("\\*.*e?shell\\*" - ;; (display-buffer-in-side-window) - ;; (window-height . 0.25) - ;; (side . bottom) - ;; (slot . -1)) + ;; ("\\*.*e?shell\\*" + ;; (display-buffer-in-side-window) + ;; (window-height . 0.25) + ;; (side . bottom) + ;; (slot . -1)) - ("\\*\\(Backtrace\\|Warnings\\|Compile-Log\\|[Hh]elp\\|Messages\\|Bookmark List\\|Ibuffer\\|Occur\\|eldoc.*\\)\\*" - (display-buffer-in-side-window) - (window-height . 0.25) - (side . bottom) - (slot . 0)) + ("\\*\\(Backtrace\\|Warnings\\|Compile-Log\\|[Hh]elp\\|Messages\\|Bookmark List\\|Occur\\|eldoc.*\\)\\*" + (display-buffer-in-side-window) + (window-height . 0.25) + (side . bottom) + (slot . 0)) ;; Example configuration for the LSP help buffer, ;; keeps it always on bottom using 25% of the available space: @@ -342,7 +343,7 @@ :straight nil :ensure nil ;; This is built-in, no need to fetch it. :defer t - :hook (prog-mode . flymake-mode) + ;; :hook (prog-mode . flymake-mode) :custom (flymake-margin-indicators-string '((error "!»" compilation-error) (warning "»" compilation-warning) @@ -353,6 +354,23 @@ "~/.emacs.d/init.el")) #+end_src +* flycheck + +#+begin_src emacs-lisp +(use-package flycheck + :ensure t + :config + (add-hook 'after-init-hook #'global-flycheck-mode)) +#+end_src + +** flycheck-rust + +#+begin_src emacs-lisp +(use-package flycheck-rust + :ensure t + :hook (flycheck-mode . flycheck-rust-setup)) +#+end_src + * xref #+begin_src emacs-lisp @@ -369,13 +387,13 @@ :ensure nil) #+end_src -* org mode +* org-mode #+begin_src emacs-lisp +(setq org-directory "~/org/") (use-package org :straight nil :ensure nil - :defer t :config (require 'org-tempo) @@ -434,6 +452,16 @@ org-appear-autosubmarkers t)) ;; Show sub- and superscripts #+end_src +** org-agenda + +#+begin_src emacs-lisp +(setq org-agenda-inhibit-startup t + org-agenda-use-tag-inheritance nil + org-agenda-dim-blocked-tasks nil + org-startup-indented nil + org-startup-folded 'overview) +#+end_src + ** org-modern #+begin_src emacs-lisp @@ -448,12 +476,104 @@ (setq org-modern-replace-stars "◉○◉○◉") #+end_src -** TODO org-agenda settings +** TODO org-agenda settings :deprecated: + +Old config + +#+begin_src emacs-lisp +;; (setq org-agenda-start-on-weekday nil +;; org-agenda-block-separator nil +;; org-agenda-remove-tags t) + +;; (setq org-agenda-skip-scheduled-if-done t +;; org-agenda-skip-deadline-if-done t +;; org-agenda-include-deadlines t +;; org-agenda-block-separator nil +;; org-agenda-compact-blocks t +;; org-agenda-start-day nil +;; org-agenda-span 1 +;; org-agenda-start-on-weekday nil +;; org-agenda-hide-tags-regexp "task" +;; org-agenda-prefix-format +;; '((agenda . " %i %?-12t% s") +;; (todo . " %i ") +;; (tags . " %i ") +;; (search . " %i "))) +#+end_src + +** org-capture + +*** yequake + +#+begin_src emacs-lisp +(use-package yequake + :custom + (yequake-frames + '(("org-capture" + (buffer-fns . (yequake-org-capture)) + (width . 0.75) + (height . 0.5) + ;; (alpha . 0.95) + (frame-parameters . ((undecorated . t) + (skip-taskbar . t) + (sticky . t))))))) +#+end_src + + +*** org-capture combined with denote + +#+begin_src emacs-lisp +(defun my/org-capture-denote-deadline () + (let* ((context (read-string "Task with deadline: ")) + (deadline (org-read-date t nil nil "Deadline: ")) + (file-name (denote nil '("task")))) + (find-file file-name) + (goto-char (point-min)) + (forward-line 4) + (insert (format "* %s\nDEADLINE: <%s>\n\n" context deadline)) + (current-buffer))) + +(defun my/org-capture-denote-scheduled () + (let* ((context (read-string "Scheduled task: ")) + (schedule (org-read-date t nil nil "Schedule: ")) + (file-name (denote nil '("task")))) + (find-file file-name) + (goto-char (point-min)) + (forward-line 4) + (insert (format "* %s\nSCHEDULED: <%s>\n\n" context schedule)) + (current-buffer))) + +(defun my/org-capture-denote-task () + (let* ((context (read-string "Task: ")) + (todo-state (completing-read "TODO state: " + '("ACTIVE" "NEXT" "TODO" "WAIT" "PLAN" "FUN"))) + (file-name (denote nil '("task")))) + (find-file file-name) + (goto-char (point-min)) + (forward-line 4) + (insert (format "\n* %s %s\n\n" todo-state context)) + (point))) + +(with-eval-after-load 'org + (setq org-capture-templates + '(("t" "Task" plain + (function my/org-capture-denote-task) + "" :immediate-finish t :jump-to-captured t) + ("d" "Deadline" plain + (function my/org-capture-denote-deadline) + "" :immediate-finish t :jump-to-captured t) + ("s" "Scheduled" plain + (function my/org-capture-denote-scheduled) + "" :immediate-finish t :jump-to-captured t)))) +#+end_src + +** org agenda settings gtd + +[[https://doc.norang.ca/org-mode.html#HandlingNotes][Org Mode - Organize Your Life In Plain Text!]] #+begin_src emacs-lisp -(setq org-agenda-start-on-weekday nil - org-agenda-block-separator nil - org-agenda-remove-tags t) +(setq org-agenda-span 'day) + #+end_src ** org-super-agenda @@ -462,51 +582,51 @@ (use-package org-super-agenda :after org-agenda :init - (setq org-agenda-skip-scheduled-if-done t - org-agenda-skip-deadline-if-done t - org-agenda-include-deadlines t - org-agenda-block-separator nil - org-agenda-compact-blocks t - org-agenda-start-day nil - org-agenda-span 1 - org-agenda-start-on-weekday nil - org-agenda-hide-tags-regexp "task" - org-agenda-prefix-format - '((agenda . " %i %?-12t% s") - (todo . " %i ") - (tags . " %i ") - (search . " %i "))) - (setq org-agenda-custom-commands - '(("c" "Super view" - ((agenda "" ((org-agenda-overriding-header "") - (org-super-agenda-groups - '((:name "Today" - :time-grid t - :date t - :deadline today - :scheduled future - :order 1))))) - (alltodo "" ((org-agenda-overriding-header "") - (org-super-agenda-groups - '((:discard (:todo "FUN")) ; <- HIER ist die korrekte Position - (:log t) - (:name "ACTIVE" - :todo "ACTIVE") - (:name "NEXT" - :todo "NEXT") - (:name "TODO" - :todo "TODO") - (:name "WAIT" - :todo "WAIT")))))) - ((org-agenda-exporter-settings - '((ps-number-of-columns 2) - (ps-landscape-mode t) - (org-agenda-add-entry-text-maxlines 5) - (htmlize-output-type 'css))))))) :config (org-super-agenda-mode)) #+end_src +** org-ql + +#+begin_src emacs-lisp +(use-package org-ql + :ensure t + :after org-super-agenda + :config + (setq org-agenda-custom-commands + '(("w" "Weekly Overview" + ((org-ql-block '(and (or (deadline auto) + (scheduled :to 7)) + (not (done)) + (not (habit))) + ((org-ql-block-header "Weekly Tasks") + (org-super-agenda-groups + '((:name "Deadlines" + :deadline t + :order 1) + (:name "Schedule" + :scheduled t + :order 2) + (:discard (:anything t)))))) + (org-ql-block '(and (ts-active :from today :to 7 :with-time t) + (not (done)) + (not (habit))) + ((org-ql-block-header "Appointments") + (org-super-agenda-groups + '((:name "This Week" + :anything t + :order 1))))) + (org-ql-block '(and (habit) + (not (done))) + ((org-ql-block-header "Habits") + (org-super-agenda-groups + '((:name "Daily Habits" + :habit t + :order 1) + (:discard (:anything t))))))))))) +#+end_src + + ** TODO org-todo-keywords #+begin_src emacs-lisp @@ -526,6 +646,58 @@ Org Backend exporter for typst templates written and configured in org mode. :after org) #+end_src +** org-cliplink + +#+begin_src emacs-lisp +(use-package org-cliplink + :ensure t + :defer t) +#+end_src + +** org-download + +#+begin_src emacs-lisp +(use-package org-download + :ensure t + :hook (org-mode . org-download-enable) + :config + (setq-default org-download-image-dir "~/org/attachments/") + (setq org-download-method 'directory) + (setq org-download-timestamp "%Y%m%d-%H%M%S_") + (setq org-download-heading-lvl nil)) +#+end_src + +** org-publish + +#+begin_src emacs-lisp + +(setq org-publish-project-alist + '(("wiki" + :author "cashmere" + :email "cashmere@cashmere.rs" + :preserve-breaks t + :preserve-indent t + :with-title t + :base-directory "/home/cashmere/wiki/" + :base-extension "org" + :publishing-directory "/home/cashmere/wiki/html/" + :recursive t + :publishing-function org-html-publish-to-html + :with-toc nil + :section-numbers nil + :html-head "<link rel=\"stylesheet\" href=\"/style.css\" type=\"text/css\"/>" + :preparation-function (lambda (_) + (require 'denote-org) + (dolist (file (directory-files-recursively + "/home/cashmere/wiki/" "\\.org$")) + (with-current-buffer (find-file-noselect file) + (ignore-errors + (denote-org-extras-convert-links-to-file-type)) + (save-buffer))))))) + +(setq org-export-with-broken-links t) +#+end_src + * denote Denote is objectively the best note taking extension, which you could install. It has a very easy to parse file naming scheme and suports not only org files. It has also transclusion inclusive! if you are interested, then check it out yourself. @@ -552,6 +724,99 @@ Denote fitself focused on the last versions to have a core for note taking and t (denote-agenda-insinuate)) #+end_src +** config + +#+begin_src emacs-lisp +(defcustom my/denote-task-filename-component-regexp + "\\(?:[-_.]\\|:\\)task\\(?:[-_.]\\|:\\|$\\)" + "Regexp matching a filename component that denotes the 'task' tag. +Works on the base filename (without extension), e.g. matches \"-task\", \":task:\", \"_task_\"." + :type 'string) + +(defun my/denote--make-unique-filename (dir base ext) + "Return a unique filepath in DIR for BASE+EXT by adding -1, -2... if needed." + (let* ((extstr (if (and ext (not (string-empty-p ext))) (concat "." ext) "")) + (candidate (expand-file-name (concat base extstr) dir)) + (count 1)) + (while (file-exists-p candidate) + (setq candidate (expand-file-name (format "%s-%d%s" base count extstr) dir)) + (setq count (1+ count))) + candidate)) + +(defun my/denote-remove-task-filetag-and-silent-rename () + "If current headline became DONE in a Denote note, remove :task: filetag and remove 'task' from filename silently. +- Only acts if there are no other non-DONE TODOs in the same file. +- Does not call Denote's interactive rename command (no buffers opened)." + (when (and (derived-mode-p 'org-mode) + (string= (org-get-todo-state) "DONE") + (buffer-file-name) + ;; detect Denote note by presence of #+identifier: + (save-excursion + (goto-char (point-min)) + (re-search-forward "^#\\+identifier:" nil t))) + ;; only proceed if no other active TODOs remain in the file + (let ((has-other + (catch 'has + (org-map-entries + (lambda () + (let ((s (org-get-todo-state))) + (when (and s (not (string= s "DONE"))) + (throw 'has t)))) + nil 'file) + nil))) + (unless has-other + ;; 1) Remove :task: from #+filetags: + (save-excursion + (goto-char (point-min)) + (when (re-search-forward "^#\\+filetags:\\s-*\\(.*\\)$" nil t) + (let* ((tags (match-string 1)) + (clean (replace-regexp-in-string ":task:" "" tags)) + (clean (replace-regexp-in-string "::+" ":" clean)) + (clean (replace-regexp-in-string "^:\\|:$" "" clean))) + (if (string-empty-p clean) + (delete-region (line-beginning-position) (1+ (line-end-position))) + (beginning-of-line) + (kill-line) + (insert (concat "#+filetags: :" clean ":")))))) + ;; 2) Compute new filename (silent, non-interactive) + (let* ((file (buffer-file-name)) + (dir (file-name-directory file)) + (name (file-name-nondirectory file)) + (ext (file-name-extension name)) ;; "org" + (base (file-name-sans-extension name)) + ;; remove the task component from the base + (new-base (replace-regexp-in-string my/denote-task-filename-component-regexp + "" + base))) + (when (and new-base (not (string= new-base base))) + ;; cleanup repeated separators: convert multiple '-'/'_'/'..' to single '-' + (setq new-base (replace-regexp-in-string "[-_.:]+" + "-" + new-base)) + ;; strip leading/trailing separators + (setq new-base (replace-regexp-in-string "\\`[-_.:-]+" "" new-base)) + (setq new-base (replace-regexp-in-string "[-_.:-]+\\'" "" new-base)) + ;; ensure unique filename to avoid overwrite without prompt + (let ((target (my/denote--make-unique-filename dir new-base ext))) + (condition-case err + (progn + (rename-file file target 1) ;; 1 = ok to overwrite, but we avoid collisions by uniqueness + ;; update current buffer to visit the new filename silently + (set-visited-file-name target t t) + ;; save changes (filetags update + new filename) + (save-buffer) + (message "Denote: removed 'task' component from filename -> %s" (file-name-nondirectory target))) + (error + (message "Denote rename failed: %s" (error-message-string err))))))))))) + +(add-hook 'org-after-todo-state-change-hook #'my/denote-remove-task-filetag-and-silent-rename) +#+end_src + +** configuration + +#+begin_src emacs-lisp +#+end_src + ** denote-menu #+begin_src emacs-lisp @@ -572,6 +837,15 @@ Some goodies for better integration with org files. :ensure t) #+end_src +** consult-denote + +#+begin_src emacs-lisp +(use-package consult-denote + :straight (:host github :repo "protesilaos/consult-denote") + :ensure t + :defer t) +#+end_src + ** my/functions #+begin_src emacs-lisp @@ -600,6 +874,37 @@ Some goodies for better integration with org files. (kill-buffer))))) #+end_src +** export fn by prot himself + +#+begin_src emacs-lisp +(defvar my-org-export-output-directory-prefix "./export_") + +(defun my-org-export-create-directory (fn extension &rest args) + (let ((export-dir (format "%s%s" my-org-export-output-directory-prefix extension))) + (unless (file-directory-p export-dir) + (make-directory export-dir))) + (apply fn extension args)) + +(advice-add #'org-export-output-file-name :around #'my-org-export-create-directory) +(setq denote-excluded-directories-regexp "export_.*") +#+end_src + +** ox-json + +#+begin_src emacs-lisp +(use-package ox-json + :ensure t + ) +#+end_src + +** denote-explore + +#+begin_src emacs-lisp +(use-package denote-explore + :ensure t + ) +#+end_src + * which-key #+begin_src emacs-lisp @@ -638,6 +943,25 @@ Some goodies for better integration with org files. cand)))) #+end_src +** vertico-posframe + +#+begin_src emacs-lisp +(use-package vertico-posframe + :init + (setq vertico-posframe-parameters '((left-fringe . 12) ;; Fringes + (right-fringe . 12) + (accept-focus . t))) + ;; (undecorated . nil) ;; Rounded frame + + :config + (vertico-posframe-mode 1) + (setq vertico-posframe-width 96 ;; Narrow frame + vertico-posframe-height vertico-count ;; Default height + ;; Don't create posframe for these commands + vertico-multiform-commands '((consult-line (:not posframe)) + (consult-ripgrep (:not posframe))))) +#+end_src + * consult #+begin_src emacs-lisp @@ -775,21 +1099,19 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi :after yasnippet) #+end_src - - *** initial installation #+begin_src emacs-lisp -(straight-use-package - `(lspce :type git :host github :repo "zbelial/lspce" - :files (:defaults ,(pcase system-type - ('gnu/linux "lspce-module.so") - ('darwin "lspce-module.dylib"))) - :pre-build ,(pcase system-type - ('gnu/linux '(("cargo" "build" "--release") - ("cp" "./target/release/liblspce_module.so" "./lspce-module.so"))) - ('darwin '(("cargo" "build" "--release") - ("cp" "./target/release/liblspce_module.dylib" "./lspce-module.dylib")))))) + (straight-use-package + `(lspce :type git :host github :repo "zbelial/lspce" + :files (:defaults ,(pcase system-type + ('gnu/linux "lspce-module.so") + ('darwin "lspce-module.dylib"))) + :pre-build ,(pcase system-type + ('gnu/linux '(("cargo" "build" "--release") + ("cp" "./target/release/liblspce_module.so" "./lspce-module.so"))) + ('darwin '(("cargo" "build" "--release") + ("cp" "./target/release/liblspce_module.dylib" "./lspce-module.dylib")))))) #+end_src *** company @@ -817,7 +1139,8 @@ company is also required as an completion backend. besides that i really enjoy u (setq company-require-match nil) (setq company-backends '((company-capf :with company-yasnippet) company-files - company-dabbrev-code)) + company-dabbrev-code + )) (setq company-dabbrev-code-everywhere t) (setq company-dabbrev-code-ignore-case t)) #+end_src @@ -826,26 +1149,26 @@ company is also required as an completion backend. besides that i really enjoy u #+begin_src emacs-lisp (use-package lspce - :after (f yasnippet markdown-mode envrc) + :ensure nil :config (setq lspce-send-changes-idle-time 0.05) (setq lspce-idle-delay 0.05) (setq lspce-show-log-level-in-modeline t) (setq lspce-enable-eldoc t) (setq lspce-eldoc-enable-hover t) - (setq lspce-eldoc-enable-signature t) + (setq lspce-eldoc-enable-signature nil) + (setq lspce-enable-flymake nil) (setq lspce--doc-max-height 10) - (setq eldoc-echo-area-use-multiline-p 2) + (setq eldoc-echo-area-use-multiline-p 0) (setq eldoc-echo-area-display-truncation-message nil) - (setq lspce-log-level 5) - + (setq lspce-xref-append-implementations-to-definitions t) (setq lspce-envs-pass-to-subprocess '("PATH" "PYTHON_PATH" "NIX_PATH" "NIX_PROFILES")) - (setq lspce-server-programs `(("rust" "rust-analyzer" "" lspce-ra-initializationOptions) - ("python" "pylsp" "" ) + ("python" "pylsp" "" ) ("nix" "nixd" "" lspce-nixd-initializationOptions) ("nushell" "nu" "--lsp" "")))) + #+end_src ** nix mode @@ -860,13 +1183,13 @@ company is also required as an completion backend. besides that i really enjoy u *** nix flake function for more completion #+begin_src emacs-lisp -(defun lspce-nixd-initializationOptions () - (let ((flake-path "/home/cashmere/nix") - (config-name "x12")) - `(:nixpkgs (:expr ,(format "import (builtins.getFlake \"%s\").inputs.nixpkgs { }" flake-path)) - :formatting (:command ["nixfmt"]) - :options (:nixos (:expr ,(format "(builtins.getFlake \"%s\").nixosConfigurations.%s.options" flake-path config-name)) - :home-manager (:expr ,(format "(builtins.getFlake \"%s\").nixosConfigurations.%s.config.home-manager.users.cashmere.options" flake-path config-name)))))) + (defun lspce-nixd-initializationOptions () + (let ((flake-path "/home/cashmere/nix") + (config-name "x12")) + `(:nixpkgs (:expr ,(format "import (builtins.getFlake \"%s\").inputs.nixpkgs { }" flake-path)) + :formatting (:command ["nixfmt"]) + :options (:nixos (:expr ,(format "(builtins.getFlake \"%s\").nixosConfigurations.%s.options" flake-path config-name)) + :home-manager (:expr ,(format "(builtins.getFlake \"%s\").nixosConfigurations.%s.config.home-manager.users.cashmere.options" flake-path config-name)))))) #+end_src *** envrc @@ -888,11 +1211,13 @@ Because I have to and not want to. (use-package python-mode :ensure t :mode "\\.py\\'" - :hook ((python-mode python-ts-mode) . lspce-mode)) + :hook (python-mode . lspce-mode) + ) (use-package flymake-pyrefly :ensure t - :hook (python-base-mode . pyrefly-setup-flymake-backend)) + ;; :hook (python-base-mode . pyrefly-setup-flymake-backend) + ) (use-package python-black :ensure t @@ -911,13 +1236,26 @@ ily <3. :hook (rust-mode . lspce-mode)) #+end_src +*** Rustic + +#+begin_src emacs-lisp +;; (use-package rustic +;; :ensure t +;; :config +;; (setq rustic-format-on-save nil) +;; (setq rustic-lsp-client nil) +;; :custom +;; (rustic-cargo-use-last-stored-arguments t)) +#+end_src + ** Nushell #+begin_src emacs-lisp (use-package nushell-mode :ensure t :mode "\\.nu\\'" - :hook (nushell-mode . lspce-mode)) + ;; :hook (nushell-mode . lspce-mode) + ) #+end_src * vterm @@ -929,6 +1267,14 @@ ily <3. (setq vterm-shell "nu") #+end_src +** multi-vterm + +#+begin_src emacs-lisp +(use-package multi-vterm + :ensure t + :defer t) +#+end_src + * olivetti #+begin_src emacs-lisp @@ -966,8 +1312,15 @@ ily <3. :straight t :config (if ek-use-nerd-fonts ;; Check if nerd fonts are being used - (setopt magit-format-file-function #'magit-format-file-nerd-icons)) ;; Turns on magit nerd-icons - :defer t) + (setopt magit-format-file-function #'magit-format-file-nerd-icons)) ;; Turns on magit nerd-icons + ) +(defun my/magit-kill-buffers () + "kills all magit buffers" + (interactive) + (let ((buffers (magit-mode-get-buffers))) + (magit-restore-window-configuration) + (mapc #'kill-buffer buffers))) + #+end_src * indent-guide @@ -1016,11 +1369,20 @@ ily <3. (setq evil-want-keybinding nil) (setq evil-want-C-u-delete t) (setq evil-want-C-u-scroll t) - (setq evil-undo-system 'undo-tree) + (setq evil-undo-system 'undo-tree) + (setq evil-split-window-below t) + (setq evil-vsplit-window-right t) :config (evil-mode 1) (define-key evil-normal-state-map "u" 'undo-tree-undo) - (define-key evil-normal-state-map (kbd "C-r") 'undo-tree-redo)) + (define-key evil-normal-state-map (kbd "C-r") 'undo-tree-redo) + + (evil-set-initial-state 'help-mode 'emacs) + (evil-set-initial-state 'messages-buffer-mode 'normal) + (evil-set-initial-state 'dired-mode 'normal) + (evil-set-initial-state 'ibuffer-mode 'normal)) + +(modify-syntax-entry ?_ "w") #+end_src ** smart-parens @@ -1144,8 +1506,8 @@ ily <3. :init (setq undo-tree-visualizer-timestamps t undo-tree-visualizer-diff t - undo-tree-auto-save-history nil - undo-tree-history-directory-alist nil + undo-tree-auto-save-history t + undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo-tree-history/")) undo-limit 800000 undo-strong-limit 12000000 undo-outer-limit 120000000) @@ -1191,23 +1553,47 @@ ily <3. :straight t :ensure t :hook - (after-init . pulsar-global-mode) + ;; (after-init . pulsar-global-mode) + :init + (setq pulsar-pulse-on-window-change nil) :config (setq pulsar-pulse t) (setq pulsar-delay 0.025) (setq pulsar-iterations 10) (setq pulsar-face 'evil-ex-lazy-highlight) - (add-to-list 'pulsar-pulse-functions 'evil-scroll-down) - (add-to-list 'pulsar-pulse-functions 'flymake-goto-next-error) - (add-to-list 'pulsar-pulse-functions 'flymake-goto-prev-error) - (add-to-list 'pulsar-pulse-functions 'evil-yank) - (add-to-list 'pulsar-pulse-functions 'evil-yank-line) - (add-to-list 'pulsar-pulse-functions 'evil-delete) - (add-to-list 'pulsar-pulse-functions 'evil-delete-line) - (add-to-list 'pulsar-pulse-functions 'evil-jump-item) - (add-to-list 'pulsar-pulse-functions 'diff-hl-next-hunk) - (add-to-list 'pulsar-pulse-functions 'diff-hl-previous-hunk)) + (add-hook 'org-agenda-mode-hook + (lambda () (pulsar-mode -1))) + + (setq pulsar-pulse-functions + '(evil-scroll-down + flymake-goto-next-error + flymake-goto-prev-error + evil-yank + evil-yank-line + evil-delete + evil-delete-line + evil-jump-item + diff-hl-next-hunk + diff-hl-previous-hunk + recenter-top-bottom + move-to-window-line-top-bottom + reposition-window + bookmark-jump + other-window + delete-window + delete-other-windows + forward-page + backward-page + scroll-up-command + scroll-down-command + windmove-right + windmove-left + windmove-up + windmove-down + tab-new + tab-close + tab-next))) #+end_src * evil-org @@ -1496,6 +1882,16 @@ ily <3. :bind (:map custom-bindings-map ("C-c h m" . hide-mode-line-mode))) #+end_src +* modeline + +#+begin_src emacs-lisp +;; (use-package doom-modeline +;; :ensure t +;; :hook (after-init . doom-modeline-mode) +;; :config +;; (setq doom-modeline-buffer-file-name-style 'buffer-name)) +#+end_src + * soph #+begin_src emacs-lisp @@ -1513,18 +1909,11 @@ ily <3. (blink-cursor-mode 0) (setq-default cursor-type 'bar) -(defvar cashmere/font-height 150) - -;; (when (member "Fragment Mono" (font-family-list)) -;; (set-face-attribute 'default nil :font "Fragment Mono" :height cashmere/font-height) -;; (set-face-attribute 'fixed-pitch nil :family "Fragment Mono" :height cashmere/font-height)) +(defvar cashmere/font-height 140) -;; (when (member "Maple Mono NF" (font-family-list)) -;; (set-face-attribute 'variable-pitch nil :family "Maple Mono NF" :height cashmere/font-height)) - -(set-face-attribute 'default nil :family "MonoLisa" :weight 'semi-bold :height cashmere/font-height) -(set-face-attribute 'fixed-pitch nil :family "MonoLisa" :weight 'regular) -(set-face-attribute 'variable-pitch nil :family "MonoLisa" :weight 'regular :height 1.1) +(set-face-attribute 'default nil :family "JetBrainsMono Nerd Font" :weight 'regular :height cashmere/font-height) +(set-face-attribute 'fixed-pitch nil :family "RobotoMono Nerd Font" :weight 'regular) +(set-face-attribute 'variable-pitch nil :family "RobotoMono Nerd Font" :weight 'regular :height 1.1) (use-package mixed-pitch :straight t @@ -1539,25 +1928,172 @@ ily <3. (use-package autothemer :straight t :defer t) -(use-package doom-themes - :straight t +;; (use-package doom-themes +;; :straight t +;; :ensure t +;; :custom +;; ;; Global settings (defaults) +;; (doom-themes-enable-bold t) ; if nil, bold is universally disabled +;; (doom-themes-enable-italic t) ; if nil, italics is universally disabled +;; ;; for treemacs users +;; (doom-themes-treemacs-theme "doom-nord-light") ; use "doom-colors" for less minimal icon theme +;; :config +;; (load-theme 'doom-nord-light t) + +;; ;; Enable flashing mode-line on errors +;; (doom-themes-visual-bell-config) +;; ;; Enable custom neotree theme (nerd-icons must be installed!) +;; ;; or for treemacs users +;; (doom-themes-treemacs-config) +;; ;; Corrects (and improves) org-mode's native fontification. +;; (doom-themes-org-config)) +#+end_src + +** catppuccin-theme + +#+begin_src emacs-lisp +(use-package catppuccin-theme :ensure t - :custom - ;; Global settings (defaults) - (doom-themes-enable-bold t) ; if nil, bold is universally disabled - (doom-themes-enable-italic t) ; if nil, italics is universally disabled - ;; for treemacs users - (doom-themes-treemacs-theme "doom-nord-light") ; use "doom-colors" for less minimal icon theme + :straight t :config - (load-theme 'doom-nord-light t) + (setq catppuccin-flavor 'mocha) + + (load-theme 'catppuccin :no-confirm) - ;; Enable flashing mode-line on errors - (doom-themes-visual-bell-config) - ;; Enable custom neotree theme (nerd-icons must be installed!) - ;; or for treemacs users - (doom-themes-treemacs-config) - ;; Corrects (and improves) org-mode's native fontification. - (doom-themes-org-config)) + (custom-set-faces + `(diff-hl-change ((t (:background unspecified :foreground ,(catppuccin-get-color 'blue)))))) + + (custom-set-faces + `(diff-hl-delete ((t (:background unspecified :foreground ,(catppuccin-get-color 'red)))))) + + (custom-set-faces + `(diff-hl-insert ((t (:background unspecified :foreground ,(catppuccin-get-color 'green))))))) +#+end_src + +** modus themes/catppuccin + +#+begin_src emacs-lisp +;; (use-package modus-themes +;; :ensure nil +;; :defer t +;; :custom +;; (modus-themes-italic-constructs t) +;; (modus-themes-bold-constructs t) +;; (modus-themes-mixed-fonts nil) +;; (modus-themes-prompts '(bold intense)) +;; (modus-themes-common-palette-overrides +;; `((accent-0 "#1e66f5") +;; (accent-1 "#04a5e5") +;; (bg-active bg-main) +;; (bg-added "#d3f0d0") +;; (bg-added-refine "#b8e6b3") +;; (bg-changed "#dde5f5") +;; (bg-changed-refine "#c4d4f0") +;; (bg-completion "#ccd0da") +;; (bg-completion-match-0 "#eff1f5") +;; (bg-completion-match-1 "#eff1f5") +;; (bg-completion-match-2 "#eff1f5") +;; (bg-completion-match-3 "#eff1f5") +;; (bg-hl-line "#e6e9ef") +;; (bg-hover-secondary "#9ca0b0") +;; (bg-line-number-active unspecified) +;; (bg-line-number-inactive "#eff1f5") +;; (bg-main "#eff1f5") +;; (bg-mark-delete "#f5d9e0") +;; (bg-mark-select "#dde5f5") +;; (bg-mode-line-active "#e6e9ef") +;; (bg-mode-line-inactive "#e6e9ef") +;; (bg-prominent-err "#f5d9e0") +;; (bg-prompt unspecified) +;; (bg-prose-block-contents "#dce0e8") +;; (bg-prose-block-delimiter bg-prose-block-contents) +;; (bg-region "#9ca0b0") +;; (bg-removed "#f5d9e0") +;; (bg-removed-refine "#f0c9d1") +;; (bg-tab-bar "#eff1f5") +;; (bg-tab-current bg-main) +;; (bg-tab-other "#eff1f5") +;; (border-mode-line-active nil) +;; (border-mode-line-inactive nil) +;; (builtin "#1e66f5") +;; (comment "#7c7f93") +;; (constant "#d20f39") +;; (cursor "#dc8a78") +;; (date-weekday "#1e66f5") +;; (date-weekend "#fe640b") +;; (docstring "#5c5f77") +;; (err "#d20f39") +;; (fg-active fg-main) +;; (fg-completion "#4c4f69") +;; (fg-completion-match-0 "#1e66f5") +;; (fg-completion-match-1 "#d20f39") +;; (fg-completion-match-2 "#40a02b") +;; (fg-completion-match-3 "#fe640b") +;; (fg-heading-0 "#d20f39") +;; (fg-heading-1 "#fe640b") +;; (fg-heading-2 "#df8e1d") +;; (fg-heading-3 "#40a02b") +;; (fg-heading-4 "#04a5e5") +;; (fg-line-number-active "#7287fd") +;; (fg-line-number-inactive "#9ca0b0") +;; (fg-link "#1e66f5") +;; (fg-main "#4c4f69") +;; (fg-mark-delete "#d20f39") +;; (fg-mark-select "#1e66f5") +;; (fg-mode-line-active "#4c4f69") +;; (fg-mode-line-inactive "#9ca0b0") +;; (fg-prominent-err "#d20f39") +;; (fg-prompt "#8839ef") +;; (fg-prose-block-delimiter "#7c7f93") +;; (fg-prose-verbatim "#40a02b") +;; (fg-region "#4c4f69") +;; (fnname "#1e66f5") +;; (fringe "#eff1f5") +;; (identifier "#8839ef") +;; (info "#179299") +;; (keyword "#8839ef") +;; (keyword "#8839ef") +;; (name "#1e66f5") +;; (number "#fe640b") +;; (property "#1e66f5") +;; (string "#40a02b") +;; (type "#df8e1d") +;; (variable "#fe640b") +;; (warning "#df8e1d"))) +;; :config +;; (modus-themes-with-colors +;; (custom-set-faces +;; `(change-log-acknowledgment ((,c :foreground "#7287fd"))) +;; `(change-log-date ((,c :foreground "#40a02b"))) +;; `(change-log-name ((,c :foreground "#fe640b"))) +;; `(diff-context ((,c :foreground "#1e66f5"))) +;; `(diff-file-header ((,c :foreground "#ea76cb"))) +;; `(diff-header ((,c :foreground "#1e66f5"))) +;; `(diff-hunk-header ((,c :foreground "#fe640b"))) +;; `(gnus-button ((,c :foreground "#1e66f5"))) +;; `(gnus-group-mail-3 ((,c :foreground "#1e66f5"))) +;; `(gnus-group-mail-3-empty ((,c :foreground "#1e66f5"))) +;; `(gnus-header-content ((,c :foreground "#04a5e5"))) +;; `(gnus-header-from ((,c :foreground "#8839ef"))) +;; `(gnus-header-name ((,c :foreground "#40a02b"))) +;; `(gnus-header-subject ((,c :foreground "#1e66f5"))) +;; `(log-view-message ((,c :foreground "#7287fd"))) +;; `(match ((,c :background "#c4d4f0" :foreground "#4c4f69"))) +;; `(modus-themes-search-current ((,c :background "#d20f39" :foreground "#eff1f5"))) +;; `(modus-themes-search-lazy ((,c :background "#c4d4f0" :foreground "#4c4f69"))) +;; `(newsticker-extra-face ((,c :foreground "#7c7f93" :height 0.8 :slant italic))) +;; `(newsticker-feed-face ((,c :foreground "#d20f39" :height 1.2 :weight bold))) +;; `(newsticker-treeview-face ((,c :foreground "#4c4f69"))) +;; `(newsticker-treeview-selection-face ((,c :background "#c4d4f0" :foreground "#4c4f69"))) +;; `(tab-bar ((,c :background "#eff1f5" :foreground "#4c4f69"))) +;; `(tab-bar-tab ((,c :background "#eff1f5" :underline t))) +;; `(tab-bar-tab-group-current ((,c :background "#eff1f5" :foreground "#4c4f69" :underline t))) +;; `(tab-bar-tab-group-inactive ((,c :background "#eff1f5" :foreground "#7c7f93"))) +;; `(tab-bar-tab-inactive ((,c :background "#eff1f5" :foreground "#5c5f77"))) +;; `(vc-dir-file ((,c :foreground "#1e66f5"))) +;; `(vc-dir-header-value ((,c :foreground "#7287fd"))))) +;; :init +;; (load-theme 'modus-operandi t)) #+end_src * dirvish @@ -1598,6 +2134,7 @@ ily <3. (define-globalized-minor-mode my/global-olivetti-mode olivetti-mode (lambda () (olivetti-mode 1))) (my/centered-cursor) +(my/global-olivetti-mode) #+end_src * TODO org-modern-indent @@ -1683,19 +2220,22 @@ ily <3. :hook (pdf-view-mode . (lambda () (display-line-numbers-mode -1)))) #+end_src -* keybindings +* keymaps #+begin_src emacs-lisp -(defun my/eldoc-box-describe-and-jump () +(defun ek/lsp-describe-and-jump () (interactive) - (eldoc-box-help-at-point) - (let ((eldoc-buffer "*eldoc-box*")) - (when (get-buffer eldoc-buffer) - (switch-to-buffer-other-window eldoc-buffer)))) + (lspce-help-at-point) + (let ((help-buffer "*lsp-help*")) + (when (get-buffer help-buffer) + (switch-to-buffer-other-window help-buffer)))) +(evil-define-key 'normal 'global (kbd "K") + (if (>= emacs-major-version 31) + #'eldoc-box-help-at-point + #'ek/lsp-describe-and-jump)) (defun my/format-buffer () - "Format buffer based on major mode" (interactive) (cond ((eq major-mode 'rust-mode) (rust-format-buffer)) @@ -1709,10 +2249,11 @@ ily <3. "SPC" '((lambda () (interactive) (if (projectile-project-p) - (projectile-find-file) + (consult-projectile-find-file) (projectile-switch-project))) :wk "find file/switch project") - "sp" '(consult-ripgrep :wk "search project") + "sp" '(consult-projectile :wk "search project") + "ss" '(consult-line :wk "search project") "/" '(consult-ripgrep :wk "search project") "." '(find-file :wk "find file") "," '(consult-buffer :wk "switch buffer") @@ -1742,7 +2283,9 @@ ily <3. "pp" '(projectile-switch-project :wk "switch project") "pf" '(projectile-find-file :wk "find file") "ps" '(consult-ripgrep :wk "search") - "pb" '(consult-projectile-buffer :wk "buffers") "pk" '(projectile-kill-buffers :wk "kill buffers") "pd" '(projectile-dired :wk "root dir") + "pb" '(consult-projectile-buffer :wk "buffers") + "pk" '(projectile-kill-buffers :wk "kill buffers") + "pd" '(projectile-dired :wk "root dir") "pr" '(projectile-recentf :wk "recent files") "pa" '(projectile-add-known-project :wk "add project") "pc" '(projectile-compile-project :wk "compile") @@ -1753,14 +2296,19 @@ ily <3. "gc" '(magit-clone :wk "clone") "gg" '(magit-status :wk "status") "gl" '(magit-log-current :wk "log") - "gd" '(xref-find-definitions :wk "go to definition") + "gd" '(lsp-find-definition :wk "go to definition") + "gD" '(lsp-find-definition-other-window :wk "definition other window") + "gi" '(lsp-find-implementation :wk "go to implementation") + "gI" '((lambda () (interactive) + (let ((current-prefix-arg 4)) + (call-interactively #'lsp-find-implementation))) + :wk "implementation other window") + "gt" '(lsp-find-type-definition :wk "go to type definition") + "gr" '(lsp-find-references :wk "find references") "gs" '(magit-file-stage :wk "stage file") "gb" '(vc-annotate :wk "blame") "o" '(:ignore t :wk "open") - ;; "op" '(neotree-toggle :wk "neotree") - ;; "oP" '(dired-jump :wk "dired") - ;; "od" '(dirvish :wk "dirvish") "h" '(:ignore t :wk "help") "hm" '(describe-mode :wk "mode") @@ -1772,13 +2320,11 @@ ily <3. "w n" '(evil-window-new :wk "New window") "w s" '(evil-window-split :wk "Horizontal split window") "w v" '(evil-window-vsplit :wk "Vertical split window") - ;; Window motions "w h" '(evil-window-left :wk "Window left") "w j" '(evil-window-down :wk "Window down") "w k" '(evil-window-up :wk "Window up") "w l" '(evil-window-right :wk "Window right") "w w" '(evil-window-next :wk "Goto next window") - ;; Move Windows "w H" '(buf-move-left :wk "Buffer move left") "w J" '(buf-move-down :wk "Buffer move down") "w K" '(buf-move-up :wk "Buffer move up") @@ -1786,18 +2332,9 @@ ily <3. "c" '(:ignore t :wk "code") "ca" '(lspce-code-actions :wk "code actions") - "cx" '(consult-flymake :wk "code actions") "cr" '(lspce-rename :wk "lsp rename") "cf" '(my/format-buffer :wk "format buffer") - "m" '(:ignore t :wk "mode") - "mp" (list (lambda () - (interactive) - (shell-command (concat "prettier --write " - (shell-quote-argument (buffer-file-name)))) - (revert-buffer t t t)) - :wk "format prettier") - "q" '(:ignore t :wk "quit") "qq" '(save-buffers-kill-terminal :wk "quit emacs") "qr" '(restart-emacs :wk "restart") @@ -1806,141 +2343,6 @@ ily <3. "u" '(undo-tree-visualize :wk "undo tree") "P" '(consult-yank-from-kill-ring :wk "paste history")) -(defun my/avy-enabled-p () - (and (not (derived-mode-p 'magit-mode 'dired-mode 'ibuffer-mode)) - (not (eq major-mode 'dirvish-mode)))) - -(general-def '(normal visual) 'override - "s" (lambda () - (interactive) - (when (my/avy-enabled-p) - (let ((avy-all-windows t) - (avy-background t) - (scroll-margin 0) - (maximum-scroll-margin 0)) - (call-interactively 'evil-avy-goto-char-2))))) -#+end_src - -#+begin_src emacs-lisp -(defun my/eldoc-box-describe-and-jump () - (interactive) - (eldoc-box-help-at-point) - (let ((eldoc-buffer "*eldoc-box*")) - (when (get-buffer eldoc-buffer) - (switch-to-buffer-other-window eldoc-buffer)))) - - -(defun my/format-buffer () - "Format buffer based on major mode" - (interactive) - (cond - ((eq major-mode 'rust-mode) (rust-format-buffer)) - ((eq major-mode 'nix-mode) (nix-format-buffer)) - ((or (eq major-mode 'python-mode) - (eq major-mode 'python-ts-mode)) (python-black-buffer)) - ((eq major-mode 'c-mode) (c-indent-region (point-min) (point-max))) - (t (message "No formatter for %s" major-mode)))) - -(my-leader - "SPC" '((lambda () - (interactive) - (if (projectile-project-p) - (projectile-find-file) - (projectile-switch-project))) - :wk "find file/switch project") - "sp" '(consult-ripgrep :wk "search project") - "/" '(consult-ripgrep :wk "search project") - "." '(find-file :wk "find file") - "," '(consult-buffer :wk "switch buffer") - ":" (lambda () (interactive) (execute-extended-command nil)) - - "d" '(:ignore t :wk "denote") - "dd" '(denote-menu-list-notes t :wk "List all notes") - "dg" '(denote-grep t :wk "Search") - "dn" '(denote t :wk "Create a new note") - "dr" '(denote-rename-file t :wk "Rename Note") - - "f" '(:ignore t :wk "files") - "fd" '(dired :wk "dired") - "fD" '(dired-jump :wk "dired jump") - "fr" '(consult-recent-file :wk "recent files") - "ff" '(find-file :wk "find file") - "fs" '(save-buffer :wk "save file") - - "b" '(:ignore t :wk "buffers") - "bb" '(consult-buffer :wk "switch buffer") - "bi" '(ibuffer :wk "ibuffer") - "bd" '(kill-current-buffer :wk "kill buffer") - "bk" '(kill-current-buffer :wk "kill buffer") - "bs" '(save-buffer :wk "save buffer") - - "p" '(:ignore t :wk "project") - "pp" '(projectile-switch-project :wk "switch project") - "pf" '(projectile-find-file :wk "find file") - "ps" '(consult-ripgrep :wk "search") - "pb" '(consult-projectile-buffer :wk "buffers") "pk" '(projectile-kill-buffers :wk "kill buffers") "pd" '(projectile-dired :wk "root dir") - "pr" '(projectile-recentf :wk "recent files") - "pa" '(projectile-add-known-project :wk "add project") - "pc" '(projectile-compile-project :wk "compile") - "pt" '(projectile-test-project :wk "test") - "pi" '(projectile-invalidate-cache :wk "invalidate cache") - - "g" '(:ignore t :wk "git/goto") - "gc" '(magit-clone :wk "clone") - "gg" '(magit-status :wk "status") - "gl" '(magit-log-current :wk "log") - "gd" '(xref-find-definitions :wk "go to definition") - "gs" '(magit-file-stage :wk "stage file") - "gb" '(vc-annotate :wk "blame") - - "o" '(:ignore t :wk "open") - ;; "op" '(neotree-toggle :wk "neotree") - ;; "oP" '(dired-jump :wk "dired") - ;; "od" '(dirvish :wk "dirvish") - - "h" '(:ignore t :wk "help") - "hm" '(describe-mode :wk "mode") - "hf" '(describe-function :wk "function") - "hv" '(describe-variable :wk "variable") - "hk" '(describe-key :wk "key") - - "w c" '(evil-window-delete :wk "Close window") - "w n" '(evil-window-new :wk "New window") - "w s" '(evil-window-split :wk "Horizontal split window") - "w v" '(evil-window-vsplit :wk "Vertical split window") - ;; Window motions - "w h" '(evil-window-left :wk "Window left") - "w j" '(evil-window-down :wk "Window down") - "w k" '(evil-window-up :wk "Window up") - "w l" '(evil-window-right :wk "Window right") - "w w" '(evil-window-next :wk "Goto next window") - ;; Move Windows - "w H" '(buf-move-left :wk "Buffer move left") - "w J" '(buf-move-down :wk "Buffer move down") - "w K" '(buf-move-up :wk "Buffer move up") - "w L" '(buf-move-right :wk "Buffer move right") - - "c" '(:ignore t :wk "code") - "ca" '(lspce-code-actions :wk "code actions") - "cx" '(consult-flymake :wk "code actions") - "cr" '(lspce-rename :wk "lsp rename") - "cf" '(my/format-buffer :wk "format buffer") - - "m" '(:ignore t :wk "mode") - "mp" (list (lambda () - (interactive) - (shell-command (concat "prettier --write " - (shell-quote-argument (buffer-file-name)))) - (revert-buffer t t t)) - :wk "format prettier") - - "q" '(:ignore t :wk "quit") - "qq" '(save-buffers-kill-terminal :wk "quit emacs") - "qr" '(restart-emacs :wk "restart") - - "a" '(embark-act :wk "embark") - "u" '(undo-tree-visualize :wk "undo tree") - "P" '(consult-yank-from-kill-ring :wk "paste history")) (defun my/avy-enabled-p () (and (not (derived-mode-p 'magit-mode 'dired-mode 'ibuffer-mode)) @@ -1955,31 +2357,6 @@ ily <3. (scroll-margin 0) (maximum-scroll-margin 0)) (call-interactively 'evil-avy-goto-char-2))))) -(general-def 'normal 'override - "K" 'my/eldoc-box-describe-and-jump) - -(defun my/ibuffer-smart () - (interactive) - (ibuffer) - (local-set-key (kbd "RET") - (lambda () - (interactive) - (ibuffer-visit-buffer) - (kill-buffer "*Ibuffer*"))) - (local-set-key (kbd "q") - (lambda () - (interactive) - (kill-buffer "*Ibuffer*")))) - -(my-leader - "bi" 'my/ibuffer-smart) - -(my-local-leader - "a" '(org-agenda :wk "org agenda") - "t" '(vterm :wk "terminal") - "c" '(my/centered-cursor :wk "center cursor") - "d" '(dirvish :wk "dired") - "z" '(zoom-mode :wk "zoom/golden ratio")) (general-def 'normal 'override "]d" 'flymake-goto-next-error @@ -2005,7 +2382,50 @@ ily <3. (comment-or-uncomment-region (region-beginning) (region-end))))) +#+end_src + + + + +** org mode keymaps + +#+begin_src emacs-lisp +(my-local-leader + :keymaps 'org-mode-map + "h" '(consult-org-heading :wk "search headings") + "n" '(my-toggle-org-tree-indirect-buffer :wk "toggle narrow")) + +(my-leader + :keymaps 'org-mode-map + "c" '(:wk "Clock" :ignore) + + "cs" '(org-schedule :wk "Schedule") + "cd" '(org-deadline :wk "Deadline") + + "l" '(:wk "Link" :ignore) + "lc" '(org-cliplink :wk "Cliplink") + "li" '(org-download-clipboard :wk "Image") + "ll" '(org-insert-link :wk "Link various things") + + "t" '(org-todo :wk "TODO") + "RET" '(org-open-at-point)) +#+end_src + +** denote-menu keymaps + +#+begin_src emacs-lisp +(with-eval-after-load 'denote-menu + (general-def 'normal denote-menu-mode-map + "r" 'denote-menu-filter + "c" 'denote-menu-clear-filters + "e" 'denote-menu-export-to-dired + "o" 'denote-menu-filter-out-keyword)) +#+end_src + +** dirvish keymaps + +#+begin_src emacs-lisp (general-def 'normal dirvish-mode-map "?" 'dirvish-dispatch "q" 'dirvish-quit @@ -2035,29 +2455,23 @@ ily <3. "s" 'dirvish-symlink "S" 'dirvish-relative-symlink "h" 'dirvish-hardlink) +#+end_src -(my-local-leader - :keymaps 'org-mode-map - "h" '(consult-org-heading :wk "search headings") - "n" '(my-toggle-org-tree-indirect-buffer :wk "toggle narrow")) - -(general-def 'normal eat-mode-map - "C-l" 'eat-reset) - -(define-key minibuffer-local-map [escape] 'abort-recursive-edit) -(define-key minibuffer-local-ns-map [escape] 'abort-recursive-edit) -(define-key minibuffer-local-completion-map [escape] 'abort-recursive-edit) -(define-key minibuffer-local-must-match-map [escape] 'abort-recursive-edit) -(define-key minibuffer-local-isearch-map [escape] 'abort-recursive-edit) +** local leader -(defun delete-word (arg) - (interactive "p") - (delete-region (point) (progn (forward-word arg) (point)))) +#+begin_src emacs-lisp +(my-local-leader + "a" '(org-agenda :wk "org agenda") + "t" '(multi-vterm :wk "terminal") + "c" '(my/centered-cursor :wk "center cursor") + "d" '(dirvish :wk "dired") + "z" '(zoom-mode :wk "zoom/golden ratio") + "m" '(mu4e :wk "mail")) +#+end_src -(defun backward-delete-word (arg) - (interactive "p") - (delete-word (- arg))) +** convenient keys +#+begin_src emacs-lisp (global-set-key (kbd "M-<delete>") 'delete-word) (global-set-key (kbd "M-<backspace>") 'backward-delete-word) (global-set-key (kbd "C-<delete>") 'delete-word) @@ -2158,6 +2572,21 @@ ily <3. (add-hook 'message-send-mail-hook 'mu4e-set-msmtp-account)) #+end_src +* ibuffer big window + +#+begin_src emacs-lisp + +#+end_src + +* profiler + +#+begin_src emacs-lisp +;; (profiler-start 'cpu) +;; (org-agenda nil "c") +;; (profiler-report) +;; (profiler-stop) +#+end_src + * provide init #+begin_src emacs-lisp |
