help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Problems with keybindings for functions with arguments


From: Thorsten Jolitz
Subject: Problems with keybindings for functions with arguments
Date: Fri, 08 Mar 2013 15:01:54 +0100
User-agent: Gnus/5.130002 (Ma Gnus v0.2) Emacs/24.2 (gnu/linux)

Hi List, 

say I have a function that recieves an integer in range 1 to 8 as
argument and does different things depending on the argument value:

,---------------------------
| (defun navi-show-headers (level)
|   "Act conditional on LEVEL"
|   (do-stuff level))
`---------------------------

These "things" are useful enough that each of the eight possibilities
should get its own keybindings as user-command - a one-key binding in a
'special-mode' (read-only buffer like e.g. dired). 

Say these keybindings should simply be "1", "2", ... , "8". 

#### Question 1 ####

So how can I make this a (interactive) command that takes one argument,
but doesn't ask the user about it and does not force the user to give
prefix-args all the time (like 'C-1' e.g.)?

Shall I define 8 interface-functions that call the basic function with
different arguments? Seems a bit verbose in my eyes. 

I figured out this (somehow underdocumented) solution: 

,---------------------------------------------------
| (define-key navi-mode-map (kbd "1")
|   (lambda () (interactive) (navi-show-headers 1)))
| (define-key navi-mode-map (kbd "2")
|   (lambda () (interactive) (navi-show-headers 2)))
| (define-key navi-mode-map (kbd "3")
|   (lambda () (interactive) (navi-show-headers 3)))
| (define-key navi-mode-map (kbd "4")
|   (lambda () (interactive) (navi-show-headers 4)))
| (define-key navi-mode-map (kbd "5")
|   (lambda () (interactive) (navi-show-headers 5)))
| (define-key navi-mode-map (kbd "6")
|   (lambda () (interactive) (navi-show-headers 6)))
| (define-key navi-mode-map (kbd "7")
|   (lambda () (interactive) (navi-show-headers 7)))
| (define-key navi-mode-map (kbd "8")
|   (lambda () (interactive) (navi-show-headers 8)))
`---------------------------------------------------

which is quite nice, but has one clear disadvantage: 
'C-h m' shows this:

,------------------------------------------------------------------
| Navi mode defined in `navi-mode.el':
| Major mode for easy buffer-navigation.
| In this mode (derived from `occur-mode') you can easily navigate
| in an associated original-buffer via one-key commands in the
| navi-buffer. You can alter the displayed document structure in
| the navi-buffer by sending one-key commands that execute
| predefined occur searches in the original buffer. `navi-mode' is
| especially useful in buffers with outline structure, e.g. buffers
| with `outline-minor-mode' activated and `outshine' extensions
| loaded.
| key             binding
| ---             -------
| 
| C-c             Prefix Command
| RET             occur-mode-goto-occurrence
| C-o             occur-mode-display-occurrence
| ESC             Prefix Command
| SPC             scroll-up-command
| -               negative-argument
| 0               digit-argument
| 1               ??
| 2               ??
| 3               ??
| 4               ??
| 5               ??
| 6               ??
| 7               ??
| 8               ??
| 9               digit-argument
| <               beginning-of-buffer
| >               end-of-buffer
| ?               describe-mode
| c               clone-buffer
| d               occur-mode-display-occurrence
| e               occur-edit-mode   [... etc ...]
`------------------------------------------------------------------

So what is the canonical way to define keybindings in such a situation?

#### question 2 ####

What if I want an optional prefix argument and act conditional on its
existence or value like this

,------------------------------------------------
| (defun navi-show-headers (args &optional level)
|   "Act conditional on LEVEL"
|   (if level
|      (do-some-stuff args)
|     (do-more-stuff args)))
`------------------------------------------------

or like this

 ,------------------------------------------------
 | (defun navi-show-headers (args &optional level)
 |   "Act conditional on LEVEL"
 |   (when level
 |     (cond
 |       ((eq level 1) (do-stuff args 1))
 |       ((eq level 2) (do-stuff args 2))
 |       ((eq level 3) (do-stuff args 3)))))
 `------------------------------------------------

?

I would actually like to have one-key  keybindings like

"f", "v", "x" etc, that can be called as is or like this (with numerical
prefix args):

"C-1 f", "C-2 f", ... , "C-3 f"
"C-1 v", "C-2 v", ... , "C-3 v" etc

But since I'm not even satisfied with my solution for 'question 1', I'm
not really sure how to do this (besides having read the manual).

Any hints are welcome. 

-- 
cheers,
Thorsten





reply via email to

[Prev in Thread] Current Thread [Next in Thread]