Stefan Monnier <monnier@iro.umontreal.ca> writes: >> The problem I'm working to reach is allowing packages to correctly shadow >> the user's bindings (and not incorrectly shadow) instead of ad-hoc >> imitation of the global map defaults. Ad-hoc imitation makes it very >> tedious to, for instance, change the key sequence for expressing "next" >> without losing coherence among all packages with a corresponding "next" >> concept. > > I don't think anyone doubts that it's desirable. > The question is how to get that. I suggest introducing a notion of "generalized" commands. Such commands will represent common actions executed by users (like move to next/previous element). Major and minor modes can then define specific implementation of the actions. In terms of OOP, I am talking about virtual methods and major/minor modes providing the implementations. The implementations will be chosen according to the current major mode or maybe some other condition. Default implementation (like `next-line') can also be provided. The generalized commands can then be freely re-bound by users with immediate effect on all the major modes. An example (not very clean) implementation of this concept is available at https://github.com/yantar92/meta-functions/blob/master/meta-functions.el: ; Quick implementation of meta-functions, which allows running multiple ;; functions, which do similar logical operations by one single "meta" ;; function in different major modes. For example, one may want to define ;; meta-next-line to call `next-line' normally, but ;; `org-agenda-next-line' in org-agenda mode. Both can be bound to, say ;; "M-j", without a need to change the key-bindings on both fundamental ;; and org-agenda modes. ;; Example usage: ;; (use-package meta-functions ;; :config ;; (meta-defun meta-next-element () ;; "Go to next element." ;; :mode org-agenda-mode (org-agenda-next-item 1) ; call org-agenda-next-item in org-agenda ;; :cond (lambda () (and (eq major-mode 'org-mode) (org-at-heading-p))) (org-next-visible-heading 1) ; call org-next-visible-headting when at heading in org-mode ;; (next-line)) ; call-next line in any other case ;; ) ;; or the same can be written as ;; (meta-defun meta-next-element "Go to next element." next-line) ;; (meta-defun meta-next-element :mode org-agenda-mode (org-agenda-next-item 1)) ;; (meta-defun meta-next-element :mode org-mode :cond org-at-heading-p (org-next-visible-heading 1)) ;; ;; Similar packages: ;; https://gitlab.com/jjzmajic/handle implements similar functionality to unify functions across major modes ;; However, handle is very major-mode centric. meta-functions is more function-centric ;; Also, meta-functions is not only limited to current major mode defining which function to call. -- Ihor Radchenko // yantar92, Org mode contributor, Learn more about Org mode at <https://orgmode.org/>. Support Org development at <https://liberapay.com/org-mode>, or support my work at <https://liberapay.com/yantar92>
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4