Set custom keybinding for specific Emacs mode

后端 未结 4 790
余生分开走
余生分开走 2021-01-30 03:15

Though I know how to set a global key-binding in Emacs, I find it hard to even Google out the code for a local (minor-mode specific) key-binding. For instance, I have this code

相关标签:
4条回答
  • 2021-01-30 03:38

    You need to identify the key map for that mode (for example, LaTeX-mode-map) and use the function define-key. As an example, along with activating outline-minor-mode within LaTeX mode, I have:

      (define-key LaTeX-mode-map [(tab)] 'outline-cycle))
    

    In this case the major mode (LaTeX) holds the key binding, but there is also an outline-minor-mode-map.

    0 讨论(0)
  • 2021-01-30 03:41

    To bind a key in a mode, you need to wait for the mode to be loaded before defining the key. One could require the mode, or use eval-after-load

       (eval-after-load 'latex 
                        '(define-key LaTeX-mode-map [(tab)] 'outline-cycle))
    

    Don't forget either 'eval-after-load is not a macro, so it needs them.

    0 讨论(0)
  • 2021-01-30 03:42

    None of the other answers satisfied my needs. So this may help other people. I wanted Tab to jump to the beginning of the line if I'm in Evil's normal mode (basically: this means everywhere in Emacs), but I instead wanted it to cycle between org item states if I am in an org-mode document.

    One option was to mess around with separate bindings and constant binding-rebinding whenever I switched buffers (because evil allows only one binding per key in its normal state).

    But a more efficient option was to make Tab run my own code which runs the required function based on which major mode the current buffer uses. So if I am in a org buffer, this code runs org-cycle, and otherwise it runs evil-first-non-blank (go to the first non-whitespace character on the line).

    The technique I used here can also be used by calling your custom function via global-set-key instead, for people who use regular non-evil Emacs.

    For those who don't know Emacs lisp, the first line after the "if" statement is the true-action, and the line after that is the false-action. So if major-mode equals org-mode, we run org-cycle, otherwise we run evil-first-non-blank in all other modes:

      (defun my/tab-jump-or-org-cycle ()
        "jumps to beginning of line in all modes except org mode, where it cycles"
        (interactive)
        (if (equal major-mode 'org-mode)
            (org-cycle)
          (evil-first-non-blank))
        )
      (define-key evil-normal-state-map (kbd "<tab>") 'my/tab-jump-or-org-cycle)
    
    0 讨论(0)
  • 2021-01-30 03:46

    I use the following:

    (add-hook 'LaTeX-mode-hook
              (lambda () (local-set-key (kbd "C-0") #'run-latexmk)))
    

    to have a bind defined for LaTeX mode alone.

    0 讨论(0)
提交回复
热议问题