summaryrefslogtreecommitdiff
path: root/config.org
diff options
context:
space:
mode:
Diffstat (limited to 'config.org')
-rw-r--r--config.org397
1 files changed, 288 insertions, 109 deletions
diff --git a/config.org b/config.org
index 143724e..f538060 100644
--- a/config.org
+++ b/config.org
@@ -147,37 +147,50 @@
:group 'appearance)
#+end_src
+* wayland clipboard fix
+
+#+begin_src emacs-lisp
+(setq wl-copy-process nil)
+(defun wl-copy (text)
+ (setq wl-copy-process (make-process :name "wl-copy"
+ :buffer nil
+ :command '("wl-copy" "-f" "-n")
+ :connection-type 'pipe
+ :noquery t))
+ (process-send-string wl-copy-process text)
+ (process-send-eof wl-copy-process))
+(defun wl-paste ()
+ (if (and wl-copy-process (process-live-p wl-copy-process))
+ nil ; should return nil if we're the current paste owner
+ (shell-command-to-string "wl-paste -n | tr -d \r")))
+(setq interprogram-cut-function 'wl-copy)
+(setq interprogram-paste-function 'wl-paste)
+#+end_src
+
* window
#+begin_src emacs-lisp
(use-package window
:straight nil
- :ensure nil ;; This is built-in, no need to fetch it.
+ :ensure nil
: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\\|Occur\\|eldoc.*\\)\\*"
+ ("\\*\\(Backtrace\\|Warnings\\|Compile-Log\\|[Hh]elp\\|Messages\\|Bookmark List\\|Occur\\)\\*"
(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\\)\\*"
+ ("\\*\\(eldoc\\)\\*"
(display-buffer-in-side-window)
(window-height . 0.25)
(side . bottom)
- (slot . 0))
+ (slot . 1)
+ (window-parameters . ((no-delete-other-windows . t)))
+ (body-function . (lambda (window)
+ (select-window window))))
- ;; Configuration for displaying various diagnostic buffers on
- ;; bottom 25%:
("\\*\\(Flymake diagnostics\\|xref\\|ivy\\|Swiper\\|Completions\\)"
(display-buffer-in-side-window)
(window-height . 0.25)
@@ -304,13 +317,102 @@
("C-c ^ p" . smerge-previous))) ;; Move to the previous conflict.
#+end_src
-* eldoc
+* auth-source
+
+#+begin_src emacs-lisp
+(use-package auth-source
+ :straight nil
+ :ensure nil ;; This is built-in, no need to fetch it.
+ :defer t
+ :config
+ ;; Enable password-store integration for secure API key retrieval.
+ (when (require 'auth-source-pass nil t)
+ (auth-source-pass-enable)
+ ;; Add password-store explicitly to auth-sources for compatibility.
+ (add-to-list 'auth-sources 'password-store)
+ ;; Optional: Cache expires after 5 minutes for security.
+ (setq auth-source-cache-expiry 300)))
+#+end_src
+
+* dashboard
+
+#+begin_src emacs-lisp
+(use-package dashboard
+ :ensure t
+ :config
+ (dashboard-setup-startup-hook))
+#+end_src
+
+** config
+
+#+begin_src emacs-lisp
+(defun agenda-home ()
+ (interactive)
+ (org-agenda-list 1)
+ (delete-other-windows))
+
+(add-hook 'server-after-make-frame-hook #'agenda-home)
+
+(defun refresh-agenda-periodic-function ()
+ "Recompute the Org Agenda buffer(s) periodically."
+ (ignore-errors
+ (when (get-buffer "*Org Agenda*")
+ (with-selected-window (get-buffer-window "*Org Agenda*")
+ (org-agenda-redo-all)))))
+
+;; Refresh agenda every minute.
+(run-with-timer 60 60 'refresh-agenda-periodic-function)
+
+(setq org-agenda-current-time-string "now - - - - - - -")
+
+(custom-set-faces
+ '(org-agenda-current-time ((t (:foreground "red")))))
+
+;; (defun rlr/agenda-links ()
+;; (end-of-buffer)
+;; (insert-file-contents "/Path to Org Directory/agenda-links.org")
+;; (while (org-activate-links (point-max))
+;; (goto-char (match-end 0)))
+;; (beginning-of-buffer))
+
+;; (add-hook 'org-agenda-finalize-hook #'rlr/agenda-links)
+
+(setq org-return-follows-link t)
+
+(setopt org-link-elisp-skip-confirm-regexp "rlr.*")
+
+#+end_src
+
+* gptel
+
+#+begin_src emacs-lisp
+(use-package gptel
+ :ensure t ;; Install from MELPA if not present.
+ :defer t
+ :config
+ ;; Define OpenRouter backend using gptel-make-openai with custom host and endpoint.
+ (setq my/openrouter-backend
+ (gptel-make-openai
+ "OpenRouter" ; Any name you want
+ :host "openrouter.ai"
+ :endpoint "/api/v1/chat/completions"
+ :stream t
+ :key (lambda () (auth-source-pass-get 'secret "openrouter-api")) ; Retrieves from pass entry
+ :models '(x-ai/grok-code-fast-1)))
+
+ ;; Set backend, default mode, and list of backends.
+ (setq gptel-backend my/openrouter-backend)
+ (setq gptel-default-mode 'org-mode)
+ (setq gptel-backends (list my/openrouter-backend)))
+#+end_src
+
+* COMMENT eldoc
#+begin_src emacs-lisp
(use-package eldoc
:straight nil
- :ensure nil ;; This is built-in, no need to fetch it.
- :after lspce-mode
+ :ensure t ;; This is built-in, no need to fetch it.
+ ;; :after eglot
: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
@@ -357,18 +459,33 @@
* flycheck
#+begin_src emacs-lisp
-(use-package flycheck
- :ensure t
- :config
- (add-hook 'after-init-hook #'global-flycheck-mode))
+;; (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
+;; (use-package flycheck-rust
+;; :ensure t
+;; :config
+;; (setq flycheck-rust-check-tests nil)
+;; (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
+#+end_src
+
+** flyover
+
+#+begin_src emacs-lisp
+(use-package flyover
:ensure t
- :hook (flycheck-mode . flycheck-rust-setup))
+ :hook (flycheck-mode-hook . flyover-mode)
+ :config
+ (setq flyover-levels '(error warning info))
+ (setq flyover-checkers '(flymake))
+ (setq flyover-use-theme-colors t))
+
#+end_src
* xref
@@ -501,7 +618,7 @@ Old config
;; (search . " %i ")))
#+end_src
-** org-capture
+* org-capture
*** yequake
@@ -1066,19 +1183,56 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
* programming
+** eglot
+
+#+begin_src emacs-lisp
+(use-package eglot
+ :straight nil
+ :ensure nil
+ :config
+ (setq eglot-autoshutdown t)
+ (setq eglot-sync-connect 1)
+ (setq eglot-send-changes-idle-time 0.1)
+ (setq eglot-sync-connect nil)
+ (setq eglot-connect-timeout nil)
+ (setq eglot-events-buffer-size 0)
+ (setq eglot-report-progress nil)
+
+ (add-hook 'eglot-managed-mode-hook
+ (lambda () (eglot-inlay-hints-mode -1)))
+
+ (setq eglot-ignored-server-capabilities
+ '(:inlayHintProvider :documentHighlightProvider)))
+;; (setq eldoc-echo-area-use-multiline-p nil)
+;; (setq eldoc-idle-delay 10000)
+#+end_src
+
+*** settings
+
+#+begin_src emacs-lisp
+#+end_src
+
+*** eglot booster
+
+#+begin_src emacs-lisp
+(use-package eglot-booster
+ :ensure t
+ :straight ( eglot-booster :type git :host nil :repo "https://github.com/jdtsmith/eglot-booster")
+ :after eglot
+ :config (eglot-booster-mode))
+#+end_src
+
** typst-mode
#+begin_src emacs-lisp
(use-package typst-ts-mode
:straight t
:mode "\\.typ\\'"
- ;; :hook (typst-ts-mode . eglot-ensure)
+ :hook (typst-ts-mode . eglot-ensure)
:config
- :defer t
- ;; (with-eval-after-load 'eglot
- ;; (add-to-list 'eglot-server-programs
- ;; `(typst-ts-mode . ,(eglot-alternatives '("tinymist" "typst-lsp")))))
- )
+ (with-eval-after-load 'eglot
+ (add-to-list 'eglot-server-programs
+ typst-ts-mode . ,(eglot-alternatives '("tinymist")))))
#+end_src
** lspce
@@ -1102,16 +1256,16 @@ completion-category-overrides '((file (styles partial-completion))))) ;; Customi
*** 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
@@ -1145,51 +1299,29 @@ company is also required as an completion backend. besides that i really enjoy u
(setq company-dabbrev-code-ignore-case t))
#+end_src
-*** major config
-
-#+begin_src emacs-lisp
-(use-package lspce
- :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 nil)
- (setq lspce-enable-flymake nil)
- (setq lspce--doc-max-height 10)
- (setq eldoc-echo-area-use-multiline-p 0)
- (setq eldoc-echo-area-display-truncation-message nil)
- (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" "" )
- ("nix" "nixd" "" lspce-nixd-initializationOptions)
- ("nushell" "nu" "--lsp" ""))))
-
-#+end_src
-
** nix mode
#+begin_src emacs-lisp
(use-package nix-mode
:ensure t
:mode "\\.nix\\'"
- :hook (nix-mode . lspce-mode))
+ :hook (nix-mode . eglot-ensure)
+ :config
+ (with-eval-after-load 'eglot
+ (add-to-list 'eglot-server-programs
+ '(nix-mode . ("nixd")))))
#+end_src
*** 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
@@ -1211,13 +1343,14 @@ Because I have to and not want to.
(use-package python-mode
:ensure t
:mode "\\.py\\'"
- :hook (python-mode . lspce-mode)
- )
+ :hook (python-mode . eglot-ensure)
+ :config
+ (with-eval-after-load 'eglot
+ (add-to-list 'eglot-server-programs
+ '(python-mode . ("pyright-langserver" "--stdio")))))
(use-package flymake-pyrefly
- :ensure t
- ;; :hook (python-base-mode . pyrefly-setup-flymake-backend)
- )
+ :ensure t)
(use-package python-black
:ensure t
@@ -1233,7 +1366,12 @@ ily <3.
(use-package rust-mode
:ensure t
:mode "\\.rs\\'"
- :hook (rust-mode . lspce-mode))
+ :hook (rust-mode . eglot-ensure)
+ :config
+ (with-eval-after-load 'eglot
+ (add-to-list 'eglot-server-programs
+ '((rust-ts-mode rust-mode) .
+ ("rust-analyzer" :initializationOptions (:check (:command "clippy")))))))
#+end_src
*** Rustic
@@ -1377,6 +1515,16 @@ ily <3.
(define-key evil-normal-state-map "u" 'undo-tree-undo)
(define-key evil-normal-state-map (kbd "C-r") 'undo-tree-redo)
+ (setq select-enable-clipboard nil)
+
+ (evil-define-operator my-evil-yank-to-clipboard (beg end type register yank-handler)
+ (interactive "<R><x><y>")
+ (let ((select-enable-clipboard t))
+ (evil-yank beg end type register yank-handler)))
+
+ (define-key evil-normal-state-map (kbd "Y") 'my-evil-yank-to-clipboard)
+ (define-key evil-visual-state-map (kbd "Y") 'my-evil-yank-to-clipboard)
+
(evil-set-initial-state 'help-mode 'emacs)
(evil-set-initial-state 'messages-buffer-mode 'normal)
(evil-set-initial-state 'dired-mode 'normal)
@@ -1482,7 +1630,6 @@ ily <3.
:general
;; (general-nmap "s" 'avy-goto-char-timer)
;; (general-omap "s" 'evil-avy-goto-char-timer)
-
:config
(setq avy-all-windows t
avy-all-windows-alt t
@@ -2178,7 +2325,8 @@ ily <3.
projectile-enable-caching t
projectile-indexing-method 'alien
projectile-sort-order 'recentf
- projectile-require-project-root nil))
+ projectile-require-project-root nil
+ projectile-globally-ignored-buffers '("\\*magit.*")))
#+end_src
** consult projectile
@@ -2230,19 +2378,34 @@ ily <3.
(when (get-buffer help-buffer)
(switch-to-buffer-other-window help-buffer))))
-(evil-define-key 'normal 'global (kbd "K")
+(defun my/eldoc-and-jump ()
+ (interactive)
(if (>= emacs-major-version 31)
- #'eldoc-box-help-at-point
- #'ek/lsp-describe-and-jump))
+ (eldoc-box-help-at-point)
+ (eldoc-doc-buffer))
+ (when-let ((eldoc-win (get-buffer-window "*eldoc*")))
+ (select-window eldoc-win)))
+
+(evil-define-key 'normal 'global (kbd "K") #'my/eldoc-and-jump)
+
+(defun my/setup-eldoc-hover-keys ()
+ (when (string-match-p "\\*eldoc\\*" (buffer-name))
+ (evil-normalize-keymaps)
+ (evil-local-set-key 'normal (kbd "q") 'quit-window)))
+
+(add-hook 'buffer-list-update-hook #'my/setup-eldoc-hover-keys)
+
+(evil-define-key 'normal 'global (kbd "K") #'my/eldoc-and-jump)
(defun my/format-buffer ()
(interactive)
(cond
- ((eq major-mode 'rust-mode) (rust-format-buffer))
- ((eq major-mode 'nix-mode) (nix-format-buffer))
+ ((eq major-mode 'rust-mode) (eglot-format-buffer))
+ ((eq major-mode 'nix-mode) (eglot-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)))
+ (eq major-mode 'python-ts-mode)) (eglot-format-buffer))
+ ((eq major-mode 'c-mode) (eglot-format-buffer))
+ ((bound-and-func-p eglot--managed-mode) (eglot-format-buffer))
(t (message "No formatter for %s" major-mode))))
(my-leader
@@ -2296,15 +2459,18 @@ ily <3.
"gc" '(magit-clone :wk "clone")
"gg" '(magit-status :wk "status")
"gl" '(magit-log-current :wk "log")
- "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")
+ "gd" '(xref-find-definitions :wk "go to definition")
+ "gD" '((lambda () (interactive)
+ (let ((current-prefix-arg 4))
+ (call-interactively #'xref-find-definitions)))
+ :wk "definition other window")
+ "gi" '(eglot-find-implementation :wk "go to implementation")
"gI" '((lambda () (interactive)
(let ((current-prefix-arg 4))
- (call-interactively #'lsp-find-implementation)))
+ (call-interactively #'eglot-find-implementation)))
:wk "implementation other window")
- "gt" '(lsp-find-type-definition :wk "go to type definition")
- "gr" '(lsp-find-references :wk "find references")
+ "gt" '(eglot-find-typeDefinition :wk "go to type definition")
+ "gr" '(xref-find-references :wk "find references")
"gs" '(magit-file-stage :wk "stage file")
"gb" '(vc-annotate :wk "blame")
@@ -2316,6 +2482,7 @@ ily <3.
"hv" '(describe-variable :wk "variable")
"hk" '(describe-key :wk "key")
+ "w w" '(evil-window-next :wk "Close window")
"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")
@@ -2331,9 +2498,9 @@ ily <3.
"w L" '(buf-move-right :wk "Buffer move right")
"c" '(:ignore t :wk "code")
- "ca" '(lspce-code-actions :wk "code actions")
- "cr" '(lspce-rename :wk "lsp rename")
- "cf" '(my/format-buffer :wk "format buffer")
+ "ca" '(eglot-code-actions :wk "code actions")
+ "cr" '(eglot-rename :wk "lsp rename")
+ "cf" '(eglot-format :wk "format buffer")
"q" '(:ignore t :wk "quit")
"qq" '(save-buffers-kill-terminal :wk "quit emacs")
@@ -2351,12 +2518,13 @@ ily <3.
(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)))))
+ (if (derived-mode-p 'magit-mode)
+ (call-interactively 'magit-stage)
+ (when (my/avy-enabled-p)
+ (let ((scroll-margin 0)
+ (maximum-scroll-margin 0))
+ (call-interactively 'evil-avy-goto-char-2))))))
+
(general-def 'normal 'override
"]d" 'flymake-goto-next-error
@@ -2466,16 +2634,15 @@ ily <3.
"c" '(my/centered-cursor :wk "center cursor")
"d" '(dirvish :wk "dired")
"z" '(zoom-mode :wk "zoom/golden ratio")
- "m" '(mu4e :wk "mail"))
+ "m" '(mu4e :wk "mail")
+ "p" '(pass :wk "pass")
+ "o" '(my/global-olivetti-mode :wk "center buffer")
+ "g" '(gptel :wk "gptel"))
#+end_src
** 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)
-(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)
#+end_src
@@ -2572,6 +2739,15 @@ ily <3.
(add-hook 'message-send-mail-hook 'mu4e-set-msmtp-account))
#+end_src
+* clipetty
+
+#+begin_src emacs-lisp
+(use-package clipetty
+ :ensure t
+ :hook (after-init . global-clipetty-mode))
+
+#+end_src
+
* ibuffer big window
#+begin_src emacs-lisp
@@ -2587,8 +2763,11 @@ ily <3.
;; (profiler-stop)
#+end_src
+* org-db-v3
+
* provide init
#+begin_src emacs-lisp
(provide 'init)
#+end_src
+