From 2a4f2cfb7390a109c458fb103195a679aab6c443 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Wed, 29 Nov 2023 09:49:44 -0600 Subject: [PATCH] ai and ui --- README.org | 135 +++++++++++++++++++++++++++++++++++++---------------- init.el | 110 +++++++++++++++++++++++++++++-------------- 2 files changed, 168 insertions(+), 77 deletions(-) diff --git a/README.org b/README.org index 48d0d8c6..af7545bb 100644 --- a/README.org +++ b/README.org @@ -6,6 +6,7 @@ - [[#startup-performance][Startup Performance]] - [[#set-basic-ui-config][Set basic UI config]] - [[#lets-bootstrap-straightel][Let's bootstrap straight.el]] + - [[#other-ui][Other UI]] - [[#fix-nixos][Fix NixOS]] - [[#spell-check][Spell Check]] - [[#proced][Proced]] @@ -14,6 +15,8 @@ - [[#ligatures][Ligatures]] - [[#keybindings][Keybindings]] - [[#org-mode][Org Mode]] + - [[#ai][AI]] + - [[#jinx][Jinx]] - [[#emoji][Emoji]] - [[#undo-tree][Undo-Tree]] - [[#undo-fu][Undo-Fu]] @@ -272,6 +275,25 @@ Command-log-mode :commands command-log-mode) #+end_src +This bit of code reloads emacs packages after updating nix. +#+begin_src emacs-lisp + (defun chris/home-manager-reload () + (interactive) + (let* ((which-emacs (shell-command-to-string "nix-store --query $(which emacs)")) + (pattern (rx "newLoadPath+=(/nix/store/" + (group (* any)) + "-emacs-packages-deps/share/emacs/site-lisp)")) + (current-deps (when (string-match pattern which-emacs) + (match-string 1 which-emacs))) + (subdirs (concat "/nix/store/" current-deps "-emacs-packages-deps/share/emacs/site-lisp/subdirs.el")) + (native (concat "/nix/store/" current-deps "-emacs-packages-deps/share/emacs/native-lisp/"))) + (load-file subdirs) + (when (boundp 'native-comp-eln-load-path) + (add-to-list 'native-comp-eln-load-path native)))) +#+end_src + +** Other UI + All the icons is super pretty and needed for doom-modeline. #+begin_src emacs-lisp (use-package all-the-icons) @@ -306,39 +328,6 @@ Probably the prettiest and best modeline I've found. nano-modeline-prefix 'icon)) #+end_src -#+begin_src emacs-lisp -(use-package mini-echo - :init - (mini-echo-mode 1) - (setq mini-echo-default-segments '(:long - ("evil" "major-mode" "buffer-name" "vcs" "buffer-position" "buffer-size" - "flymake" "process" "selection-info" "narrow" "macro" "profiler") - :short - ("buffer-name-short" "buffer-position" "process" "profiler" - "selection-info" "narrow" "macro")) - mini-echo-rules '((org-mode :long - (("evil" . 1) - ("major-mode" . 2) - ("buffer-name" . 3) - ("word-count" . 4)))) - mini-echo-right-padding 0 - mini-echo-buffer-status-style 'both) - - - (defun chris/mini-echo-minibuffer-width-lessp () - "Return non-nil if current minibuffer window width less than 120." - (< (mini-echo-minibuffer-width) 100)) - - (setq mini-echo-short-style-predicate 'chris/mini-echo-minibuffer-width-lessp) - - :config - (defun chris/toggle-mode-lines () - "Switch between doom and mini-echo" - (interactive) - (if mini-echo-mode - (eval (mini-echo-mode 0) (doom-modeline-mode 1)) - (eval (doom-modeline-mode 0) (mini-echo-mode 1))))) -#+end_src Again, doom is pretty and I have fallen in love with the snazzy theme and use it about anywhere I can. #+begin_src emacs-lisp @@ -370,6 +359,42 @@ Let's make parens and other delimiters easier to tell apart by making nested one (which-key-mode)) #+end_src +*** Mini Echo + +#+begin_src emacs-lisp +(use-package mini-echo + :init + (mini-echo-mode 1) + (setq mini-echo-default-segments '(:long + ("evil" "major-mode" "buffer-name" "vcs" "buffer-position" "buffer-size" + "flymake" "process" "selection-info" "narrow" "macro" "profiler") + :short + ("buffer-name-short" "buffer-position" "process" "profiler" + "selection-info" "narrow" "macro")) + mini-echo-rules '((org-mode :long + (("evil" . 1) + ("major-mode" . 2) + ("buffer-name" . 3) + ("word-count" . 4)))) + mini-echo-right-padding 0 + mini-echo-buffer-status-style 'both + mini-echo-update-interval 0.2) + + + (defun chris/mini-echo-minibuffer-width-lessp () + "Return non-nil if current minibuffer window width less than 120." + (< (mini-echo-minibuffer-width) 100)) + + (setq mini-echo-short-style-predicate 'chris/mini-echo-minibuffer-width-lessp) + + :config + (defun chris/toggle-mode-lines () + "Switch between doom and mini-echo" + (interactive) + (if mini-echo-mode + (eval (mini-echo-mode 0) (doom-modeline-mode 1)) + (eval (doom-modeline-mode 0) (mini-echo-mode 1))))) +#+end_src ** Fix NixOS I am currently using NixOS. In order for emacs to have access to certain programs, we need to set some environment variables #+begin_src emacs-lisp :tangle no @@ -403,7 +428,7 @@ I am currently using NixOS. In order for emacs to have access to certain program (when (boundp 'native-comp-eln-load-path) (add-to-list 'native-comp-eln-load-path (expand-file-name "native-lisp/" store-path))))) -(add-to-list 'native-comp-eln-load-path (expand-file-name "native-lisp/" "/nix/store/4fcbabjigcwvxv0idh2ik0ml80lq7m49-emacs-bluetooth-0.3.1/")) +(add-to-list 'native-comp-eln-load-path (expand-file-name "native-lisp/" "/nix/store/iczsbrl9z6whxs55mrpmvq45mb8s0qbx-emacs-ellama-20231105.1147/")) #+end_src Also due to using greetd, emacs isn't started with the environment from the system, so let's make sure it knows which wayland display we are using @@ -570,7 +595,8 @@ This evil-collection package includes a lot of other evil based things. (defun chris/open-bible () "find a bible to open" (interactive) - (find-file "~/org/bibles/")) + (find-file "~/org/bibles/esv.org") + ) (defun chris/transpose-lines (arg) "Moves the current line or region and follows" @@ -1207,7 +1233,7 @@ We also need to setup some capture templates to use some specific setups with my (setq org-roam-directory "~/org" org-roam-buffer-width 0.25 org-roam-list-files-commands '(fd rg find fdfind) - org-roam-file-exclude-regexp '(".stversion/|logseq/|presentations/|.stfolder/|.*~.*|.*sync.*") + org-roam-file-exclude-regexp '(".stversion/|logseq/|presentations/|.stfolder/|.*~.*|.*sync.*|bibles/") org-roam-db-location "~/.emacs.d/org-roam.db" org-roam-completion-everywhere t org-roam-dailies-directory "dailies/" @@ -1966,7 +1992,7 @@ I'm going to start a website for my own ramblings, tutorials and links. To do th org-hugo-section "blog")) #+end_src -*** AI +** AI GPTEL is a package that uses chatGPT to get some text generation in org-mode #+begin_src emacs-lisp :tangle no (use-package gptel @@ -1981,7 +2007,23 @@ GPTEL is a package that uses chatGPT to get some text generation in org-mode #+begin_ai is emacs the best? #+end_ai -*** Jinx + +*** Ellama +Idk, let's try this i guess + +#+begin_src emacs-lisp +(use-package ellama + :init + (require 'llm-ollama) + (setopt ellama-buffer-mode 'org-mode + ellama-user-nick "Chris" + ellama-assistant-nick "Jeeves" + ellama-provider + (make-llm-ollama + :chat-model "zephyr:7b-chat-q4_0" :embedding-model "zephyr:7b-chat-q4_0"))) +#+end_src + +** Jinx Jinx is an enchanted spell checker for emacs. I think I'll just turn it on globally for a while and see how I feel. #+begin_src emacs-lisp (use-package jinx @@ -2373,7 +2415,7 @@ Consult has a lot of nice functions like Ivy's Counsel functions (enhanced searc (use-package consult :after vertico :config - (setq consult-narrow-key "C-n" + (setq consult-narrow-key "<" consult-project-root-function 'projectile-project-root) (consult-customize @@ -2398,7 +2440,17 @@ Consult has a lot of nice functions like Ivy's Counsel functions (enhanced searc "." ))) (consult-ripgrep))) + + (setq consult-imenu-config + '((emacs-lisp-mode :toplevel "Functions" :types + ((102 "Functions" font-lock-function-name-face) + (109 "Macros" font-lock-function-name-face) + (112 "Packages" font-lock-constant-face) + (116 "Types" font-lock-type-face) + (118 "Variables" font-lock-variable-name-face))))) + (setq xref-show-xrefs-function 'consult-xref) + :general (chris/leader-keys @@ -2409,6 +2461,7 @@ Consult has a lot of nice functions like Ivy's Counsel functions (enhanced searc "sf" 'consult-find "sm" 'bookmark-jump "sf" 'consult-flymake + "sx" 'xref-show-xrefs "sy" 'consult-yank-from-kill-ring "sb" 'consult-eglot-symbols)) #+end_src @@ -3137,7 +3190,8 @@ I'd like to start learning and using rust if I can. :states 'normal :keymaps '(rustic-mode override) "gc" 'rustic-compile - "gr" 'projectile-run-project)) + "gr" 'projectile-run-project + "si" 'consult-imenu-multi)) #+end_src #+begin_src emacs-lisp @@ -4126,7 +4180,6 @@ Emulate a terminal (display-line-numbers-mode -1)) (add-hook 'vterm-mode-hook 'chris/vterm-setup) #+end_src - ** Sly Using sly makes a lot better common-lisp interaction within emacs. #+begin_src emacs-lisp diff --git a/init.el b/init.el index 80b35371..d97896bd 100644 --- a/init.el +++ b/init.el @@ -110,6 +110,20 @@ (use-package command-log-mode :commands command-log-mode) + (defun chris/home-manager-reload () + (interactive) + (let* ((which-emacs (shell-command-to-string "nix-store --query $(which emacs)")) + (pattern (rx "newLoadPath+=(/nix/store/" + (group (* any)) + "-emacs-packages-deps/share/emacs/site-lisp)")) + (current-deps (when (string-match pattern which-emacs) + (match-string 1 which-emacs))) + (subdirs (concat "/nix/store/" current-deps "-emacs-packages-deps/share/emacs/site-lisp/subdirs.el")) + (native (concat "/nix/store/" current-deps "-emacs-packages-deps/share/emacs/native-lisp/"))) + (load-file subdirs) + (when (boundp 'native-comp-eln-load-path) + (add-to-list 'native-comp-eln-load-path native)))) + (use-package all-the-icons) (use-package doom-modeline @@ -130,38 +144,6 @@ (with-selected-frame frame (setq doom-modeline-icon t)))))) -(use-package mini-echo - :init - (mini-echo-mode 1) - (setq mini-echo-default-segments '(:long - ("evil" "major-mode" "buffer-name" "vcs" "buffer-position" "buffer-size" - "flymake" "process" "selection-info" "narrow" "macro" "profiler") - :short - ("buffer-name-short" "buffer-position" "process" "profiler" - "selection-info" "narrow" "macro")) - mini-echo-rules '((org-mode :long - (("evil" . 1) - ("major-mode" . 2) - ("buffer-name" . 3) - ("word-count" . 4)))) - mini-echo-right-padding 0 - mini-echo-buffer-status-style 'both) - - - (defun chris/mini-echo-minibuffer-width-lessp () - "Return non-nil if current minibuffer window width less than 120." - (< (mini-echo-minibuffer-width) 100)) - - (setq mini-echo-short-style-predicate 'chris/mini-echo-minibuffer-width-lessp) - - :config - (defun chris/toggle-mode-lines () - "Switch between doom and mini-echo" - (interactive) - (if mini-echo-mode - (eval (mini-echo-mode 0) (doom-modeline-mode 1)) - (eval (doom-modeline-mode 0) (mini-echo-mode 1))))) - (use-package doom-themes :ensure t :init (load-theme 'doom-snazzy t)) @@ -180,6 +162,39 @@ (setq which-key-idle-delay 0.3) (which-key-mode)) +(use-package mini-echo + :init + (mini-echo-mode 1) + (setq mini-echo-default-segments '(:long + ("evil" "major-mode" "buffer-name" "vcs" "buffer-position" "buffer-size" + "flymake" "process" "selection-info" "narrow" "macro" "profiler") + :short + ("buffer-name-short" "buffer-position" "process" "profiler" + "selection-info" "narrow" "macro")) + mini-echo-rules '((org-mode :long + (("evil" . 1) + ("major-mode" . 2) + ("buffer-name" . 3) + ("word-count" . 4)))) + mini-echo-right-padding 0 + mini-echo-buffer-status-style 'both + mini-echo-update-interval 0.2) + + + (defun chris/mini-echo-minibuffer-width-lessp () + "Return non-nil if current minibuffer window width less than 120." + (< (mini-echo-minibuffer-width) 100)) + + (setq mini-echo-short-style-predicate 'chris/mini-echo-minibuffer-width-lessp) + + :config + (defun chris/toggle-mode-lines () + "Switch between doom and mini-echo" + (interactive) + (if mini-echo-mode + (eval (mini-echo-mode 0) (doom-modeline-mode 1)) + (eval (doom-modeline-mode 0) (mini-echo-mode 1))))) + (setenv "WAYLAND_DISPLAY" (if (string= (getenv "XDG_CURRENT_DESKTOP") "Hyprland") "wayland-1" "wayland-0")) @@ -287,7 +302,8 @@ (defun chris/open-bible () "find a bible to open" (interactive) - (find-file "~/org/bibles/")) + (find-file "~/org/bibles/esv.org") + ) (defun chris/transpose-lines (arg) "Moves the current line or region and follows" @@ -886,7 +902,7 @@ much faster. The hope is to also make this a faster version of imenu." (setq org-roam-directory "~/org" org-roam-buffer-width 0.25 org-roam-list-files-commands '(fd rg find fdfind) - org-roam-file-exclude-regexp '(".stversion/|logseq/|presentations/|.stfolder/|.*~.*|.*sync.*") + org-roam-file-exclude-regexp '(".stversion/|logseq/|presentations/|.stfolder/|.*~.*|.*sync.*|bibles/") org-roam-db-location "~/.emacs.d/org-roam.db" org-roam-completion-everywhere t org-roam-dailies-directory "dailies/" @@ -1577,6 +1593,16 @@ Optional BACKEND must be `re-reveal' or a backend derived from it." async subtreep visible-only body-only ext-plist)) file))) +(use-package ellama + :init + (require 'llm-ollama) + (setopt ellama-buffer-mode 'org-mode + ellama-user-nick "Chris" + ellama-assistant-nick "Jeeves" + ellama-provider + (make-llm-ollama + :chat-model "zephyr:7b-chat-q4_0" :embedding-model "zephyr:7b-chat-q4_0"))) + (use-package jinx ;; :hook (emacs-startup . global-jinx-mode) :init (flyspell-mode -1) @@ -1761,7 +1787,7 @@ Optional BACKEND must be `re-reveal' or a backend derived from it." (use-package consult :after vertico :config - (setq consult-narrow-key "C-n" + (setq consult-narrow-key "<" consult-project-root-function 'projectile-project-root) (consult-customize @@ -1786,7 +1812,17 @@ Optional BACKEND must be `re-reveal' or a backend derived from it." "." ))) (consult-ripgrep))) + + (setq consult-imenu-config + '((emacs-lisp-mode :toplevel "Functions" :types + ((102 "Functions" font-lock-function-name-face) + (109 "Macros" font-lock-function-name-face) + (112 "Packages" font-lock-constant-face) + (116 "Types" font-lock-type-face) + (118 "Variables" font-lock-variable-name-face))))) + (setq xref-show-xrefs-function 'consult-xref) + :general (chris/leader-keys @@ -1797,6 +1833,7 @@ Optional BACKEND must be `re-reveal' or a backend derived from it." "sf" 'consult-find "sm" 'bookmark-jump "sf" 'consult-flymake + "sx" 'xref-show-xrefs "sy" 'consult-yank-from-kill-ring "sb" 'consult-eglot-symbols)) @@ -2382,7 +2419,8 @@ targets." :states 'normal :keymaps '(rustic-mode override) "gc" 'rustic-compile - "gr" 'projectile-run-project)) + "gr" 'projectile-run-project + "si" 'consult-imenu-multi)) (use-package slint-mode :mode "\\.slint\\'")