From a2a2fa32710b5dbf388299d04c31ac08274124c7 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Fri, 17 Nov 2023 19:04:23 +0100 Subject: [PATCH] New post about Completion Preview mode --- esy-publish.el | 15 +- source/assets/completion-preview-1.png | Bin 0 -> 15291 bytes source/assets/completion-preview-2.png | Bin 0 -> 17146 bytes source/notes/prolog.org | 13 ++ source/notes/python.org | 13 ++ ...2023-11-17-completion-preview-in-emacs.org | 161 ++++++++++++++++++ 6 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 source/assets/completion-preview-1.png create mode 100644 source/assets/completion-preview-2.png create mode 100644 source/notes/prolog.org create mode 100644 source/notes/python.org create mode 100644 source/posts/2023-11-17-completion-preview-in-emacs.org diff --git a/esy-publish.el b/esy-publish.el index cb103b7..d00212b 100644 --- a/esy-publish.el +++ b/esy-publish.el @@ -59,6 +59,10 @@ (file-name-as-directory (expand-file-name "posts" esy-publish-source-directory))) +(defvar esy-publish-assets-source-directory + (file-name-as-directory (expand-file-name "assets" + esy-publish-source-directory))) + (defvar esy-publish-remote-directory "root@direct.eshelyaron.com:/var/www/html") @@ -66,6 +70,10 @@ (file-name-as-directory (expand-file-name "local" esy-publish-root-directory))) +(defvar esy-publish-local-assets-directory + (file-name-as-directory (expand-file-name "assets" + esy-publish-local-directory))) + (defvar esy-publish-local-posts-directory (file-name-as-directory (expand-file-name "posts" esy-publish-local-directory))) @@ -565,12 +573,17 @@ (esy-publish--publishing t) (initial-buffers (buffer-list)) (org-publish-project-alist - (list '("all" :components ("assets" "org")) + (list '("all" :components ("assets" "sassets" "org")) (list "assets" :base-directory esy-publish-source-directory :publishing-directory esy-publish-local-directory :base-extension "svg\\|ico\\|css\\|png" :publishing-function #'org-publish-attachment) + (list "sassets" + :base-directory esy-publish-assets-source-directory + :publishing-directory esy-publish-local-assets-directory + :base-extension "svg\\|ico\\|css\\|png" + :publishing-function #'org-publish-attachment) (list "org" :completion-function #'esy-publish--finalize :base-directory esy-publish-source-directory diff --git a/source/assets/completion-preview-1.png b/source/assets/completion-preview-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0ba6b7b468b0bb5b9c486784bfd863af5df57d GIT binary patch literal 15291 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 literal 0 HcmV?d00001 diff --git a/source/assets/completion-preview-2.png b/source/assets/completion-preview-2.png new file mode 100644 index 0000000000000000000000000000000000000000..fd111d34f7bce58de250c62a6712dcdaf60e95e7 GIT binary patch literal 17146 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 E0TX_7Pyhe` literal 0 HcmV?d00001 diff --git a/source/notes/prolog.org b/source/notes/prolog.org new file mode 100644 index 0000000..256889a --- /dev/null +++ b/source/notes/prolog.org @@ -0,0 +1,13 @@ +#+TITLE: Prolog +#+SUBTITLE: My favorite programming language +#+DESCRIPTION: Eshel Yaron's notes about Prolog +#+KEYWORDS: logic +#+DATE: 2023-11-17 + + +* References in published posts +#+BEGIN: links-to-note :dir "/Users/eshelyaron/checkouts/esy-publish/source/posts/" +#+END: +* References in other notes +#+BEGIN: links-to-note :dir "/Users/eshelyaron/checkouts/esy-publish/source/notes/" +#+END: diff --git a/source/notes/python.org b/source/notes/python.org new file mode 100644 index 0000000..0f8104d --- /dev/null +++ b/source/notes/python.org @@ -0,0 +1,13 @@ +#+TITLE: Python +#+SUBTITLE: Something to avoid +#+DESCRIPTION: Eshel Yaron's notes about Python +#+KEYWORDS: computers +#+DATE: 2023-11-17 + + +* References in published posts +#+BEGIN: links-to-note :dir "/Users/eshelyaron/checkouts/esy-publish/source/posts/" +#+END: +* References in other notes +#+BEGIN: links-to-note :dir "/Users/eshelyaron/checkouts/esy-publish/source/notes/" +#+END: diff --git a/source/posts/2023-11-17-completion-preview-in-emacs.org b/source/posts/2023-11-17-completion-preview-in-emacs.org new file mode 100644 index 0000000..e32ffad --- /dev/null +++ b/source/posts/2023-11-17-completion-preview-in-emacs.org @@ -0,0 +1,161 @@ +#+TITLE: Completion Preview in Emacs +#+SUBTITLE: Some details about a new Emacs text completion feature +#+DESCRIPTION: Post by Eshel Yaron with details about a new Emacs text completion feature +#+KEYWORDS: emacs,lisp +#+DATE: 2023-11-17 + +@@html:@@ + +Earlier this week, a new Elisp library of mine, +=completion-preview.el=, made its way to upstream [[note:emacs][Emacs]] master. + +This library provides a minor mode called Completion Preview mode. +Can you guess what it does? Well, let me spell it out anyway. +Completion Preview mode automatically displays a preview of a +completion suggestion as you type. Here's how this preview looks like +when you start typing something (a [[note:prolog][Prolog]] predicate, in this case): + +#+attr_html: :width 300px +[[file:../assets/completion-preview-1.png]] + +The preview appears right after the cursor, showing you how the text +will look if you follow this completion suggestion. When there's only +one matching completion candidate, Completion Preview mode indicates +that with an underline: + +#+attr_html: :width 300px +[[file:../assets/completion-preview-2.png]] + +The idea is to suggest something that you might want to insert, and +give you a shortcut for inserting it quickly, while staying minimally +intrusive. + +The Emacs manual and the commentary section of =completion-preview.el= +contain helpful documentation for using this library, nevertheless I +want to go into more detail and share a bit about my own set up here. + +* Usage + +To enable Completion Preview mode, say ~M-x completion-preview-mode~. +Whenever Completion Preview mode shows the preview, it temporarily +enables a helper minor mode called ~completion-preview-active-mode~. +The most important job of this "active" minor mode is to enable its +associated keymap, ~completion-preview-active-mode-map~. Other than +that, it doesn't do much by default, but this gives us a convenient +way to bind some keys only when showing the completion preview. +Crucially, whenever the preview is shown, ~TAB~ inserts its contents. +Otherwise, Completion Preview mode doesn't bind any keys. Again, the +aim is to be maximally helpful while remaining minimally intrusive. + +So far I've mostly described what the completion preview looks like +and how you use it, but there are two important questions that you +probably want me to explain to really understand how this mode works. + +The first question is "where do the completion suggestions come from"? +The answer is that Completion Preview mode uses +~completion-at-point-functions~ as its "backend", and only that. This +means that you control which completion suggestions you get with the +same extensible mechanism that you use for customizing your regular +in-buffer completions, no extra configuration needed. You can think +of Completion Preview as another, second, "frontend" for +~completion-at-point-functions~. I explicitly say it's a second +frontend, because Completion Preview does not replace your regular +completion selection UI, be it [[https://github.com/minad/corfu][~corfu~]] and its kind or the good old +=*Completions*= buffer. The preview and the selection UI are two +complementary features, so you can use Completion Preview with any +completion UI. + +The second important question is "when exactly is the preview shown?" +The answer is that it /may/ be shown after each command. My initial +implementation included a user-extensible hook that Completion Preview +mode consulted with after each command to determine whether or not to +show the preview, but that was [[https://debbugs.gnu.org/cgi/bugreport.cgi?bug=66948#68][dimmed]] "over-engineered" during the +patch review, so currently we have two simple conditions that must +hold for Completion Preview to show the preview: + +1. the last command is one of ~completion-preview-commands~, and +2. the symbol at point is at least + ~completion-preview-minimum-symbol-length~ characters long. + +By default, this concretely means that the preview is shown whenever +you're typing or deleting characters and there's a partial symbol/word +of at least three characters at point. Of course, you can customize +~completion-preview-commands~ and +~completion-preview-minimum-symbol-length~ to modify these conditions. +If you need more flexibility in specifying restrictions for when to +show the preview, please speak up, and I'll try to reintroduce that +hook I mentioned earlier. + +Here's my current personal configuration for Completion Preview mode: + +#+begin_src emacs-lisp + ;; Enable Completion Preview mode in code buffers + (add-hook 'prog-mode-hook #'completion-preview-mode) + ;; also in text buffers + (add-hook 'text-mode-hook #'completion-preview-mode) + ;; and in \\[shell] and friends + (with-eval-after-load 'comint + (add-hook 'comint-mode-hook #'completion-preview-mode)) + + (with-eval-after-load 'completion-preview + ;; Show the preview already after two symbol characters + (setq completion-preview-minimum-symbol-length 2) + + ;; Non-standard commands to that should show the preview: + + ;; Org mode has a custom `self-insert-command' + (push 'org-self-insert-command completion-preview-commands) + ;; Paredit has a custom `delete-backward-char' command + (push 'paredit-backward-delete completion-preview-commands) + + ;; Bindings that take effect when the preview is shown: + + ;; Cycle the completion candidate that the preview shows + (keymap-set completion-preview-active-mode-map "M-n" #'completion-preview-next-candidate) + (keymap-set completion-preview-active-mode-map "M-p" #'completion-preview-prev-candidate) + ;; Convenient alternative to C-i after typing one of the above + (keymap-set completion-preview-active-mode-map "M-i" #'completion-preview-insert)) +#+end_src + +Recall that Completion Preview mode relies on +~completion-at-point-functions~ to produce the actual candidates, so +make sure you set that up properly as well! + +* Alternatives + +Now that we know what this new Completion Preview mode is all about, +you might be wondering how it compares to other habitants of +Emacs-land. There are several third party packages whose +functionality is similar to, or overlaps with, that of Completion +Preview mode. Sometimes, the same concept goes by different names, +such as "suggestion preview" or "ghost text". + +Other than shipping with core Emacs, here are some key differences of +Completion Preview compared to other embodiments of similar concepts: + +- [[https://code.bsdgeek.org/adam/corfu-candidate-overlay][~corfu-candidate-overlay~]] :: builds on top of ~corfu~ while + Completion Preview is completely agnostic to which completion UI + you're using +- [[https://codeberg.org/ideasman42/emacs-mono-complete][~mono-complete~]] :: departs from the strong coupling with + ~completion-at-point-functions~ that Completion Preview enjoys by + supporting multiple backends, and even including a bespoke word + prediction [[note:python][Python]] program +- [[https://github.com/jrosdahl/fancy-dabbrev][~fancy-dabbrev~]] :: targets only ~dabbrev~ as its backend +- [[https://repo.or.cz/emacs-capf-autosuggest.git][~capf-autosuggest~]] :: only works in ~comint-mode~ buffers +- [[http://company-mode.github.io/][~company~]] :: brings along its own completion framework with multiple + backends and frontends, including a preview completion frontend. + Unlike other packages on this list, it makes sense to use Company + and Completion Preview together, when you're using Company for its + other frontends. + +* Conclusion + +I've been using this mode myself since I started working on it several +weeks ago, and so far I find it quite nice. I usually steer clear of +various autopopups that distract me from what I'm actually trying to +write down, but I find that this preview interface strikes a great +balance between being suggestive and being pushy. So I'm pretty happy +with this addition to Emacs. There's still some time before Emacs 30 +will be cut, so if you're reading this and you find something that +warrants some improvement, let me know! (Or just do ~M-x +report-emacs-bug~.) -- 2.39.5