summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mendler <mail@daniel-mendler.de>2023-04-11 16:57:40 +0200
committerDaniel Mendler <mail@daniel-mendler.de>2023-04-11 17:00:15 +0200
commit5f6bd31c102d9333035e056f0dc9882203f10d6b (patch)
tree8f75787ef672c4281b04bbb83a914ab362e84bf6
parent2d6c5f6dabf476776c8af944203289bbf3693ba4 (diff)
Add cape-elisp-block
-rw-r--r--CHANGELOG.org2
-rw-r--r--README.org99
-rw-r--r--cape.el26
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)
diff --git a/README.org b/README.org
index 085edba..83ee711 100644
--- a/README.org
+++ b/README.org
@@ -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
diff --git a/cape.el b/cape.el
index b51a94a..bda53cd 100644
--- a/cape.el
+++ b/cape.el
@@ -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