diff options
| author | Daniel Mendler <mail@daniel-mendler.de> | 2023-04-11 16:57:40 +0200 |
|---|---|---|
| committer | Daniel Mendler <mail@daniel-mendler.de> | 2023-04-11 17:00:15 +0200 |
| commit | 5f6bd31c102d9333035e056f0dc9882203f10d6b (patch) | |
| tree | 8f75787ef672c4281b04bbb83a914ab362e84bf6 | |
| parent | 2d6c5f6dabf476776c8af944203289bbf3693ba4 (diff) | |
Add cape-elisp-block
| -rw-r--r-- | CHANGELOG.org | 2 | ||||
| -rw-r--r-- | README.org | 99 | ||||
| -rw-r--r-- | cape.el | 26 |
3 files changed, 79 insertions, 48 deletions
diff --git a/CHANGELOG.org b/CHANGELOG.org index 82fa344..ae1c113 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -16,6 +16,8 @@ =dabbrev-case-replace=. - =cape-dict-case-fold=: New variable to configure if case is ignored during search and completion. +- =cape-elisp-block=: Complete Elisp in Org or Markdown code block. This Capf is + particularly useful for literate Emacs configurations. * Version 0.13 (2023-02-15) @@ -36,15 +36,16 @@ advantage of Company backends even if you are not using Company as frontend. * Available Capfs -+ ~cape-dabbrev~: Complete word from current buffers (see also ~dabbrev-capf~ on - Emacs 29) -+ ~cape-file~: Complete file name -+ ~cape-history~: Complete from Eshell, Comint or minibuffer history -+ ~cape-keyword~: Complete programming language keyword -+ ~cape-symbol~: Complete Elisp symbol -+ ~cape-abbrev~: Complete abbreviation (~add-global-abbrev~, ~add-mode-abbrev~) -+ ~cape-dict~: Complete word from dictionary file -+ ~cape-line~: Complete entire line from current buffer ++ ~cape-dabbrev~: Complete word from current buffers. See also ~dabbrev-capf~ on + Emacs 29. ++ ~cape-elisp-block~: Complete Elisp in Org or Markdown code block. ++ ~cape-file~: Complete file name. ++ ~cape-history~: Complete from Eshell, Comint or minibuffer history. ++ ~cape-keyword~: Complete programming language keyword. ++ ~cape-symbol~: Complete Elisp symbol. ++ ~cape-abbrev~: Complete abbreviation (~add-global-abbrev~, ~add-mode-abbrev~). ++ ~cape-dict~: Complete word from dictionary file. ++ ~cape-line~: Complete entire line from current buffer. + ~cape-tex~: Complete Unicode char from TeX command, e.g. ~\hbar~. + ~cape-sgml~: Complete Unicode char from SGML entity, e.g., ~&alpha~. + ~cape-rfc1345~: Complete Unicode char using RFC 1345 mnemonics. @@ -56,45 +57,47 @@ Cape is available on GNU ELPA and MELPA. You can install the package with could be upstreamed into Emacs itself. #+begin_src emacs-lisp - ;; Enable Corfu completion UI - ;; See the Corfu README for more configuration tips. - (use-package corfu - :init - (global-corfu-mode)) - - ;; Add extensions - (use-package cape - ;; Bind dedicated completion commands - ;; Alternative prefix keys: C-c p, M-p, M-+, ... - :bind (("C-c p p" . completion-at-point) ;; capf - ("C-c p t" . complete-tag) ;; etags - ("C-c p d" . cape-dabbrev) ;; or dabbrev-completion - ("C-c p h" . cape-history) - ("C-c p f" . cape-file) - ("C-c p k" . cape-keyword) - ("C-c p s" . cape-symbol) - ("C-c p a" . cape-abbrev) - ("C-c p l" . cape-line) - ("C-c p w" . cape-dict) - ("C-c p \\" . cape-tex) - ("C-c p _" . cape-tex) - ("C-c p ^" . cape-tex) - ("C-c p &" . cape-sgml) - ("C-c p r" . cape-rfc1345)) - :init - ;; Add `completion-at-point-functions', used by `completion-at-point'. - (add-to-list 'completion-at-point-functions #'cape-dabbrev) - (add-to-list 'completion-at-point-functions #'cape-file) - ;;(add-to-list 'completion-at-point-functions #'cape-history) - ;;(add-to-list 'completion-at-point-functions #'cape-keyword) - ;;(add-to-list 'completion-at-point-functions #'cape-tex) - ;;(add-to-list 'completion-at-point-functions #'cape-sgml) - ;;(add-to-list 'completion-at-point-functions #'cape-rfc1345) - ;;(add-to-list 'completion-at-point-functions #'cape-abbrev) - ;;(add-to-list 'completion-at-point-functions #'cape-dict) - ;;(add-to-list 'completion-at-point-functions #'cape-symbol) - ;;(add-to-list 'completion-at-point-functions #'cape-line) - ) +;; Enable Corfu completion UI +;; See the Corfu README for more configuration tips. +(use-package corfu + :init + (global-corfu-mode)) + +;; Add extensions +(use-package cape + ;; Bind dedicated completion commands + ;; Alternative prefix keys: C-c p, M-p, M-+, ... + :bind (("C-c p p" . completion-at-point) ;; capf + ("C-c p t" . complete-tag) ;; etags + ("C-c p d" . cape-dabbrev) ;; or dabbrev-completion + ("C-c p h" . cape-history) + ("C-c p f" . cape-file) + ("C-c p k" . cape-keyword) + ("C-c p s" . cape-symbol) + ("C-c p a" . cape-abbrev) + ("C-c p l" . cape-line) + ("C-c p w" . cape-dict) + ("C-c p \\" . cape-tex) + ("C-c p _" . cape-tex) + ("C-c p ^" . cape-tex) + ("C-c p &" . cape-sgml) + ("C-c p r" . cape-rfc1345)) + :init + ;; Add `completion-at-point-functions', used by `completion-at-point'. + ;; NOTE: The order matters! + (add-to-list 'completion-at-point-functions #'cape-dabbrev) + (add-to-list 'completion-at-point-functions #'cape-file) + (add-to-list 'completion-at-point-functions #'cape-elisp-block) + ;;(add-to-list 'completion-at-point-functions #'cape-history) + ;;(add-to-list 'completion-at-point-functions #'cape-keyword) + ;;(add-to-list 'completion-at-point-functions #'cape-tex) + ;;(add-to-list 'completion-at-point-functions #'cape-sgml) + ;;(add-to-list 'completion-at-point-functions #'cape-rfc1345) + ;;(add-to-list 'completion-at-point-functions #'cape-abbrev) + ;;(add-to-list 'completion-at-point-functions #'cape-dict) + ;;(add-to-list 'completion-at-point-functions #'cape-symbol) + ;;(add-to-list 'completion-at-point-functions #'cape-line) +) #+end_src * CAPF adapters and transformers @@ -387,6 +387,32 @@ If INTERACTIVE is nil the function acts like a Capf." ,(cape--table-with-properties obarray :category 'symbol) ,@cape--symbol-properties)))) +;;;;; cape-elisp-block + +(declare-function org-element-at-point "org-element") +(declare-function markdown-code-block-lang "ext:markdown-mode") + +;;;###autoload +(defun cape-elisp-block (&optional interactive) + "Complete Elisp in Org or Markdown code block. +This Capf is particularly useful for literate Emacs configurations. +If INTERACTIVE is nil the function acts like a Capf." + (interactive (list t)) + (if interactive + (cape-interactive #'cape-elisp-block) + (when-let ((face (get-text-property (point) 'face)) + (lang (or (and (if (listp face) + (memq 'org-block face) + (eq 'org-block face)) + (plist-get (cadr (org-element-at-point)) :language)) + (and (if (listp face) + (memq 'markdown-code-face face) + (eq 'markdown-code-face face)) + (save-excursion + (markdown-code-block-lang))))) + ((member lang '("elisp" "emacs-lisp")))) + (elisp-completion-at-point)))) + ;;;;; cape-dabbrev (defvar cape--dabbrev-properties |
