#+BEGIN_SRC emacs-lisp
;; From http://www.emacswiki.org/emacs/LoadingLispFiles
;; execute conditional code when loading libraries
-(defmacro with-library (symbol &rest body)
- `(when (require ,symbol nil t)
- ,@body))
-(put 'with-library 'lisp-indent-function 1)
+; (defmacro with-library (symbol &rest body)
+; `(when (require ,symbol nil t)
+; ,@body))
+; (put 'with-library 'lisp-indent-function 1)
#+END_SRC
* Variables
(add-hook 'minibuffer-exit-hook #'don/minibuffer-exit-hook)
#+END_SRC
* Modules
+** Tree sitter
+#+BEGIN_SRC emacs-lisp
+(use-package tree-sitter
+ :ensure t
+ :defer 1
+ :config
+ (global-tree-sitter-mode)
+ )
+(use-package tree-sitter-langs
+ :ensure t
+ :defer 1
+ :after tree-sitter
+ :config
+ (defun dla/python-function-at-point ()
+ "Return a list of function arguments
+
+Borrowed from https://xenodium.com/emacs-generate-a-swift-initializer/
+"
+ (interactive)
+ (cl-assert (seq-contains local-minor-modes 'tree-sitter-mode) "tree-sitter-mode not enabled")
+ (let* ((node (tree-sitter-node-at-point 'function_definition)
+ )
+ (args)
+ (arg)
+ (ret))
+ (unless node
+ (error "Not in function"))
+ (mapc
+ (lambda (item)
+ (cond ((eq 'func_name
+ (car item))
+ ; (when arg
+ ; (setq args (append args (list arg)))
+ ; )
+ (setq arg (list (cons 'function (tsc-node-text
+ (cdr item))))))
+ ((eq 'ident
+ (car item))
+ (setq arg (map-insert arg 'ident (tsc-node-text
+ (cdr item)))))
+ ((eq 'ident_type
+ (car item))
+ (setq arg (map-insert arg 'ident_type (tsc-node-text
+ (cdr item)))))
+ ((eq 'ret_type
+ (car item))
+ (setq arg (map-insert arg 'ret_type (tsc-node-text
+ (cdr item)))))
+ ))
+ (tsc-query-captures
+ (tsc-make-query tree-sitter-language
+ "(function_definition (identifier) @func_name (parameters [(identifier) @ident (typed_parameter (identifier) @ident (type) @ident_type)]) (type)? @ret_type)")
+ (tree-sitter-node-at-point 'function_definition) nil))
+ (when arg
+ (setq args (append args (list arg))))
+ args))
+
+)
+#+END_SRC
** Spacemacs theme
#+BEGIN_SRC emacs-lisp
(use-package spacemacs-common
#+BEGIN_SRC emacs-lisp
(use-package flyspell
:ensure t
- :diminish flyspell-mode ๐
+ :delight flyspell-mode ๐
:config
(add-hook 'text-mode-hook 'turn-on-flyspell)
(add-hook 'c-mode-common-hook 'flyspell-prog-mode)
#+begin_src emacs-lisp :tangle yes
(use-package flycheck
:ensure t
- :diminish ๐ฆ
+ :delight ๐ฆ
:if (version<= "24.4" emacs-version)
:commands flycheck-mode
:hook ((prog-mode . flycheck-mode)
** Flymake
#+begin_src emacs-lisp :tangle yes
(use-package flymake
- :diminish "ฮฆ")
+ :delight "ฮฆ")
#+end_src
** Winnermode
#+BEGIN_SRC emacs-lisp
(use-package eyebrowse
:ensure t
- :diminish eyebrowse-mode
+ :delight eyebrowse-mode
:init (setq eyebrowse-keymap-prefix (kbd "C-c e"))
:config (progn
(setq eyebrowse-wrap-around t)
#+END_SRC
** Mode line cleaning
-*** Diminish
+*** Delight
#+BEGIN_SRC emacs-lisp
- (use-package diminish
+ (use-package delight
:ensure t)
#+END_SRC
#+BEGIN_SRC emacs-lisp
(use-package yasnippet
:ensure t
- :diminish yas-minor-mode
+ :delight yas-minor-mode
:config (progn
(yas-global-mode)
(setq yas-verbosity 1)
)
)
#+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)))))
+#+END_SRC
** Company
#+BEGIN_SRC emacs-lisp
(use-package company
company-minimum-prefix-length 1
company-global-modes '(not)
company-lighter-base "(C)")
+ (setq company-backends '(company-capf
+ company-keywords
+ company-semantic
+ company-files
+ company-etags
+ company-elisp
+ company-clang
+ company-irony-c-headers
+ company-irony
+ company-jedi
+ company-cmake
+ company-ispell
+ company-yasnippet))
(global-company-mode 1)
:bind (:map company-active-map
("C-n" . company-select-next)
#+END_SRC
*** C/C++
#+BEGIN_SRC emacs-lisp
- (use-package company-c-headers
- :ensure t
- :config (progn
- (defun malb/ede-object-system-include-path ()
- "Return the system include path for the current buffer."
- (when ede-object
- (ede-system-include-path ede-object)))
-
- (setq company-c-headers-path-system
- #'malb/ede-object-system-include-path)
+(use-package company-c-headers
+ :ensure t
+ :config (progn
+ (defun malb/ede-object-system-include-path ()
+ "Return the system include path for the current buffer."
+ (when ede-object
+ (ede-system-include-path ede-object)))
- (add-to-list 'company-backends #'company-c-headers)))
+ (setq company-c-headers-path-system
+ #'malb/ede-object-system-include-path)))
#+END_SRC
*** Python
#+BEGIN_SRC emacs-lisp
-(use-package company-anaconda
+(use-package company-jedi
:ensure t
- :config (add-to-list 'company-backends #'company-anaconda))
+ :hook (python-mode . 'jedi:setup)
+ :config
+ (setq jedi:complete-on-dot t)
+ )
#+END_SRC
*** Perl
#+BEGIN_SRC emacs-lisp
)
)
#+END_SRC
+**** Bibtex
#+BEGIN_SRC emacs-lisp
(use-package company-bibtex
:ensure t
#+END_SRC
*** Shell
- #+BEGIN_SRC emacs-lisp
- (use-package company-shell
- :ensure t
- :config (progn
- (setq company-shell-modes '(sh-mode shell-mode))
- (add-to-list 'company-backends 'company-shell)))
- #+END_SRC
+#+BEGIN_SRC emacs-lisp
+(use-package company-shell
+ :ensure t
+ :config (progn
+ (setq company-shell-modes '(sh-mode shell-mode))
+ (add-to-list 'company-backends 'company-shell)))
+#+END_SRC
*** YaSnippet
- Add YasSippet support for all company backends. ([[https://github.com/syl20bnr/spacemacs/pull/179][source]])
+Add YasSippet support for all company backends. ([[https://github.com/syl20bnr/spacemacs/pull/179][source]])
- *Note:* Do this at the end of =company-mode= config.
+*Note:* Do this at the end of =company-mode= config.
- #+BEGIN_SRC emacs-lisp
- (defvar malb/company-mode/enable-yas t
- "Enable yasnippet for all backends.")
+#+BEGIN_SRC emacs-lisp
+(defvar malb/company-mode/enable-yas t
+ "Enable yasnippet for all backends.")
- (defun malb/company-mode/backend-with-yas (backend)
- (if (or (not malb/company-mode/enable-yas)
- (and (listp backend)
- (member 'company-yasnippet backend)))
- backend
- (append (if (consp backend) backend (list backend))
- '(:with company-yasnippet))))
+(defun malb/company-mode/backend-with-yas (backend)
+ (if (or (not malb/company-mode/enable-yas)
+ (and (listp backend)
+ (member 'company-yasnippet backend)))
+ backend
+ (append (if (consp backend) backend (list backend))
+ '(:with company-yasnippet))))
- (setq company-backends
- (mapcar #'malb/company-mode/backend-with-yas company-backends))
- #+END_SRC
+(setq company-backends
+ (mapcar #'malb/company-mode/backend-with-yas company-backends))
+#+END_SRC
*** All the words
- Enable/disable company completion from ispell dictionaries ([[https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-company.el][source]])
+Enable/disable company completion from ispell dictionaries ([[https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-company.el][source]])
- #+BEGIN_SRC emacs-lisp
- (defun malb/toggle-company-ispell ()
- (interactive)
- (cond
- ((member '(company-ispell :with company-yasnippet) company-backends)
- (setq company-backends (delete '(company-ispell :with company-yasnippet) company-backends))
- (add-to-list 'company-backends '(company-dabbrev :with company-yasnippet) t)
- (message "company-ispell disabled"))
- (t
- (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends))
- (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t)
- (message "company-ispell enabled!"))))
-
- (defun malb/company-ispell-setup ()
- ;; @see https://github.com/company-mode/company-mode/issues/50
- (when (boundp 'company-backends)
- (make-local-variable 'company-backends)
- (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends))
- (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t)
- ;; https://github.com/redguardtoo/emacs.d/issues/473
- (if (and (boundp 'ispell-alternate-dictionary)
- ispell-alternate-dictionary)
- (setq company-ispell-dictionary ispell-alternate-dictionary))))
- #+END_SRC
+#+BEGIN_SRC emacs-lisp
+(defun malb/toggle-company-ispell ()
+ (interactive)
+ (cond
+ ((member '(company-ispell :with company-yasnippet) company-backends)
+ (setq company-backends (delete '(company-ispell :with company-yasnippet) company-backends))
+ (add-to-list 'company-backends '(company-dabbrev :with company-yasnippet) t)
+ (message "company-ispell disabled"))
+ (t
+ (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends))
+ (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t)
+ (message "company-ispell enabled!"))))
+
+(defun malb/company-ispell-setup ()
+ ;; @see https://github.com/company-mode/company-mode/issues/50
+ (when (boundp 'company-backends)
+ (make-local-variable 'company-backends)
+ (setq company-backends (delete '(company-dabbrev :with company-yasnippet) company-backends))
+ (add-to-list 'company-backends '(company-ispell :with company-yasnippet) t)
+ ;; https://github.com/redguardtoo/emacs.d/issues/473
+ (if (and (boundp 'ispell-alternate-dictionary)
+ ispell-alternate-dictionary)
+ (setq company-ispell-dictionary ispell-alternate-dictionary))))
+#+END_SRC
*** Tab DWIM
(save-excursion
(outline-cycle)))))
-(bind-key "<tab>" #'malb/indent-fold-or-complete)
-(bind-key "C-<tab>" #'malb/toggle-fold)
+(bind-key "<tab>" 'malb/indent-fold-or-complete)
+(bind-key "C-<tab>" 'malb/toggle-fold)
#+END_SRC
** Tinyprocmail
)
#+END_SRC
+*** Forge (github/gitlab)
+#+BEGIN_SRC emacs-lisp
+(use-package forge
+ :ensure t
+ :after magit
+ )
+#+END_SRC
+
** Perl
#+BEGIN_SRC emacs-lisp
(use-package cperl-mode
+ :ensure t
:config
(progn
;; Use c-mode for perl .xs files
#+END_SRC
** SQL mode
#+BEGIN_SRC emacs-lisp
- ; load sql-indent when sql is loaded
+; load sql-indent when sql is loaded
(use-package sql-indent
+ :ensure t
:hook sql-mode
)
(use-package sql
+ :ensure t
:mode (("\\.sql\\'" . sql-mode))
)
#+END_SRC
)
#+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 <SPC>" . 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"))))
+(use-package vertico
+ :ensure t
+ :init
+ (vertico-mode)
+
+ ;; Different scroll margin
+ ;; (setq vertico-scroll-margin 0)
+
+ ;; Show more candidates
+ ;; (setq vertico-count 20)
+
+ ;; Grow and shrink the Vertico minibuffer
+ ;; (setq vertico-resize t)
+
+ ;; Optionally enable cycling for `vertico-next' and `vertico-previous'.
+ ;; (setq vertico-cycle t)
+ :custom
+ (vertico-grid-separator " ")
+ (vertico-grid-lookahead 50)
+ (vertico-multiform-categories
+ '((file reverse)
+ (consult-grep buffer)
+ (consult-location)
+ (imenu buffer)
+ (library reverse indexed)
+ (org-roam-node reverse indexed)
+ (t reverse)
+ ))
+ (vertico-multiform-commands
+ '(("flyspell-correct-*" grid reverse)
+ (org-refile grid reverse indexed)
+ (consult-yank-pop indexed)
+ (consult-flycheck)
+ (consult-lsp-diagnostics)
+ ))
+ :config
+ (vertico-multiform-mode)
+ (define-key vertico-map "\r" #'vertico-directory-enter)
+ (define-key vertico-map "\d" #'vertico-directory-delete-char)
+ (define-key vertico-map "\M-\d" #'vertico-directory-delete-word)
+ (add-hook 'rfn-eshadow-update-overlay-hook #'vertico-directory-tidy)
)
-#+END_SRC
-*** Helm Flx
-
- [[https://github.com/PythonNut/helm-flx][helm-flx]] implements intelligent helm fuzzy sorting, provided by [[https://github.com/lewang/flx][flx]].
-
- #+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
-
- ;;; 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))
-
- (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))
- )
-#+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 (("<f5>" . projectile-compile-project)
- ("<f6>" . 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)
+
+ :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)))))
- (projectile-global-mode)))
+(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)
+
+ ;; Configure other variables and modes in the :config section,
+ ;; after lazily loading the package.
+ :config
-*** helm integration
+ ;; 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 "<S-down>") (kbd "<S-up>")))
+ ;; 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 (("<f5>" . projectile-compile-project)
+ ("<f6>" . 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
** Outlining
*** Outline magic
#+BEGIN_SRC emacs-lisp
- (use-package outline-magic)
+; this package doesn't really do exactly what we want it to do
+; (use-package outline-magic)
#+END_SRC
*** Outline mode
#+BEGIN_SRC emacs-lisp
#+BEGIN_SRC emacs-lisp
(use-package spamassassin-mode
:commands spamassassin-mode
- :ensure f
+ :ensure t
)
#+END_SRC
** Password Store
#+BEGIN_SRC emacs-lisp
- (use-package password-store
- :ensure f
- :commands password-store-edit password-store-generate
- )
+(use-package password-store
+ :ensure t
+ :commands password-store-edit password-store-generate
+ :config
+ (defun dla/password-store-edit (entry)
+ "Edit password for ENTRY which doesn't require it to already exist"
+ (interactive (list (password-store--completing-read nil)))
+ (password-store--run-edit entry))
+ (advice-add 'password-store-edit :override #'dla/password-store-edit)
+ )
#+END_SRC
** CSS mode
#+BEGIN_SRC emacs-lisp
** Abbrev Mode
#+BEGIN_SRC emacs-lisp
(use-package abbrev
- :diminish abbrev-mode
+ :delight abbrev-mode
:config
;; load abbreviations from
(setq abbrev-file-name
** Python Programming
#+BEGIN_SRC emacs-lisp
(use-package python-mode
+ :delight ๐
:hook
(python-mode . pyenv-mode)
(python-mode . flycheck-mode)
:ensure t
)
(use-package blacken
+ :delight โ
:init
(setq-default blacken-fast-unsafe t)
- (setq-default blacken-line-length 80)
+ ; (setq-default blacken-line-length 80)
:ensure t)
(use-package anaconda-mode
:ensure t
(elpy-enable)
)
#+END_SRC
-# *** Jedi
-# #+BEGIN_SRC emacs-lisp
-# (use-package company-jedi
-# :ensure t
-# :hook (python-mode . (add-to-list 'company-backends 'company-jedi))
-# :hook (python-mode . 'jedi:setup)
-# :config
-# (setq jedi:complete-on-dot t)
-# )
-# #+END_SRC
*** Black
#+begin_src emacs-lisp :tangle yes
(use-package python-black
#+end_src
*** Sphinx Documentation
#+begin_src emacs-lisp :tangle yes
- (use-package numpydoc
- :ensure t
- :after python
- :bind (:map python-mode-map
- ("C-c C-n" . numpydoc-generate)))
- (use-package sphinx-doc
- :ensure t
- :config
- (sphinx-doc-mode t)
- (setq sphinx-doc-include-types t)
- :after python)
+(use-package numpydoc
+ :ensure t
+ :after python
+ :bind (:map python-mode-map
+ ("C-c C-n" . numpydoc-generate)))
+(use-package sphinx-doc
+ :ensure t
+ :config
+ (sphinx-doc-mode t)
+ (setq sphinx-doc-include-types t)
+ :after python)
+(use-package python-docstring
+ :ensure t
+ :after python
+ :hook
+ (python-mode . python-docstring-mode)
+ )
#+end_src
** Go language
#+BEGIN_SRC emacs-lisp
(use-package go-mode
- :diminish "go"
+ :delight "go"
:mode "\\.go"
)
#+END_SRC
#+BEGIN_SRC emacs-lisp
(use-package message
:ensure f
- :diminish (message "โ")
+ :delight (message "โ")
:mode ("muttng-[a-z0-9]+-[0-9]+-" . message-mode)
:mode ("mutt-[a-z0-9]+-[0-9]+-" . message-mode)
:hook 'my/message-mode-settings
* Base emacs
** Reverting buffers
#+BEGIN_SRC emacs-lisp
- (use-package autorevert
- :diminish auto-revert-mode
- :config
- (setq global-auto-revert-non-file-buffers t
- global-auto-revert-ignore-modes '(pdf-view-mode)
- auto-revert-verbose nil)
- (global-auto-revert-mode 1))
+(use-package autorevert
+ :delight auto-revert-mode
+ :config
+ (setq global-auto-revert-non-file-buffers t
+ global-auto-revert-ignore-modes '(pdf-view-mode)
+ auto-revert-verbose nil)
+ (global-auto-revert-mode 1))
#+END_SRC
* Org Mode
** Use-package and load things
#+END_SRC
** Utility Functions
#+BEGIN_SRC emacs-lisp
- (defun bh/hide-other ()
- (interactive)
- (save-excursion
- (org-back-to-heading 'invisible-ok)
- (outline-hide-other)
- (org-cycle)
- (org-cycle)
- (org-cycle)))
-
- (defun bh/set-truncate-lines ()
- "Toggle value of truncate-lines and refresh window display."
- (interactive)
- (setq truncate-lines (not truncate-lines))
- ;; now refresh window display (an idiom from simple.el):
- (save-excursion
- (set-window-start (selected-window)
- (window-start (selected-window)))))
+(defun bh/hide-other ()
+ (interactive)
+ (save-excursion
+ (org-back-to-heading 'invisible-ok)
+ (outline-hide-other)
+ (org-cycle)
+ (org-cycle)
+ (org-cycle)))
+
+(defun bh/set-truncate-lines ()
+ "Toggle value of truncate-lines and refresh window display."
+ (interactive)
+ (setq truncate-lines (not truncate-lines))
+ ;; now refresh window display (an idiom from simple.el):
+ (save-excursion
+ (set-window-start (selected-window)
+ (window-start (selected-window)))))
- (defun bh/switch-to-scratch ()
- (interactive)
- (switch-to-buffer "*scratch*"))
+(defun bh/switch-to-scratch ()
+ (interactive)
+ (switch-to-buffer "*scratch*"))
- (setq org-use-fast-todo-selection t)
- (setq org-treat-S-cursor-todo-selection-as-state-change nil)
+(setq org-use-fast-todo-selection t)
+(setq org-treat-S-cursor-todo-selection-as-state-change nil)
; create function to create headlines in file. This comes from
; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode