X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=emacs_el%2Fconfiguration%2Fdon-configuration.org;h=1281160ed9fd823197516e32c469e290169c5f53;hb=f9c87504989b953f0c3882b6764ae33a2bb8e183;hp=6235cc871256b51bf0d5be3082728b4e4bd7ee6a;hpb=d70a43efdc779ac98a9efbd35e3082a8673e4a79;p=lib.git diff --git a/emacs_el/configuration/don-configuration.org b/emacs_el/configuration/don-configuration.org index 6235cc8..1281160 100644 --- a/emacs_el/configuration/don-configuration.org +++ b/emacs_el/configuration/don-configuration.org @@ -389,6 +389,55 @@ value, scrolling continues until there is no more output. ) ) #+END_SRC +** Treemacs: Tree file viewer +#+BEGIN_SRC emacs-lisp +;; Provides workspaces with file browsing (tree file viewer) +;; and project management when coupled with `projectile`. + +(use-package treemacs + :ensure t + :defer t + :config + (setq treemacs-no-png-images t + treemacs-width 24) + :bind ("C-c t" . treemacs)) +#+END_SRC +** LSP mode +#+BEGIN_SRC emacs-lisp +(use-package lsp-mode + :ensure t + :defer t + :commands (lsp lsp-deferred) + :init (setq lsp-keymap-prefix "C-c l") + :hook (python-mode . lsp-deferred)) +;; Provides visual help in the buffer +;; For example definitions on hover. +;; The `imenu` lets me browse definitions quickly. +(use-package lsp-ui + :ensure t + :defer t + :config + (setq lsp-ui-sideline-enable nil + lsp-ui-doc-delay 2) + :hook (lsp-mode . lsp-ui-mode) + :bind (:map lsp-ui-mode-map + ("C-c i" . lsp-ui-imenu))) +;; Language server for Python +;; Read the docs for the different variables set in the config. +(use-package lsp-pyright + :ensure t + :defer t + :config + (setq lsp-clients-python-library-directories '("/usr/" "~/miniconda3/pkgs")) + (setq lsp-pyright-disable-language-service nil + lsp-pyright-disable-organize-imports nil + lsp-pyright-auto-import-completions t + lsp-pyright-use-library-code-for-types t + lsp-pyright-venv-path "~/miniconda3/envs") + :hook ((python-mode . (lambda () + (require 'lsp-pyright) (lsp-deferred))))) +xb +#+END_SRC ** Company #+BEGIN_SRC emacs-lisp (use-package company @@ -716,251 +765,211 @@ Attempts to automatically identify the right indentation for a file ) #+END_SRC -** Helm +** Vertico #+BEGIN_SRC emacs-lisp - (defun malb/helm-omni (&rest arg) - ;; just in case someone decides to pass an argument, helm-omni won't fail. - (interactive) - (unless helm-source-buffers-list - (setq helm-source-buffers-list - (helm-make-source "Buffers" 'helm-source-buffers))) - (helm-other-buffer - (append - - (if (projectile-project-p) - '(helm-source-projectile-buffers-list - helm-source-buffers-list) - '(helm-source-buffers-list)) ;; list of all open buffers - - `(((name . "Virtual Workspace") - (candidates . ,(--map (cons (eyebrowse-format-slot it) (car it)) - (eyebrowse--get 'window-configs))) - (action . (lambda (candidate) - (eyebrowse-switch-to-window-config candidate))))) - - (if (projectile-project-p) - '(helm-source-projectile-recentf-list - helm-source-recentf) - '(helm-source-recentf)) ;; all recent files - - ;; always make some common files easily accessible - ;;'(((name . "Common Files") - ;; (candidates . malb/common-file-targets) - ;; (action . (("Open" . (lambda (x) (find-file (eval x)))))))) - - '(helm-source-files-in-current-dir - helm-source-locate - helm-source-bookmarks - helm-source-buffer-not-found ;; ask to create a buffer otherwise - )) - "*Helm all the things*")) - (use-package helm - :ensure helm - :diminish helm-mode - :bind (("M-x" . helm-M-x) - ("C-x C-f" . helm-find-files) - ("C-x b" . helm-buffers-list) ; malb/helm-omni) - ("C-x C-b" . helm-buffers-list) ; malb/helm-omni) - ("C-c " . helm-all-mark-rings)) - :config - (require 'helm-config) - (require 'helm-for-files) - (require 'helm-bookmark) - - (helm-mode 1) - (define-key global-map [remap find-file] 'helm-find-files) - (define-key global-map [remap occur] 'helm-occur) - (define-key global-map [remap list-buffers] 'helm-buffers-list) - (define-key global-map [remap dabbrev-expand] 'helm-dabbrev) - (unless (boundp 'completion-in-region-function) - (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point) - (define-key emacs-lisp-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)) - (add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$TMP") (delete-file "$TMP")))) - ) -#+END_SRC -*** Helm Flx +(use-package vertico + :ensure t + :init + (vertico-mode) - [[https://github.com/PythonNut/helm-flx][helm-flx]] implements intelligent helm fuzzy sorting, provided by [[https://github.com/lewang/flx][flx]]. + ;; Different scroll margin + ;; (setq vertico-scroll-margin 0) - #+BEGIN_SRC emacs-lisp - (use-package helm-flx - :ensure t - :config (progn - ;; these are helm configs, but they kind of fit here nicely - (setq helm-M-x-fuzzy-match t - helm-bookmark-show-location t - helm-buffers-fuzzy-matching t - helm-completion-in-region-fuzzy-match t - helm-file-cache-fuzzy-match t - helm-imenu-fuzzy-match t - helm-mode-fuzzy-match t - helm-locate-fuzzy-match nil - helm-quick-update t - helm-recentf-fuzzy-match nil - helm-semantic-fuzzy-match t) - (helm-flx-mode +1))) - #+END_SRC -*** Helm Swoop -#+BEGIN_SRC emacs-lisp + ;; Show more candidates + ;; (setq vertico-count 20) - ;;; stolen from https://github.com/malb/emacs.d/blob/master/malb.org - (defun malb/helm-swoop-pre-fill () - (thing-at-point 'symbol)) - (defvar malb/helm-swoop-ignore-major-mode "List of major modes to ignore for helm-swoop") - (setq malb/helm-swoop-ignore-major-mode '(dired-mode - paradox-menu-mode doc-view-mode pdf-view-mode - mu4e-headers-mode org-mode markdown-mode latex-mode - ein:notebook-multilang-mode)) + ;; Grow and shrink the Vertico minibuffer + ;; (setq vertico-resize t) - (defun malb/swoop-or-search () - (interactive) - (if (or (> (buffer-size) 1048576) ;; helm-swoop can be slow on big buffers - (memq major-mode malb/helm-swoop-ignore-major-mode)) - (isearch-forward) - (helm-swoop))) - - (use-package helm-swoop - :ensure t - :commands helm-swoop - :bind (("C-c o" . helm-multi-swoop-org) - ("C-s" . malb/swoop-or-search) - ("C-M-s" . helm-multi-swoop-all)) - :config (progn - - (setq helm-swoop-pre-input-function #'malb/helm-swoop-pre-fill - helm-swoop-split-with-multiple-windows nil - helm-swoop-split-direction #'split-window-horizontally - helm-swoop-split-window-function 'helm-default-display-buffer - helm-swoop-speed-or-color t) - - ;; https://emacs.stackexchange.com/questions/28790/helm-swoop-how-to-make-it-behave-more-like-isearch - (defun malb/helm-swoop-C-s () - (interactive) - (if (boundp 'helm-swoop-pattern) - (if (equal helm-swoop-pattern "") - (previous-history-element 1) - (helm-next-line)) - (helm-next-line))) - - (bind-key "C-S-s" #'helm-swoop-from-isearch isearch-mode-map) - (bind-key "C-S-s" #'helm-multi-swoop-all-from-helm-swoop helm-swoop-map) - (bind-key "C-r" #'helm-previous-line helm-swoop-map) - (bind-key "C-s" #'malb/helm-swoop-C-s helm-swoop-map) - (bind-key "C-r" #'helm-previous-line helm-multi-swoop-map) - (bind-key "C-s" #'malb/helm-swoop-C-s helm-multi-swoop-map)) - ) + ;; Optionally enable cycling for `vertico-next' and `vertico-previous'. + ;; (setq vertico-cycle t) + ) -#+END_SRC -*** Helm Ag -#+BEGIN_SRC emacs-lisp -(use-package helm-ag +;; Persist history over Emacs restarts. Vertico sorts by history position. +(use-package savehist :ensure t - :config (setq helm-ag-base-command "ag --nocolor --nogroup" - helm-ag-command-option "--all-text" - helm-ag-insert-at-point 'symbol - helm-ag-fuzzy-match t - helm-ag-use-temp-buffer t - helm-ag-use-grep-ignore-list t - helm-ag-use-agignore t)) -#+END_SRC -*** Helm Descbinds -#+BEGIN_SRC emacs-lisp - (use-package helm-descbinds - :ensure t - :bind ("C-h b" . helm-descbinds) - :init (fset 'describe-bindings 'helm-descbinds)) -#+END_SRC + :init + (savehist-mode)) -*** Helm YaSnippet -#+BEGIN_SRC emacs-lisp - (use-package helm-c-yasnippet - :ensure t - :bind ("C-c h y" . helm-yas-complete) - :config (progn - (setq helm-yas-space-match-any-greedy t))) -#+END_SRC -*** Helm Org Rifle -#+BEGIN_SRC emacs-lisp - (use-package helm-org-rifle - :ensure t - :config (progn - (defun malb/helm-org-rifle-agenda-files (arg) - (interactive "p") - (let ((current-prefix-arg nil)) - (cond - ((equal arg 4) (call-interactively #'helm-org-rifle-agenda-files nil)) - ((equal arg 16) (helm-org-rifle-occur-agenda-files)) - (t (helm-org-agenda-files-headings))))))) -#+END_SRC -*** Helm Google -This can be used to link things pretty quickly if necessary -#+BEGIN_SRC emacs-lisp - (use-package helm-google - :ensure t - :bind ("C-c h g" . helm-google) - :config - (progn (add-to-list 'helm-google-actions - '("Copy URL" . (lambda (candidate) - (let ((url - (replace-regexp-in-string - "https://.*q=\\(.*\\)\&sa=.*" - "\\1" candidate))) - (kill-new url)))) - t - ) - - (add-to-list 'helm-google-actions - '("Org Store Link" . (lambda (candidate) - (let ((title (car (split-string candidate "[\n]+"))) - (url - (replace-regexp-in-string - "https://.*q=\\(.*\\)\&sa=.*" - "\\1" candidate))) - (push (list url title) org-stored-links)))) - t) - )) #+END_SRC - -** Projectile -- Project management +** Orderless: advanced completion style #+begin_src emacs-lisp - (use-package projectile - :ensure t - :bind (("" . projectile-compile-project) - ("" . next-error)) - :config (progn - (use-package magit :ensure t) - (require 'helm-projectile) - (helm-projectile-on) +(use-package orderless + :ensure t + :init + ;; Configure a custom style dispatcher (see the Consult wiki) + ;; (setq orderless-style-dispatchers '(+orderless-dispatch) + ;; orderless-component-separator #'orderless-escapable-split-on-space) + (setq completion-styles '(orderless basic) + completion-category-defaults nil + completion-category-overrides '((file (styles partial-completion))))) +#+end_src +** Marginalia: Rich annotations in the minibuffer +#+begin_src emacs-lisp +(use-package marginalia + :ensure t + :bind (("M-A" . marginalia-cycle) + :map minibuffer-local-map + ("M-A" . marginalia-cycle)) + :init + (marginalia-mode) + ) +#+end_src +** Embark: Minibuffer actions and context menu +#+begin_src emacs-lisp +(use-package embark + :ensure t + + :bind + (("C-." . embark-act) ;; pick some comfortable binding + ("C-;" . embark-dwim) ;; good alternative: M-. + ("C-h B" . embark-bindings)) ;; alternative for `describe-bindings' + + :init - (setq projectile-make-test-cmd "make check" - projectile-switch-project-action 'helm-projectile - projectile-mode-line '(:eval (format "»{%s}" (projectile-project-name)))) + ;; Optionally replace the key help with a completing-read interface + (setq prefix-help-command #'embark-prefix-help-command) - (projectile-global-mode))) + :config + + ;; Hide the mode line of the Embark live/completions buffers + (add-to-list 'display-buffer-alist + '("\\`\\*Embark Collect \\(Live\\|Completions\\)\\*" + nil + (window-parameters (mode-line-format . none))))) + +(use-package embark-consult + :ensure t + :hook + (embark-collect-mode . consult-preview-at-point-mode)) #+end_src +** Consult +#+begin_src emacs-lisp +(use-package consult + ;; Replace bindings. Lazily loaded due by `use-package'. + :bind (;; C-c bindings (mode-specific-map) + ("C-c h" . consult-history) + ("C-c m" . consult-mode-command) + ("C-c k" . consult-kmacro) + ;; C-x bindings (ctl-x-map) + ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command + ("C-x b" . consult-buffer) ;; orig. switch-to-buffer + ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window + ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame + ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump + ; ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer + ;; Custom M-# bindings for fast register access + ("M-#" . consult-register-load) + ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) + ("C-M-#" . consult-register) + ;; Other custom bindings + ("M-y" . consult-yank-pop) ;; orig. yank-pop + ;; M-g bindings (goto-map) + ("M-g e" . consult-compile-error) + ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g g" . consult-goto-line) ;; orig. goto-line + ("M-g M-g" . consult-goto-line) ;; orig. goto-line + ("M-g o" . consult-outline) ;; Alternative: consult-org-heading + ("M-g m" . consult-mark) + ("M-g k" . consult-global-mark) + ("M-g i" . consult-imenu) + ("M-g I" . consult-imenu-multi) + ;; M-s bindings (search-map) + ("M-s d" . consult-find) + ("M-s D" . consult-locate) + ("M-s g" . consult-grep) + ("M-s G" . consult-git-grep) + ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line) + ("M-s L" . consult-line-multi) + ("M-s k" . consult-keep-lines) + ("M-s u" . consult-focus-lines) + ;; Isearch integration + ("M-s e" . consult-isearch-history) + :map isearch-mode-map + ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s l" . consult-line) ;; needed by consult-line to detect isearch + ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch + ;; Minibuffer history + :map minibuffer-local-map + ("M-s" . consult-history) ;; orig. next-matching-history-element + ("M-r" . consult-history)) ;; orig. previous-matching-history-element + + ;; Enable automatic preview at point in the *Completions* buffer. This is + ;; relevant when you use the default completion UI. + :hook (completion-list-mode . consult-preview-at-point-mode) + + ;; The :init configuration is always executed (Not lazy) + :init + + ;; Optionally configure the register formatting. This improves the register + ;; preview for `consult-register', `consult-register-load', + ;; `consult-register-store' and the Emacs built-ins. + (setq register-preview-delay 0.5 + register-preview-function #'consult-register-format) + + ;; Optionally tweak the register preview window. + ;; This adds thin lines, sorting and hides the mode line of the window. + (advice-add #'register-preview :override #'consult-register-window) + + ;; Use Consult to select xref locations with preview + (setq xref-show-xrefs-function #'consult-xref + xref-show-definitions-function #'consult-xref) -*** helm integration + ;; Configure other variables and modes in the :config section, + ;; after lazily loading the package. + :config + + ;; Optionally configure preview. The default value + ;; is 'any, such that any key triggers the preview. + ;; (setq consult-preview-key 'any) + ;; (setq consult-preview-key (kbd "M-.")) + ;; (setq consult-preview-key (list (kbd "") (kbd ""))) + ;; For some commands and buffer sources it is useful to configure the + ;; :preview-key on a per-command basis using the `consult-customize' macro. + (consult-customize + consult-theme :preview-key '(:debounce 0.2 any) + consult-ripgrep consult-git-grep consult-grep + consult-bookmark consult-recent-file consult-xref + consult--source-bookmark consult--source-file-register + consult--source-recent-file consult--source-project-recent-file + ;; :preview-key (kbd "M-.") + :preview-key '(:debounce 0.4 any)) + + ;; Optionally configure the narrowing key. + ;; Both < and C-+ work reasonably well. + (setq consult-narrow-key "<") ;; (kbd "C-+") + + ;; Optionally make narrowing help available in the minibuffer. + ;; You may want to use `embark-prefix-help-command' or which-key instead. + ;; (define-key consult-narrow-map (vconcat consult-narrow-key "?") #'consult-narrow-help) + + ;; By default `consult-project-function' uses `project-root' from project.el. + ;; Optionally configure a different project root function. + ;; There are multiple reasonable alternatives to chose from. + ;;;; 1. project.el (the default) + ;; (setq consult-project-function #'consult--default-project--function) + ;;;; 2. projectile.el (projectile-project-root) + ;; (autoload 'projectile-project-root "projectile") + ;; (setq consult-project-function (lambda (_) (projectile-project-root))) + ;;;; 3. vc.el (vc-root-dir) + ;; (setq consult-project-function (lambda (_) (vc-root-dir))) + ;;;; 4. locate-dominating-file + ;; (setq consult-project-function (lambda (_) (locate-dominating-file "." ".git"))) +) +#+end_src +** Projectile -- Project management #+begin_src emacs-lisp - (use-package helm-projectile - :ensure t - :config (progn - (defvar malb/helm-source-file-not-found - (helm-build-dummy-source - "Create file" - :action 'find-file)) - - (add-to-list - 'helm-projectile-sources-list - malb/helm-source-file-not-found t) - - (helm-delete-action-from-source - "Grep in projects `C-s'" - helm-source-projectile-projects) - - (helm-add-action-to-source - "Grep in projects `C-s'" - 'helm-do-ag helm-source-projectile-projects 4))) +(use-package projectile + :ensure t + :bind (("" . projectile-compile-project) + ("" . next-error)) + :config (progn + (use-package magit :ensure t) + (projectile-global-mode))) #+end_src + ** Zap to char #+BEGIN_SRC emacs-lisp (use-package avy-zap