all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Juri Linkov <juri@jurta.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: C-r and C-s in minibuffer should search completion
Date: Wed, 16 Apr 2008 01:28:45 +0300	[thread overview]
Message-ID: <87r6d6vjg2.fsf@jurta.org> (raw)
In-Reply-To: <jwv63uty9e8.fsf-monnier+emacs@gnu.org> (Stefan Monnier's message of "Mon, 07 Apr 2008 11:32:23 -0400")

> Yes, that's an acceptable solution, but really if there are only
> 2 buffers, C-x b TAB should select the only other buffer, so the better
> solution is to fix the completion table.

On a par with your efforts to move minibuffer stuff to minibuffer.el,
I've ported the existing function `internal-complete-buffer' to Lisp
and created a new function `internal-complete-buffer-sans-current' to
remove the current buffer from the completion table for `C-x b' family
of commands.  I also considered using `complete-with-action' internally
in `internal-complete-buffer' since it uses the same code pattern, but
`complete-with-action' doesn't call `all-completions' with the non-nil
arg `hide-spaces'.  Below is a complete patch that causes `C-x b TAB'
to omit the current buffer from the completion table:

Index: src/minibuf.c
===================================================================
RCS file: /sources/emacs/emacs/src/minibuf.c,v
retrieving revision 1.345
diff -c -r1.345 minibuf.c
*** src/minibuf.c	9 Apr 2008 19:33:51 -0000	1.345
--- src/minibuf.c	15 Apr 2008 22:27:45 -0000
***************
*** 1944,1967 ****
      return Qt;
  }
  
- DEFUN ("internal-complete-buffer", Finternal_complete_buffer, Sinternal_complete_buffer, 3, 3, 0,
-        doc: /* Perform completion on buffer names.
- If the argument FLAG is nil, invoke `try-completion', if it's t, invoke
- `all-completions', otherwise invoke `test-completion'.
- 
- The arguments STRING and PREDICATE are as in `try-completion',
- `all-completions', and `test-completion'. */)
-      (string, predicate, flag)
-      Lisp_Object string, predicate, flag;
- {
-   if (NILP (flag))
-     return Ftry_completion (string, Vbuffer_alist, predicate);
-   else if (EQ (flag, Qt))
-     return Fall_completions (string, Vbuffer_alist, predicate, Qt);
-   else				/* assume `lambda' */
-     return Ftest_completion (string, Vbuffer_alist, predicate);
- }
- 
  /* Like assoc but assumes KEY is a string, and ignores case if appropriate.  */
  
  DEFUN ("assoc-string", Fassoc_string, Sassoc_string, 2, 3, 0,
--- 1944,1949 ----
***************
*** 2220,2226 ****
    defsubr (&Sread_string);
    defsubr (&Sread_command);
    defsubr (&Sread_variable);
-   defsubr (&Sinternal_complete_buffer);
    defsubr (&Sread_buffer);
    defsubr (&Sread_no_blanks_input);
    defsubr (&Sminibuffer_depth);
--- 2202,2207 ----

Index: lisp/minibuffer.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/minibuffer.el,v
retrieving revision 1.13
diff -c -r1.13 minibuffer.el
*** lisp/minibuffer.el	14 Apr 2008 22:04:38 -0000	1.13
--- lisp/minibuffer.el	15 Apr 2008 22:27:03 -0000
***************
*** 730,734 ****
--- 730,758 ----
                              'completion--file-name-table)
    "Internal subroutine for `read-file-name'.  Do not call this.")
  
+ (defun internal-complete-buffer (string predicate flag)
+   "Perform completion on buffer names.
+ If the argument FLAG is nil, invoke `try-completion', if it's t, invoke
+ `all-completions', otherwise invoke `test-completion'.
+ 
+ The arguments STRING and PREDICATE are as in `try-completion',
+ `all-completions', and `test-completion'."
+   (let ((table (mapcar 'buffer-name (buffer-list))))
+     (cond
+      ((null flag) (try-completion string table predicate))
+      ((eq flag t) (all-completions string table predicate t))
+      (t (test-completion string table predicate)))))
+ 
+ (defun internal-complete-buffer-sans-current (string predicate flag)
+   "Perform completion on buffer names excluding the current buffer.
+ Like `internal-complete-buffer', but removes the current buffer from
+ the completion list."
+   (let ((table (mapcar 'buffer-name (delq (other-buffer (current-buffer) t)
+ 					  (buffer-list)))))
+     (cond
+      ((null flag) (try-completion string table predicate))
+      ((eq flag t) (all-completions string table predicate t))
+      (t (test-completion string table predicate)))))
+ 
  (provide 'minibuffer)
  ;;; minibuffer.el ends here

Index: lisp/files.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/files.el,v
retrieving revision 1.970
diff -c -r1.970 files.el
*** lisp/files.el	12 Apr 2008 03:14:56 -0000	1.970
--- lisp/files.el	15 Apr 2008 22:27:11 -0000
***************
*** 1033,1038 ****
--- 1033,1048 ----
      (rename-file encoded new-encoded ok-if-already-exists)
      newname))
  \f
+ (defun read-buffer-to-switch (prompt)
+   "Read the name of a buffer to switch to and return as a string.
+ It is intended for `switch-to-buffer' family of commands since they
+ need to omit the name of current buffer from the list of defaults."
+   (minibuffer-with-setup-hook
+       (lambda ()
+ 	(set (make-local-variable 'minibuffer-completion-table)
+ 	     'internal-complete-buffer-sans-current))
+     (read-buffer prompt (other-buffer (current-buffer)))))
+ 
  (defun switch-to-buffer-other-window (buffer &optional norecord)
    "Select buffer BUFFER in another window.
  If BUFFER does not identify an existing buffer, then this function
***************
*** 1047,1053 ****
  
  This uses the function `display-buffer' as a subroutine; see its
  documentation for additional customization information."
!   (interactive "BSwitch to buffer in other window: ")
    (let ((pop-up-windows t)
  	;; Don't let these interfere.
  	same-window-buffer-names same-window-regexps)
--- 1057,1064 ----
  
  This uses the function `display-buffer' as a subroutine; see its
  documentation for additional customization information."
!   (interactive
!    (list (read-buffer-to-switch "Switch to buffer in other window: ")))
    (let ((pop-up-windows t)
  	;; Don't let these interfere.
  	same-window-buffer-names same-window-regexps)
***************
*** 1061,1067 ****
  
  This uses the function `display-buffer' as a subroutine; see its
  documentation for additional customization information."
!   (interactive "BSwitch to buffer in other frame: ")
    (let ((pop-up-frames t)
  	same-window-buffer-names same-window-regexps)
      (prog1
--- 1072,1079 ----
  
  This uses the function `display-buffer' as a subroutine; see its
  documentation for additional customization information."
!   (interactive
!    (list (read-buffer-to-switch "Switch to buffer in other frame: ")))
    (let ((pop-up-frames t)
  	same-window-buffer-names same-window-regexps)
      (prog1

Index: src/buffer.c
===================================================================
RCS file: /sources/emacs/emacs/src/buffer.c,v
retrieving revision 1.557
diff -c -r1.557 buffer.c
*** src/buffer.c	2 Apr 2008 20:15:11 -0000	1.557
--- src/buffer.c	15 Apr 2008 22:27:01 -0000
***************
*** 1767,1773 ****
    return buf;
  }
  
! DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
         doc: /* Select buffer BUFFER in the current window.
  If BUFFER does not identify an existing buffer,
  then this function creates a buffer with that name.
--- 1767,1774 ----
    return buf;
  }
  
! DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2,
!        "(list (read-buffer-to-switch \"Switch to buffer: \"))",
         doc: /* Select buffer BUFFER in the current window.
  If BUFFER does not identify an existing buffer,
  then this function creates a buffer with that name.



-- 
Juri Linkov
http://www.jurta.org/emacs/




  reply	other threads:[~2008-04-15 22:28 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-20 19:13 C-r and C-s in minibuffer should search completion Stefan Monnier
2008-03-20 19:35 ` Juri Linkov
2008-03-20 20:07   ` Lennart Borgman (gmail)
2008-03-20 20:38     ` Juri Linkov
2008-03-20 20:54       ` Drew Adams
2008-03-20 23:07         ` Juri Linkov
2008-03-20 22:13   ` Stefan Monnier
2008-03-20 22:27     ` Drew Adams
2008-03-20 23:03     ` Juri Linkov
2008-03-21  1:26       ` Stefan Monnier
2008-03-22  1:17         ` Juri Linkov
2008-03-22 17:04           ` Stefan Monnier
2008-03-23  2:17             ` Juri Linkov
2008-03-23  3:24               ` Stefan Monnier
2008-03-29  1:00   ` Xavier Maillard
2008-03-29 12:30     ` Juri Linkov
2008-03-29 16:23       ` Drew Adams
2008-03-30  0:38         ` Juri Linkov
2008-03-30  2:38           ` Drew Adams
2008-03-20 20:44 ` Drew Adams
2008-03-25 21:44 ` Juri Linkov
2008-03-26  2:31   ` Stefan Monnier
2008-03-26  7:01     ` Drew Adams
2008-03-26 14:41       ` Stefan Monnier
2008-03-26 17:07         ` Drew Adams
2008-03-26 10:56     ` Juri Linkov
2008-03-26 14:47       ` Stefan Monnier
2008-03-27  0:44         ` Juri Linkov
2008-03-27  2:43           ` Stefan Monnier
2008-03-27 23:43             ` Juri Linkov
2008-03-29  4:03               ` Stefan Monnier
2008-03-30  0:44                 ` Juri Linkov
2008-03-30  4:01                   ` Stefan Monnier
2008-03-30 18:32                     ` Juri Linkov
2008-03-30 22:41                       ` Stefan Monnier
2008-03-30 23:50                         ` Juri Linkov
2008-03-31  2:11                           ` Stefan Monnier
2008-04-03 22:59                             ` Juri Linkov
2008-04-04  1:18                               ` Stefan Monnier
2008-04-06 20:45                                 ` Juri Linkov
2008-04-07 15:32                                   ` Stefan Monnier
2008-04-15 22:28                                     ` Juri Linkov [this message]
2008-04-16  2:08                                       ` Stefan Monnier
2008-04-16 23:16                                         ` Juri Linkov
2008-04-17  1:41                                           ` Stefan Monnier
2008-04-17  9:18                                             ` Juri Linkov
2008-04-18  1:07                                               ` Stefan Monnier
2008-04-19 20:11                                                 ` Juri Linkov
2008-04-19 21:10                                                   ` Stefan Monnier
2008-04-19 22:46                                                     ` Juri Linkov
2008-04-20  2:44                                                       ` Stefan Monnier
2008-04-21 21:51                                                         ` Juri Linkov
2008-04-22  3:11                                                           ` Stefan Monnier
2008-04-22 20:59                                                             ` Juri Linkov
2008-04-23  2:28                                                               ` Stefan Monnier
2008-04-21  3:07                                                       ` Richard Stallman
2008-04-21 22:54                                                         ` Juri Linkov
2008-04-22  3:10                                                           ` Stefan Monnier
2008-03-30  0:44                 ` minibuffer-default-add-shell-commands (was: C-r and C-s in minibuffer should search completion) Juri Linkov
2008-03-30  4:08                   ` minibuffer-default-add-shell-commands Stefan Monnier
2008-03-30 18:28                     ` minibuffer-default-add-shell-commands Juri Linkov
2008-03-30 11:30                   ` minibuffer-default-add-shell-commands Reiner Steib
2008-03-30 18:31                     ` minibuffer-default-add-shell-commands Juri Linkov
2008-03-30 20:25                       ` minibuffer-default-add-shell-commands Reiner Steib

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87r6d6vjg2.fsf@jurta.org \
    --to=juri@jurta.org \
    --cc=emacs-devel@gnu.org \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.