From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Barry Margolin Newsgroups: gmane.emacs.help Subject: Re: Problems with catch and throw Date: Fri, 05 Oct 2007 02:59:18 -0400 Organization: Symantec Message-ID: References: <87myuy26tn.fsf@baldur.tsdh.de> NNTP-Posting-Host: lo.gmane.org X-Trace: sea.gmane.org 1191570048 20937 80.91.229.12 (5 Oct 2007 07:40:48 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Fri, 5 Oct 2007 07:40:48 +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 Oct 05 09:40:43 2007 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1Idhne-0002Wq-ID for geh-help-gnu-emacs@m.gmane.org; Fri, 05 Oct 2007 09:40:42 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1IdhnZ-0003Wa-JZ for geh-help-gnu-emacs@m.gmane.org; Fri, 05 Oct 2007 03:40:37 -0400 Original-Path: shelby.stanford.edu!newsfeed.stanford.edu!postnews.google.com!news2.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!local01.nntp.dca.giganews.com!nntp.comcast.com!news.comcast.com.POSTED!not-for-mail Original-NNTP-Posting-Date: Fri, 05 Oct 2007 01:59:18 -0500 Original-Newsgroups: gnu.emacs.help Mail-Copies-To: nobody User-Agent: MT-NewsWatcher/3.5.2 (PPC Mac OS X) X-Copies-To: never Original-Lines: 144 X-Usenet-Provider: http://www.giganews.com Original-NNTP-Posting-Host: 24.34.108.171 Original-X-Trace: sv3-LW5D9BMXXsonXyS2EXTOPnKGYlW80gn+XKOPnpDfyMPQgiDzhjxwX76w4YxeWSelAdB+G7nZi+kkJvq!WSLSM9XQg3RSYBP/BEL/CV/BV93Ns4j+88ql+7IqAXMONhR2KOSpkdIg3b28j66PN6gq3nBgGVla!IGthttP3qItMl3Pl7suWB3s5cJmDcBqmIOF5346kNQ== Original-X-Complaints-To: abuse@comcast.net X-DMCA-Complaints-To: dmca@comcast.net X-Abuse-and-DMCA-Info: Please be sure to forward a copy of ALL headers X-Abuse-and-DMCA-Info: Otherwise we will be unable to process your complaint properly X-Postfilter: 1.3.35 Original-Xref: shelby.stanford.edu gnu.emacs.help:152616 X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.help:48124 Archived-At: In article <87myuy26tn.fsf@baldur.tsdh.de>, Tassilo Horn wrote: > Hi, > > I use a home-brewn function [1] instead of `execute-extended-command' > most of the time. It uses `read-from-minibuffer' to get a command > abbrev from the user and then executes the command whose abbreviation > was given. > > Now I'd like to bind TAB in my function so that it aborts > `read-from-minibuffer' and my function and falls back to > `execute-extended-command' where the current minibuffer contents are > inserted as initial input. > > That sounds like a good candidate for catch/throw to me. A minimal > working example is: > > --8<---------------cut here---------------start------------->8--- > (catch 'foo > (read-from-minibuffer "test: " nil > (let ((map (copy-keymap minibuffer-local-map))) > (define-key map "\C-i" (lambda () > (interactive) > (throw 'foo > (minibuffer-contents)))) > map))) > --8<---------------cut here---------------end--------------->8--- > > Hit `C-j' after the last closing paren and type "foobar" at the "test: " > prompt. The form's result is "foobar" then. > > So now here's my function with this mechanism applied. But it doesn't > work like the minimal example. (minibuffer-contents) always returns the > empty string "". Why is that? The problem isn't with minibuffer-contents, it's with (message "cont = " (minibuffer-contents)) The first argument to message is a format string, and the remaining arguments will be substituted for the % codes in the string. Since you don't have any % codes, it never displays the minibuffer contents. So that should be: (message "cont = %s" (minibuffer-contents)) > > --8<---------------cut here---------------start------------->8--- > (defun exec-abbrev-cmd (prefixarg) > "Query for a command abbreviation like \"mbm\" and calculate a > list of all commands of the form \"m[^-]*-b[^-]*-m[^-]*$\". > > If this list has only one item, this command will be executed > directly. If there a more choices, the user will be queried which > one to call. > > The PREFIXARG is passed on to the invoked command. > > With TAB fall back to `execute-extended-command'." > (interactive "P") > (let ((catch-val > (catch 'escape-from-exec-abbrev-cmd > (let* ((abbrev (read-from-minibuffer > "Command Abbrev: " > nil > (let ((map (copy-keymap minibuffer-local-map))) > (define-key map "\C-i" > (lambda () > (interactive) > ;; WHY RETURN MINIBUFFER-CONTENTS "" > ;; HERE, ALTHOUGH I TYPED FOOBAR AT THE > ;; PROMPT??? > (message "cont = " (minibuffer-contents)) > (throw 'escape-from-exec-abbrev-cmd > (minibuffer-contents)))) > map))) > (regexp (concat "^" > (let ((part-list (split-string abbrev > "-"))) > (if (= 1 (length part-list)) > ;; abc => a*-b*-c* > (mapconcat #'list abbrev "[^-]*-") > ;; ahead-b-c => ahead*-b*-c* > (mapconcat #'identity part-list > "[^-]*-"))) > "[^-]*$")) > (commands (exec-abbrev-cmd-sort > (remove-if-not (lambda (string) > (string-match regexp string)) > (let (c) > (mapatoms > (lambda (a) > (if (commandp a) > (push (symbol-name a) > c)))) > c))))) > (if (not commands) > (message "No such command.") > (let ((c (cond ((> (length commands) 1) > (intern > (if (and (featurep 'ido) ido-mode) > ;; ido is available and enabled, so use > it. > (ido-completing-read "Command: " > commands) > ;; fallback to normal completion with the > ;; most frequently used command as default. > (completing-read (concat "Command (defaults > to `" > (car commands) > "'): ") > commands > nil t nil nil (car > commands))))) > (t (intern (car commands)))))) > (call-interactively c t) > (when exec-abbrev-cmd-mode > (exec-abbrev-cmd-record c))))) > ;; Always return nil so that an escape with TAB is the only thing > ;; that makes `catch-val' non-nil. > nil))) > (when catch-val > (message "catch-val = " catch-val) > (execute-extended-command prefixarg) > (insert catch-val)))) > --8<---------------cut here---------------end--------------->8--- > > I guess it's something obvious, but I cannot see any principal > difference between the simple working example and the code of my > function. > > Any pointers are highly welcome! > > Bye, > Tassilo > __________ > [1] http://www.tsdh.de/cgi-bin/wiki.pl/exec-abbrev-cmd.el -- Barry Margolin, barmar@alum.mit.edu Arlington, MA *** PLEASE post questions in newsgroups, not directly to me *** *** PLEASE don't copy me on replies, I'll read them in the group ***