emacs-which-key icon indicating copy to clipboard operation
emacs-which-key copied to clipboard

Which-key does not show certain General key bindings

Open Sholum1 opened this issue 5 years ago • 20 comments

Here are some of my General key bindings:

(dw/leader-key-def "r" '(ivy-resume :which-key "ivy resume") "f" '(:ignore t :which-key "files") "ff" '(counsel-find-file :which-key "open file") "fr" '(counsel-recentf :which-key "recent files") "fR" '(revert-buffer :which-key "revert file") "fl" '(load-file :which-key "load file") "fs" '(save-buffer :which-key "save file"))

(dw/leader-key-def "b" '(:ignore t :which-key "buffers") "bb" '(counsel-switch-buffer :which-key "switch buffer") "bn" '(bury-buffer :which-key "bury buffer") "bd" '(:ignore t :which-key "kill buffer") "bdd" '(kill-buffer-and-window :which-key "current buffer") "bdo" '(kill-buffer :which-key "other buffer"))

My General configuration:

(use-package general :config (general-evil-setup t)

(general-create-definer dw/leader-key-def :keymaps '(normal insert visual emacs) :prefix "SPC" :global-prefix "C-SPC"))

And my which-key configuration:

(use-package which-key :init (which-key-mode) :diminish which-key-mode :config (setq which-key-idle-delay 0.3))

Here is some print screen of what appears when I try to press, respectively "SPC", "SPC-f" and "SPC-b" Screenshot_20201024_235758 Here, as it is noticeable, the option "buffers" does not even appear.

Screenshot_20201024_235827 Only the options "r - recent files" and "s - save file" appear here.

Screenshot_20201024_235847 And here what happens when I try to push any of the "key bindings" that are not listed.

The problem started today when I reinstalled my emacs and started my init.el. Note: I use gccemacs Note 2: This is my emacs configuration until now

Sholum1 avatar Oct 25 '20 03:10 Sholum1

(general-create-definer dw/leader-key-def
:keymaps '(normal insert visual emacs)
:prefix "SPC"
:global-prefix "C-SPC"))

Maybe you meant:

  :keymaps 'override
  :states '(insert emacs normal hybrid motion visual operator)

progfolio avatar Oct 26 '20 17:10 progfolio

By default, which-key ignores bindings to ignore, but I see that general recommends this. It would be helpful to have some clarification from the general package on what exactly :ignore t does.

justbur avatar Oct 26 '20 18:10 justbur

Maybe you meant:

  :keymaps 'override
  :states '(insert emacs normal hybrid motion visual operator)

I tried but it didn't solve the problem, but thanks for the tip, I'll keep it that way hahahah

Sholum1 avatar Oct 26 '20 20:10 Sholum1

By default, which-key ignores bindings to ignore, but I see that general recommends this. It would be helpful to have some clarification from the general package on what exactly :ignore t does.

Well, I tried to remove the t but it didn't change, I believe that with or without t the effect is the same hahahah

Sholum1 avatar Oct 26 '20 20:10 Sholum1

Same here, reinstalled emacs today (native comp) and also got this problem. The first 3 items of whichkey are always missing. Using DOOM emacs. Great package, thank you!

matteha avatar Oct 28 '20 23:10 matteha

Update: reverted back to an earlier commit of native comp (git checkout 5b41545f1be367837d9ac717ea67fba19a4c24d4) and which-key works properly again.

matteha avatar Oct 29 '20 03:10 matteha

Emacs 28 has the same issue...

In GNU Emacs 28.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.23, cairo version 1.17.3)
 of 2020-10-29 built on lilydjwg
Repository revision: bb3d13ac3586d3577605d3d8809d31c62a267c99
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12009000
System Description: Arch Linux
which-key-20200908.230
(use-package general
  :ensure t
  :after evil
  :config
  (general-create-definer leader-def
    :states 'normal
    :prefix "SPC"
    :keymaps 'override)

  (leader-def
    ;; file
    "f" '(:ignore t :which-key "file")
    "ff" 'find-file
    "fF" 'find-file-other-window
    "fg" 'rgrep
    "fj" 'counsel-file-jump
    "fo" 'counsel-find-file-extern
    "fC" 'my/copy-current-file
    "fD" 'my/delete-current-file
    "fy" 'my/copy-current-filename
    "fR" 'my/rename-current-file
    "fr" 'counsel-recentf
    "fl" 'find-file-literally
    "fz" 'counsel-fzf)
  :custom
  (general-implicit-kbd t)
  (general-override-auto-enable t))

image

fF, fC, fD are missing.

condy0919 avatar Oct 29 '20 15:10 condy0919

  • emacs-version: "GNU Emacs 28.0.50 (build 1, x86_64-pc-linux-gnu, X toolkit, cairo version 1.17.3, Xaw3d scroll bars) of 2020-10-30"

(https://github.com/emacs-mirror/emacs/commit/3e63213a1fef16ffe38a5024a83d8782e98aabe1)

With the following configuration:

Configuration
(general-create-definer global-definer
  :keymaps 'override
  :states '(insert emacs normal hybrid motion visual operator)
  :prefix "SPC"
  :non-normal-prefix "S-SPC")

;;; This is an expansion of a macro used to create a nested layer under the global definer
(progn
  (general-create-definer +general-global-bookmark :wrapping global-definer :prefix-map '+general-global-bookmark-map :infix "B" :wk-full-keys nil ""
    '(:ignore t :which-key "bookmark"))
  (+general-global-bookmark "j" 'bookmark-jump "s" 'bookmark-set "r" 'bookmark-rename))

pressing SPC Btriggers the "%s- which-key: There are no keys to show" message in which--key-create-buffer-and-show. The bindings under SPC B still work, despite the message.

I don't think this is general.el specific, though. In addition to some bindings not being recognized by which-key, the *Messages* buffer is being clobbered with output whenever the which-key-buffer is shown:


`t' Minor Mode Bindings Starting With SPC:
key             binding
---             -------

There was recently an elisp re-implementation of some of the C machinery around describe-buffer-bindings: https://github.com/emacs-mirror/emacs/commit/420023a6f066d6ffb85e23ffe3abcfee3d523ea7 which is probably worth looking into.

For me the failure seems to be in which-key--get-current-bindings. describe-buffer-bindings is returning bindings, but the parsing is failing (particularly the section which binds header-p by looking for a formfeed character. I suspect something has changed about describe-buffer-bindings output and the assumption that we're on a header then skips over bindings) and returning nil.

When executing:

(describe-buffer-bindings (current-buffer) [32 ?B])

The text inserted in the buffer is:

SPC B j         bookmark-jump
SPC B r         bookmark-rename
SPC B s         bookmark-set

progfolio avatar Oct 30 '20 07:10 progfolio

This rough patch takes care of the problem of which-key recognizing keys on latest master. It is not backward compatible in its current state:

(defun which-key--get-current-bindings (prefix)
  "Generate a list of current active bindings."
  (let* ((key-str-qt (regexp-quote (key-description prefix)))
         (buffer (current-buffer))
         (ignore-bindings '("self-insert-command" "ignore"
                            "ignore-event" "company-ignore"))
         (tests
          (list (cons (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt)
                      (lambda (key) (match-string 1 key)))
                (cons
                 (format "^%s[ \t]\\([^ \t]+\\) \\.\\. %s[ \t]\\([^ \t]+\\)[ \t]+$"
                         key-str-qt key-str-qt)
                 (lambda (key) (concat (match-string 1 key)
                                       " \.\. "
                                       (match-string 2 key))))
                ;;@OPTIMIZATION: could be combined with first test
                (cons "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$"
                      (lambda (key) (match-string 1 key)))))
         bindings)
    (with-temp-buffer
      (setq-local indent-tabs-mode t)
      (setq-local tab-width 8)
      ;;@HACK: workaround for Emacs master `describe-buffer-bindings' clobbering *Messages*
      (let (message-log-max) (describe-buffer-bindings buffer prefix))
      (goto-char (point-min))
      (while (not (eobp))
        (unless (looking-at "^[ \t]*$")
          (when-let* ((binding-start (save-excursion
                                       (and (re-search-forward "\t+" nil t)
                                            (match-end 0))))
                      (key (buffer-substring-no-properties (point) binding-start))
                      (binding (buffer-substring-no-properties binding-start
                                                               (line-end-position))))
            (unless (or (member binding ignore-bindings)
                        (string-match-p which-key--ignore-keys-regexp key))
              (cl-some (lambda (test)
                         (save-match-data
                           (when-let ((k (and (string-match (car test) key)
                                              (funcall (cdr test) key))))
                             (unless (assoc-string k bindings)
                               (push (cons k (which-key--compute-binding binding)) bindings)))))
                       tests))))
        (forward-line)))
    (nreverse bindings)))

@condy0919 does this patch work for you?

@justbur:

The patch works on my system. I took the approach of moving the tests to parse each line into a list and associating a transformation function which will be called when a match is found. This should be easier to extend and avoids the repetition in the original cond that parses the bindings buffer. It also avoids the format strings being recomputed on each pass.

In order to make this backward compatible, we'd have to avoid use of, or defalias, when-let* (introdiced in emacs-26.0.90, I believe) and add the header skipping back into the parsing logic. I plan on submitting a bug-report w emacs-devel regarding the *Message* buffer getting clobbered with describe-buffer-bindings output. Normally, I would've submitted this as a pull, but I'd like to see what upstream has to say about the new behavior and if it is changed as a result of the bug report.

progfolio avatar Oct 30 '20 08:10 progfolio

@progfolio it works, thanks!

condy0919 avatar Oct 31 '20 07:10 condy0919

In ansi-term, C-c triggers another error:

Debugger entered--Lisp error: (wrong-type-argument listp insert-file)
  describe-map-tree((keymap #^[nil nil keymap
#^^[3 0 set-mark-command move-beginning-of-line backward-char mode-specific-command-prefix delete-char move-end-of-line forward-char keyboard-quit help-command indent-for-tab-command electric-newline-and-maybe-indent kill-line recenter-top-bottom ...] #^^[1 0 #^^[2 0
#^^[3 0 set-mark-command move-beginning-of-line backward-char mode-specific-command-prefix delete-char move-end-of-line forward-char keyboard-quit help-command indent-for-tab-command electric-newline-and-maybe-indent kill-line recenter-top-bottom ...] self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command ...] self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command ...] self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command ...] ... ... ... ... ... ... ... ... ... ... ... ... ...) t (... ... ... ... ... ... ... ... ... ... ... ... ... ... ...) [3] "\f\nGlobal Bindi..." t nil t nil)
  #<subr describe-buffer-bindings>(#<buffer *terminal-1*> [3] nil)
  apply(#<subr describe-buffer-bindings> (#<buffer *terminal-1*> [3]))
  describe-buffer-bindings(#<buffer *terminal-1*> [3])
  which-key--get-current-bindings([3])
  which-key--get-bindings([3] nil nil)
  which-key--create-buffer-and-show([3])
  which-key--update()
  apply(which-key--update nil)
  timer-event-handler([t 0 0 500000 t which-key--update nil idle 0])

After applying this patch, it prints more errors

Debugger entered--Lisp error: (wrong-type-argument listp insert-file)
  describe-map-tree((keymap #^[nil nil keymap 
#^^[3 0 set-mark-command move-beginning-of-line backward-char mode-specific-command-prefix delete-char move-end-of-line forward-char keyboard-quit help-command indent-for-tab-command electric-newline-and-maybe-indent kill-line recenter-top-bottom ...] #^^[1 0 #^^[2 0 
#^^[3 0 set-mark-command move-beginning-of-line backward-char mode-specific-command-prefix delete-char move-end-of-line forward-char keyboard-quit help-command indent-for-tab-command electric-newline-and-maybe-indent kill-line recenter-top-bottom ...] self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command ...] self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command ...] self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command self-insert-command ...] ... ... ... ... ... ... ... ... ... ... ... ... ...) t (... ... ... ... ... ... ... ... ... ... ... ... ... ... ...) [3] "\f\nGlobal Bindi..." t nil t nil)
  #<subr describe-buffer-bindings>(#<buffer *terminal-1*> [3] nil)
  apply(#<subr describe-buffer-bindings> (#<buffer *terminal-1*> [3]))
  describe-buffer-bindings(#<buffer *terminal-1*> [3])
  (let (message-log-max) (describe-buffer-bindings buffer prefix))
  (progn (set (make-local-variable 'indent-tabs-mode) t) (set (make-local-variable 'tab-width) 8) (let (message-log-max) (describe-buffer-bindings buffer prefix)) (goto-char (point-min)) (while (not (eobp)) (if (looking-at "^[ \11]*$") nil (let* ((binding-start (and t (save-excursion ...))) (key (and binding-start (buffer-substring-no-properties ... binding-start))) (binding (and key (buffer-substring-no-properties binding-start ...)))) (if binding (if (or (member binding ignore-bindings) (string-match-p which-key--ignore-keys-regexp key)) nil (cl-some #'... tests))))) (forward-line)))
  (unwind-protect (progn (set (make-local-variable 'indent-tabs-mode) t) (set (make-local-variable 'tab-width) 8) (let (message-log-max) (describe-buffer-bindings buffer prefix)) (goto-char (point-min)) (while (not (eobp)) (if (looking-at "^[ \11]*$") nil (let* ((binding-start (and t ...)) (key (and binding-start ...)) (binding (and key ...))) (if binding (if (or ... ...) nil (cl-some ... tests))))) (forward-line))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))
  (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (set (make-local-variable 'indent-tabs-mode) t) (set (make-local-variable 'tab-width) 8) (let (message-log-max) (describe-buffer-bindings buffer prefix)) (goto-char (point-min)) (while (not (eobp)) (if (looking-at "^[ \11]*$") nil (let* ((binding-start ...) (key ...) (binding ...)) (if binding (if ... nil ...)))) (forward-line))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))
  (let ((temp-buffer (generate-new-buffer " *temp*"))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (set (make-local-variable 'indent-tabs-mode) t) (set (make-local-variable 'tab-width) 8) (let (message-log-max) (describe-buffer-bindings buffer prefix)) (goto-char (point-min)) (while (not (eobp)) (if (looking-at "^[ \11]*$") nil (let* (... ... ...) (if binding ...))) (forward-line))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer)))))
  (let* ((key-str-qt (regexp-quote (key-description prefix))) (buffer (current-buffer)) (ignore-bindings '("self-insert-command" "ignore" "ignore-event" "company-ignore")) (tests (list (cons (format "^%s[ \11]\\([^ \11]+\\)[ \11]+$" key-str-qt) #'(lambda (key) (match-string 1 key))) (cons (format "^%s[ \11]\\([^ \11]+\\) \\.\\. %s[ \11]\\([^ \11]+\\)[ \11]+$" key-str-qt key-str-qt) #'(lambda (key) (concat ... " .. " ...))) (cons "^\\([^ \11]+\\|[^ \11]+ \\.\\. [^ \11]+\\)[ \11]+$" #'(lambda (key) (match-string 1 key))))) bindings) (let ((temp-buffer (generate-new-buffer " *temp*"))) (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn (set (make-local-variable 'indent-tabs-mode) t) (set (make-local-variable 'tab-width) 8) (let (message-log-max) (describe-buffer-bindings buffer prefix)) (goto-char (point-min)) (while (not (eobp)) (if (looking-at "^[ \11]*$") nil (let* ... ...)) (forward-line))) (and (buffer-name temp-buffer) (kill-buffer temp-buffer))))) (nreverse bindings))
  which-key--get-current-bindings([3])
  which-key--get-bindings([3] nil nil)
  which-key--create-buffer-and-show([3])
  which-key--update()
  apply(which-key--update nil)
  timer-event-handler([t 0 0 500000 t which-key--update nil idle 0])

Should I open an another issue?

condy0919 avatar Oct 31 '20 07:10 condy0919

It would be useful to see your config for the keybindings in that buffer if applicable.

Should I open an another issue?

I think what you're seeing is related to this issue.

progfolio avatar Oct 31 '20 07:10 progfolio

(use-package term
  :ensure nil
  :bind (:map term-raw-map
         ("C-c C-y" . term-paste)
         ;; Don't capture my keys!
         ("M-o" . nil)
         ("M-=" . nil)
         ("M-:" . nil)
         ("M-x" . nil)
         ("C-h" . nil)
         ("C-x" . nil)
         ("C-u" . nil))
  :custom
  (term-input-ignoredups t)
  (term-completion-autolist t)
  (term-scroll-to-bottom-on-output 'all))

Then M-x ansi-term will trigger errors.

Weird, emacs -Q is fine.

The term-mode-map definition

term-mode-map is a keymap variable defined in ‘term.el’.

Documentation:
Keymap for Term mode.

key             binding
---             -------

C-c             Prefix Command
C-d             term-delchar-or-maybe-eof
RET             term-send-input
ESC             Prefix Command
<normal-state>  Prefix Command

<normal-state> C-c              Prefix Command
<normal-state> C-j              term-next-prompt
<normal-state> C-k              term-previous-prompt
<normal-state> RET              term-send-input
<normal-state> $                term-show-maximum-output
<normal-state> [                Prefix Command
<normal-state> ]                Prefix Command
<normal-state> ^                term-bol
<normal-state> g                Prefix Command
<normal-state> p                term-paste

C-c C-a         term-bol
C-c C-c         term-interrupt-subjob
C-c C-d         term-send-eof
C-c C-e         term-show-maximum-output
C-c C-j         term-line-mode
C-c C-k         term-char-mode
C-c C-l         term-dynamic-list-input-ring
C-c RET         term-copy-old-input
C-c C-n         term-next-prompt
C-c C-o         term-kill-output
C-c C-p         term-previous-prompt
C-c C-q         term-pager-toggle
C-c C-r         term-show-output
C-c C-u         term-kill-input
C-c C-w         backward-kill-word
C-c C-z         term-stop-subjob
C-c C-\         term-quit-subjob

C-M-l           term-show-output
M-n             term-next-input
M-p             term-previous-input
M-r             term-previous-matching-input
M-s             term-next-matching-input
A-M-r           term-previous-matching-input-from-input
A-M-s           term-next-matching-input-from-input

<normal-state> g j              term-next-prompt
<normal-state> g k              term-previous-prompt

<normal-state> ] ]              term-next-prompt

<normal-state> [ [              term-previous-prompt

<normal-state> C-c C-k          evil-collection-term-char-mode-insert

PS: I'm using evil-mode

condy0919 avatar Oct 31 '20 08:10 condy0919

@condy0919 I believe that is a bug upstream. I've submitted a report:

https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-10/msg02841.html

@justbur Noting here that the issue with the message buffer can easily be worked around. Output is being printed to standard-output as indicated here:

https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-10/msg02703.html

Something like:

(let ((standard-output 'ignore)) (describe-buffer-bindings ...
;;etc
)

will work

related bug in swiper: https://github.com/abo-abo/swiper/issues/2709

progfolio avatar Oct 31 '20 21:10 progfolio

related bug in swiper: abo-abo/swiper#2709

The workaround in that issue is no longer needed; see https://debbugs.gnu.org/39149#37.

basil-conto avatar Nov 01 '20 15:11 basil-conto

Both issues fixed on master as of https://github.com/emacs-mirror/emacs/commit/5ab5504def63ebdfba08169f24a5829353bff137

Everything working fine now!

progfolio avatar Nov 01 '20 22:11 progfolio

Thanks everyone, and sorry for being absent (hard to find time these days)

justbur avatar Nov 03 '20 19:11 justbur

I see this is still open somehow, even though the conversation suggests the issue has been resolved. But I recently encountered what looks like the exact same issue. Bindings that appear if I set them without general do not show up if I set them using general.

I can reproduce this using the following config:

(defvar bootstrap-version)
(let ((bootstrap-file
           (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
          (bootstrap-version 5))
  (unless (file-exists-p bootstrap-file)
        (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
          (goto-char (point-max))
          (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

(setq package-enable-at-startup nil)
(straight-use-package 'use-package)
(setq straight-use-package-by-default t)

;; disable verbose warnings related to native-compilation
(require 'comp nil t)
(when (fboundp 'native-compile)
  (setq native-comp-async-report-warnings-errors nil))

(global-unset-key (kbd "C-SPC"))

(defvar my/bib-default-bib '("~/bib/apcmain.bib")
  "List of .bib files to use as default.")
(defconst my/biblio-leader "C-SPC b")

(use-package which-key
  :demand
  :bind (:map help-map
              ("C-h" . which-key-C-h-dispatch))
  :config
  (which-key-mode)
  :custom
  (which-key-idle-delay 0.5))

(use-package general
  :demand
  :config
  (general-def :prefix my/biblio-leader :prefix-name "Bibliography commands"
      "" '(:ignore t :wk "biblio")))

(defun my/bib-open-main-bib ()
  "Open `my/bib-default-bib'."
  (interactive)
  (let* ((file my/bib-default-bib)
         (file (if (cdr file)
                    (completing-read "Open bibliography file: " file nil t)
                  (car file))))
    (find-file file)))

(use-package bibtex
  :straight nil
  :bind ("C-SPC b h" . my/bib-open-main-bib)
  :general (:prefix my/biblio-leader
                    "b" '(my/bib-open-main-bib :wk open main .bib file)))
image

Here's what I get with emacs-version:

GNU Emacs 28.2 (build 1, x86_64-apple-darwin21.6.0, NS appkit-2113.60 Version 12.5 (Build 21G72)) of 2022-09-13

I'm using Which-Key v3.6.0-16-g8093644

apc avatar Oct 15 '22 02:10 apc

So, to make it as minimal as possible, here's another even simpler config that reproduces the issue:

(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)


(setq package-list '(general
                     which-key))

(package-initialize)
(unless package-archive-contents
  (package-refresh-contents))

(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))


(defun my/test-fn ()
  "Say `Hello'."
  (interactive)
  (message "Hello"))


(require 'general)
(require 'which-key)
(which-key-mode)
(define-key help-map (kbd "C-h") 'which-key-C-h-dispatch)


(global-set-key (kbd "C-c b h") 'my/test-fn)

(general-def :prefix "C-c b" :prefix-name "Test"
	"" '(:ignore t :wk "test")
  "b" '(my/test-fn :wk Say hi))

image

Note that the issue disappears if I replace the last call of general-def with this

(general-def :prefix "C-c b" :prefix-name "Test"
	"" '(:ignore t :wk "test")
  "b" #'my/test-fn)

apc avatar Oct 15 '22 17:10 apc

Final comment (for now!): for anyone running into a similar issue, there's a related issue at the general repo which made me try this, which does just what I wanted with the original attempt at using :wk but actually works:

(general-def :prefix "C-c b" :prefix-name "Test"
	"" '(:ignore t :wk "test")
  "b" '("Say hi" . my/test-fn))

In other words, using a cons rather than relying on :wk seems like the safe way to go. (Interestingly, using :wk works pretty much everywhere else in my config, not sure why it was not working just here...)

apc avatar Oct 15 '22 19:10 apc