emacs-devel
[Top][All Lists]
Advanced

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

Re: C-r and C-s in minibuffer should search completion


From: Juri Linkov
Subject: Re: C-r and C-s in minibuffer should search completion
Date: Fri, 04 Apr 2008 01:59:19 +0300
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (x86_64-pc-linux-gnu)

> Actually, looking at the code some more, I'd suggest to add
> a `predicate' arg to `read-buffer' and then use it in switch-to-buffer
> (which would clearly need to be changed not to use a string-spec but
> a lisp-spec for its interactive spec).

Adding a new argument to `read-buffer' will cause the argument list
mismatch between `read-buffer' and `read-buffer-function', and
calling `read-buffer-function' with an additional argument will
break existing code.

But I now have an idea how to accomplish this task without adding a
new argument to `read-buffer'.  The patch below adds a new function
`read-buffer-to-switch' that binds `minibuffer-default-add-function' to
`minibuffer-default-add-buffers' that omits the current buffer from the
list of defaults before calling `read-buffer':

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        3 Apr 2008 22:56:56 -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.

Index: lisp/files.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/files.el,v
retrieving revision 1.967
diff -c -r1.967 files.el
*** lisp/files.el       3 Apr 2008 20:06:45 -0000       1.967
--- lisp/files.el       3 Apr 2008 22:57:00 -0000
***************
*** 1033,1038 ****
--- 1033,1064 ----
      (rename-file encoded new-encoded ok-if-already-exists)
      newname))
  
+ (defun minibuffer-default-add-buffers ()
+   "Return a list of all buffer completions without the current buffer.
+ This function is used to add all elements of the buffer name completion
+ table to the end of the list of defaults just after the default value."
+   (interactive)
+   (let ((def minibuffer-default)
+       (all (all-completions ""
+                             minibuffer-completion-table
+                             minibuffer-completion-predicate
+                             t)))
+     ;; Remove the current buffer from the list of buffer completions
+     (setq all (cdr all))
+     (if (listp def)
+       (append def all)
+       (cons def (delete def all)))))
+ 
+ (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-default-add-function)
+            'minibuffer-default-add-buffers))
+     (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)
--- 1073,1080 ----
  
  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
--- 1088,1095 ----
  
  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

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




reply via email to

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