emacs-devel
[Top][All Lists]
Advanced

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

find-file-read-args (was: FFAP)


From: Juri Linkov
Subject: find-file-read-args (was: FFAP)
Date: Mon, 09 Nov 2009 12:09:33 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (x86_64-pc-linux-gnu)

> Let's see what currently M-n does in file prompts (0. means the default
> input, and 1. - the minibuffer's content after one M-n):
>
> `C-x C-f' in a non-file buffer:
> 0. current directory name
>
> `C-x C-f' in a file buffer:
> 0. current directory name
> 1. file name of the current buffer
>
> `C-x C-v' in a file buffer:
> 0. file name of the current buffer
> 1. file name of the current buffer
> (the last case has duplicates)
>
> After adding a file name at point:
>
> `C-x C-f' in a non-file buffer:
> 0. current directory name
> 1. file name at point
>
> `C-x C-f' in a file buffer:
> 0. current directory name
> 1. file name of the current buffer
> 2. file name at point
>
> `C-x C-v' in a file buffer:
> 0. file name of the current buffer
> 1. file name at point
>
> So M-n more than once is only in a file buffer,
> where we could add a file name at point before
> the file name of the current buffer:
>
> `C-x C-f' in a file buffer:
> 0. current directory name
> 1. file name at point
> 2. file name of the current buffer

The patch below implements this scheme, and additionally
includes an approved but not installed change proposed
by Drew in http://thread.gmane.org/gmane.emacs.devel/74534
that allows `M-n' with `C-x C-f' to get the file at point
in Dired mode.

Other changes are:

1. When `ffap-guesser' is available, use it to provide
   an additional default value.  Since currently its
   guesses are much better than from `thing-at-point',
   it makes sense to load ffap.el in .emacs but without
   rebinding file-related keys to their equivalents
   by `ffap-bindings'.  This way standard keys will remain
   bound to default functions that will use `ffap-guesser' to
   get the file name at point and provide it as default.

2. When ffap.el is not loaded, then use `thing-at-point'
   to provide an additional default value.  But currently
   this code is commented out in the patch below,
   because in the current state, `thing-at-point' is useless
   since it doesn't check if the file at point exists.
   It blindly proposes any word at point as a file name.
   Perhaps a new scheme should be implemented like e.g.
   (thing-at-point 'existing-filename).

3. Added two new optional arguments `dir' and `initial'
   for `find-file-read-args' to allow `find-alternate-file'
   to use features of `find-file-read-args' shared among
   all filename-reading functions.

4. For the same reason, `find-file-literally' now relies on
   `find-file-read-args' as well.

Index: lisp/files.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/files.el,v
retrieving revision 1.1098
diff -c -r1.1098 files.el
*** lisp/files.el       6 Nov 2009 05:16:27 -0000       1.1098
--- lisp/files.el       9 Nov 2009 10:04:57 -0000
***************
*** 1297,1309 ****
             ,@body)
         (remove-hook 'minibuffer-setup-hook ,hook)))))
  
! (defun find-file-read-args (prompt mustmatch)
    (list (let ((find-file-default
!              (and buffer-file-name
!                   (abbreviate-file-name buffer-file-name))))
          (minibuffer-with-setup-hook
              (lambda () (setq minibuffer-default find-file-default))
!           (read-file-name prompt nil default-directory mustmatch)))
        t))
  
  (defun find-file (filename &optional wildcards)
--- 1297,1332 ----
             ,@body)
         (remove-hook 'minibuffer-setup-hook ,hook)))))
  
! (defun find-file-read-args (prompt mustmatch &optional dir initial)
    (list (let ((find-file-default
!              (cond
!               (initial nil) ; don't duplicate initial and default values
!               ((eq major-mode 'dired-mode)
!                (and (dired-get-filename nil t)
!                     (abbreviate-file-name (dired-get-filename nil t))))
!               (buffer-file-name
!                (abbreviate-file-name buffer-file-name))))
!             (file-at-point
!              (cond ((fboundp 'ffap-guesser)
!                     (let ((guess (ffap-guesser)))
!                       (if (or (not (stringp guess))
!                               (and (fboundp 'ffap-url-p)
!                                    (ffap-url-p guess))
!                               (and (fboundp 'ffap-file-remote-p)
!                                    (ffap-file-remote-p guess)))
!                           guess
!                         (abbreviate-file-name (expand-file-name guess)))))
!                    ;; ((fboundp 'thing-at-point)
!                    ;;  (thing-at-point 'filename))
!                    )))
!         (when file-at-point
!           (setq find-file-default
!                 (delq nil (delete "" (delete-dups
!                                       (list file-at-point
!                                             find-file-default))))))
          (minibuffer-with-setup-hook
              (lambda () (setq minibuffer-default find-file-default))
!           (read-file-name prompt dir default-directory mustmatch initial)))
        t))
  
  (defun find-file (filename &optional wildcards)
***************
*** 1460,1469 ****
         (and file
            (setq file-name (file-name-nondirectory file)
                  file-dir (file-name-directory file)))
!        (list (read-file-name
!             "Find alternate file: " file-dir nil
!               (confirm-nonexistent-file-or-buffer) file-name)
!            t))))
    (if (one-window-p)
        (find-file-other-window filename wildcards)
      (save-selected-window
--- 1483,1491 ----
         (and file
            (setq file-name (file-name-nondirectory file)
                  file-dir (file-name-directory file)))
!        (find-file-read-args "Find alternate file: "
!                           (confirm-nonexistent-file-or-buffer)
!                           file-dir file-name))))
    (if (one-window-p)
        (find-file-other-window filename wildcards)
      (save-selected-window
***************
*** 1490,1499 ****
       (and file
          (setq file-name (file-name-nondirectory file)
                file-dir (file-name-directory file)))
!      (list (read-file-name
!           "Find alternate file: " file-dir nil
!             (confirm-nonexistent-file-or-buffer) file-name)
!          t)))
    (unless (run-hook-with-args-until-failure 'kill-buffer-query-functions)
      (error "Aborted"))
    (when (and (buffer-modified-p) buffer-file-name)
--- 1512,1520 ----
       (and file
          (setq file-name (file-name-nondirectory file)
                file-dir (file-name-directory file)))
!      (find-file-read-args "Find alternate file: "
!                         (confirm-nonexistent-file-or-buffer)
!                         file-dir file-name)))
    (unless (run-hook-with-args-until-failure 'kill-buffer-query-functions)
      (error "Aborted"))
    (when (and (buffer-modified-p) buffer-file-name)
***************
*** 2020,2026 ****
  In a Lisp program, if you want to be sure of accessing a file's
  contents literally, you should create a temporary buffer and then read
  the file contents into it using `insert-file-contents-literally'."
!   (interactive "FFind file literally: ")
    (switch-to-buffer (find-file-noselect filename nil t)))
  
  (defvar after-find-file-from-revert-buffer nil)
--- 2041,2050 ----
  In a Lisp program, if you want to be sure of accessing a file's
  contents literally, you should create a temporary buffer and then read
  the file contents into it using `insert-file-contents-literally'."
!   (interactive
!    (nbutlast                          ; remove the `wildcards' arg
!     (find-file-read-args "Find file literally: "
!                        (confirm-nonexistent-file-or-buffer))))
    (switch-to-buffer (find-file-noselect filename nil t)))
  
  (defvar after-find-file-from-revert-buffer nil)

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




reply via email to

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