From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Thorsten Jolitz Newsgroups: gmane.emacs.help Subject: Problems with keybindings for functions with arguments Date: Fri, 08 Mar 2013 15:01:54 +0100 Message-ID: <87k3pixa5p.fsf@gmail.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1362751352 8298 80.91.229.3 (8 Mar 2013 14:02:32 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 8 Mar 2013 14:02:32 +0000 (UTC) To: help-gnu-emacs@gnu.org Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Fri Mar 08 15:02:56 2013 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1UDxsp-0006y8-Ou for geh-help-gnu-emacs@m.gmane.org; Fri, 08 Mar 2013 15:02:51 +0100 Original-Received: from localhost ([::1]:50604 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UDxsU-0004XQ-08 for geh-help-gnu-emacs@m.gmane.org; Fri, 08 Mar 2013 09:02:30 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:58793) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UDxsE-0004XG-A2 for help-gnu-emacs@gnu.org; Fri, 08 Mar 2013 09:02:20 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UDxs9-0004EU-67 for help-gnu-emacs@gnu.org; Fri, 08 Mar 2013 09:02:14 -0500 Original-Received: from plane.gmane.org ([80.91.229.3]:59573) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UDxs8-0004EE-VK for help-gnu-emacs@gnu.org; Fri, 08 Mar 2013 09:02:09 -0500 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1UDxsT-0006U8-7P for help-gnu-emacs@gnu.org; Fri, 08 Mar 2013 15:02:29 +0100 Original-Received: from g231235140.adsl.alicedsl.de ([92.231.235.140]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 08 Mar 2013 15:02:29 +0100 Original-Received: from tjolitz by g231235140.adsl.alicedsl.de with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 08 Mar 2013 15:02:29 +0100 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 135 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: g231235140.adsl.alicedsl.de User-Agent: Gnus/5.130002 (Ma Gnus v0.2) Emacs/24.2 (gnu/linux) Cancel-Lock: sha1:fPgBYTscVM6plfL0IjgtSLerdQ4= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:89416 Archived-At: 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