Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

major-mode-keys not always working #22

Open
thorstengrothe opened this issue May 7, 2018 · 12 comments
Open

major-mode-keys not always working #22

thorstengrothe opened this issue May 7, 2018 · 12 comments

Comments

@thorstengrothe
Copy link

I'm using ryo with auctex and have a small issue with my major mode key setting, see here:

(ryo-modal-major-mode-keys
   'latex-mode
   ("q" LaTeX-fill-environment)
   ("E" LaTeX-close-environment)
   )

LaTeX-fill-environment is working fine but LaTeX-close-environment not. I got an error message

Error (use-package): ryo-modal/:config: ‘LaTeX-close-environment’ isn’t a function

Auctex is loaded by use-package like so:

(use-package tex
  :ensure auctex
  :mode ("\\.tex\\'" . latex-mode)

BTW it's the same with LaTeX-fill-region, only LaTeX-fill-environment is working...
What can I do to fix this?

Regards
Thorsten

@Kungsgeten
Copy link
Owner

I think the problem is that tex is lazy loaded, so that the functions you describe isn't available until you use tex. This is because of the mode: clause in your use-package declaration. You could add :demand t to fix this.

Another alternative is to not add the keys until latex is loaded:

(with-eval-after-load 'latex
  (ryo-modal-major-mode-keys
   'latex-mode
   ("q" LaTeX-fill-environment)
   ("E" LaTeX-close-environment)))

I think that should work.

@Kungsgeten
Copy link
Owner

Another way could be (I haven't tried it) to use the ryo: keyword in use-package:

(use-package tex
  :ensure auctex
  :mode ("\\.tex\\'" . latex-mode)
  :ryo
  (:mode 'latex-mode)
  ("q" LaTeX-fill-environment)
  ("E" LaTeX-close-environment))

@thorstengrothe
Copy link
Author

The first suggestion works fine, the second with use-package fails with an error:

Failed to parse package tex: use-package: Unrecognized keyword: :ryo

I can live with the first solution but I'm wondering why the :ryo keyword with use-package is not working..

Thanks for the fast help!

Thorsten

@Kungsgeten
Copy link
Owner

Kungsgeten commented May 8, 2018

I'm not quite sure, since I haven't written the use-package integration feature myself. My guess is that you're using use-package with the ryo: keyword before you've loaded ryo. This could be because you are lazy loading ryo, or because ryo comes later in your init-file.

Perhaps @hgersen have suggestions on what to do?

@thorstengrothe
Copy link
Author

Yes indeed, in my config ryo is loaded very late and all other packages are lazy loaded before with use-package. I did that because ryo complains about undefined functions if the packages, take avy here, are not loaded before ryo. That's a small dilemma here. If I load ryo early the :ryo keyword is working but I got a lot of not defined funcs, if I load it at the end of my config the funcs are defined but the ryo keyword is not working. I don't really know a way out of this.

@Kungsgeten
Copy link
Owner

I've experienced these problems to. I'm not sure what's the best approach.

Perhaps you could load ryo early, and put the bindings dependant on other packages in a with-eval-after-load (if you don't want to use the ryo: keyword in use-package for all those commands)? Another way, which might save you some trouble, could be to load ryo early, then use the ryo: keyword throughout the config (where you see fit), and at the end then load all your default ryo bindings. Something like this (example):

;; Demands ryo-modal early, so the ryo: use-package keyword works
(use-package ryo-modal :ensure t :demand t)

;; Example of keywords in use-package
(use-package avy
  :ryo
  ("f" avy-goto-word-1))

;; Example of instead doing it without the ryo keyword (probably makes more
;; sense for major-mode specific packages, like tex below).
(use-package tex
  :ensure auctex
  :mode ("\\.tex\\'" . latex-mode)
  :config
  (ryo-modal-major-mode-keys
   'latex-mode
   ("q" LaTeX-fill-environment)
   ("E" LaTeX-close-environment)))

;; End of config, add the rest of your ryo stuff
(bind-key "C-c SPC" 'ryo-modal-mode)

(ryo-modal-keys
 (:norepeat t)
 ("0" "M-0")
 ("1" "M-1")
 ("2" "M-2")
 ("3" "M-3")
 ("4" "M-4")
 ("5" "M-5")
 ("6" "M-6")
 ("7" "M-7")
 ("8" "M-8")
 ("9" "M-9")
 ("p" counsel-projectile)               ; Example if you do not defer this
                                        ; package, and therefore can use it
                                        ; right away at the end of the config
 )

;; etc...

@hgersen
Copy link
Contributor

hgersen commented May 9, 2018

Sorry for the slow response as I was very busy with work.

When I was using :ryo to bind keys I indeed used the demand t option for ryo-modal to be able to use the :ryo keyword and it needs to come before the :ryo keyword would be used. I don't see a way around that as otherwise use-package doesn't know that the :ryo keyword exists!

Note that even when using :ryo it is important to keep the notes on lazy loading in the use-package readme in mind as it is not a case of just adding defer t. Use-package will still need to have enough info to know what commands/functions need to be auto-loaded, through things like :command, :mode, :hook.

Unfortunately I have personally stopped using the :ryo keyword as I went back to using :bind, :hook, etc from use-package directly. Although it worked when I used it, the key reason to do this was to have one less layer of confusion/error to deal with. My personal config has bits where :bind should work, but it doesn't for example.

btw) from the description of the problem I find it very hard to see what is going wrong. It might be worth posting a very minimal example to illustrate the problem better?

btw2) If your problem is to get latex working. I think you should be using

use-package latex
:ensure auctex
...etc

so not tex!

edit) Now I look in a bit more detail at the examples....maybe you should be using :hook instead of :mode? My current config is still work in progress, but the example for flyspell below is what I do.

(use-package flyspell
  :straight t
  :bind
  (:map flyspell-mode-map
        ("C-;" . flyspell-correct-previous-word-generic))
  :hook ((text-mode . flyspell-mode)
         (org-mode . flyspell-mode))
  :config
  (setq ispell-program-name "hunspell"
        ispell-really-hunspell t
        ispell-dictionary "en_GB"))

@thorstengrothe
Copy link
Author

Thanks both of you for your detailed answers. I fiddled a bit in my config and decided keep it like it is. ryo-modal with it's keybinds is loaded at the end. I find it very convenient to have keybinds at one place. So I do not use :ryo keyword at all. I can live with that as I said.

@hgersen yes I changed from tex to latex and most of it works now but not everything, see here:

(with-eval-after-load 'latex
    (ryo-modal-major-mode-keys
     'latex-mode
     ("q q" LaTeX-fill-environment) --> works
     ("h e" TeX-fold-env) --> fails
     ))

I guess that has something to do with a special auctex minor mode, but I don't know. I solved it with a custom hydra for folding, that worked!

In general I think, ryo-modal is a bit sensitive in relation to the load order of packages. I don't know if evil or boon-mode do not have this problem...

@Kungsgeten
Copy link
Owner

Perhaps you could try with-eval-after-load 'auctex instead? At least if you always run auctex when eding LaTeX files.

@hgersen
Copy link
Contributor

hgersen commented May 10, 2018

Seeing this example I would personally check the one that fails with a different keybinding as I have been bitten by that one before. Things tend to fail in obscure ways if you reuse a binding by accident....and h e or h on its own might already exist in latex-mode.

btw) My understanding is that using :hook would have the same effect as doing eval-after-load, but cleaner.

@thorstengrothe
Copy link
Author

Ok, after some fiddeling with use-package I got the following configured

(use-package ryo-modal
  ...
  :hook
  (LaTeX-mode . my/ryo-modal-latex-keybinds)
  :config
  ;; keybinds for major modes
  (defun my/ryo-modal-latex-keybinds ()
    "Ryo modal keybinds for latex mode"
    (ryo-modal-major-mode-keys
     'latex-mode
     ("m e" LaTeX-mark-environment :name "latex mark env")
     ("q q" LaTeX-fill-environment)
     ("q p" LaTeX-fill-paragraph)
    ...
    ))

This works fine without eval-after-load but not for TeX-fold-env I have no clue why. It has nothing to do with reused keybinds, I checked that...

But not problem, I works with a personal hydra, so for me the problem is solved.

Thanks for the detailed explanations...

Thorsten

@ksafford
Copy link

ksafford commented Nov 16, 2021

This is quite late, but seeing that this issue is still 'open' I thought I'd add my experience.

Facing a similar issue with a different package, adding that package to the :after keyword as such:

(use-package ryo-modal
  :defer t
  :after frog-jump-buffer
  :config
  (all my configs here))

resolved the errors.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants