emacs mode-specific custom key bindings: local-set-key vs define-key

前端 未结 2 1754
广开言路
广开言路 2021-01-31 04:11

After a few years customizing my .emacs file, I find I used two different kinds of constructs to setup major-mode-specific key bindings:

1.

相关标签:
2条回答
  • 2021-01-31 04:55

    I believe the two approaches you describe are less different than you think.

    Notice that local-set-key does in fact evaluate (define-key map key command) where map is the value of (current-local-map), which is typically set by the major mode.

    So although they could be doing different things; most of the time the only real difference will be that the hook function with the local-set-key call will be setting that same key repeatedly/redundantly, whereas the other approach sets it only once.

    You can demonstrate this to yourself by using local-set-key in a mode hook, removing that hook function after it has been used, and then creating a new buffer in that same major mode, and testing the binding.

    less prone to break with new emacs versions

    I guess you could argue that the name of a keymap might change in future and therefore not needing to know the name is an advantage, but you could equally say the name of the mode hook might change. I don't think either is enough of a concern to worry about.

    One thing to note is that local-set-key will work even if the major mode did not establish a current-local-map, which I guess makes it slightly more robust as far as generalised approaches go.

    less prone to disturb/be disturbed by active minor-modes

    There's no difference. All minor mode keymaps take precedence over all major mode keymaps, and neither approach is going to have any effect on the order of minor-mode-map-alist (which determines the precedence of minor mode keymaps).

    more idiomatic / readable / shareable with others

    They're both entirely readable to my mind, so I can't distinguish them in this aspect either.

    I say just use whichever approach seems best to you in each context. I do think it's good to have a standard approach for most things for the sake of consistency in your code, but I doubt it matters which one you choose. There's obviously a saving of a few CPU cycles to be had by not evaluating the same code unnecessarily, but that should matter so very little as to be of no concern whatsoever.

    I think the most obvious case for one over the other is the one you already mentioned -- if you want to apply the same binding to multiple modes using a common hook (but not to all modes -- for that I thoroughly recommend creating a custom minor mode), then a local-set-key within that hook is definitely the way to go.

    0 讨论(0)
  • 2021-01-31 05:03

    I have lots of custom keyboard commands and I couldn't bother with various ways to set them in Emacs and all these keymaps overriding each other, so I just installed John Wiegley's bind-key as per my relevant answer.

    (require 'bind-key)
    (bind-key "C-l" 'goto-line)
    
    0 讨论(0)
提交回复
热议问题