From: Juri Linkov <juri@jurta.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: find-file-read-args (was: FFAP)
Date: Mon, 09 Nov 2009 12:09:33 +0200 [thread overview]
Message-ID: <871vk8uo0q.fsf@mail.jurta.org> (raw)
In-Reply-To: <87bpjfiark.fsf@mail.jurta.org> (Juri Linkov's message of "Fri, 06 Nov 2009 23:19:45 +0200")
> 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)))
\f
(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)))
\f
(defvar after-find-file-from-revert-buffer nil)
--
Juri Linkov
http://www.jurta.org/emacs/
next prev parent reply other threads:[~2009-11-09 10:09 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-06 0:13 find-file-literally-at-point Edward O'Connor
2009-11-06 1:45 ` find-file-literally-at-point Juri Linkov
2009-11-06 4:20 ` FFAP (was: find-file-literally-at-point) Stefan Monnier
2009-11-06 4:41 ` FFAP Miles Bader
2009-11-06 15:20 ` FFAP Stefan Monnier
2009-11-06 4:45 ` FFAP Juri Linkov
2009-11-06 8:50 ` FFAP Eli Zaretskii
2009-11-06 10:37 ` FFAP Juri Linkov
2009-11-06 15:18 ` FFAP Stefan Monnier
2009-11-06 21:19 ` FFAP Juri Linkov
2009-11-07 1:32 ` FFAP Stefan Monnier
2009-11-09 0:52 ` FFAP Juri Linkov
2009-11-09 6:33 ` FFAP Stefan Monnier
2009-11-09 10:09 ` Juri Linkov [this message]
2009-11-09 14:28 ` find-file-read-args Stefan Monnier
2009-11-10 0:57 ` find-file-read-args Juri Linkov
2009-11-12 9:56 ` find-file-read-args Juri Linkov
2009-11-12 10:45 ` find-file-read-args martin rudalics
2009-11-12 10:51 ` find-file-read-args Juri Linkov
2009-11-15 15:09 ` find-file-read-args Juri Linkov
2009-11-15 17:28 ` find-file-read-args martin rudalics
2009-11-16 1:23 ` find-file-read-args Stefan Monnier
2009-11-17 7:43 ` find-file-read-args martin rudalics
2009-11-17 9:59 ` find-file-read-args Juri Linkov
2009-11-17 17:42 ` dired-dwim-target-directory (was: find-file-read-args) Juri Linkov
2009-11-17 17:43 ` Juri Linkov
2009-11-23 4:19 ` find-file-read-args Stefan Monnier
2009-11-23 9:59 ` find-file-read-args Juri Linkov
2009-11-23 20:17 ` find-file-read-args Stefan Monnier
2009-11-23 21:17 ` find-file-read-args Juri Linkov
2009-11-24 2:33 ` find-file-read-args Stefan Monnier
2009-11-24 17:08 ` find-file-read-args Juri Linkov
2009-11-24 19:40 ` find-file-read-args Stefan Monnier
2009-11-23 21:17 ` find-file-literally (was: find-file-read-args) Juri Linkov
2009-11-25 2:10 ` find-file-literally Stefan Monnier
2009-11-09 10:14 ` read-file-name (was: FFAP) Juri Linkov
2009-11-09 14:31 ` read-file-name Stefan Monnier
2009-11-10 0:55 ` read-file-name Juri Linkov
2009-11-10 17:25 ` read-file-name Stefan Monnier
2009-11-09 10:30 ` dired-read-dir-and-switches (was: FFAP) Juri Linkov
2009-11-09 10:36 ` M-! M-n should fetch filename (Re: FFAP) Juri Linkov
2009-11-09 14:35 ` Stefan Monnier
2009-11-10 0:59 ` Juri Linkov
2009-11-10 17:29 ` Stefan Monnier
2009-11-11 0:12 ` Juri Linkov
2009-11-15 15:12 ` dired-dwim-target (was: FFAP) Juri Linkov
2009-11-23 21:12 ` dired-dwim-target-defaults (was: dired-dwim-target) Juri Linkov
2009-11-09 0:44 ` find-file-literally-at-point Juri Linkov
2009-11-09 2:00 ` find-file-literally-at-point Miles Bader
2009-11-09 2:11 ` find-file-literally-at-point Juri Linkov
2009-11-10 0:49 ` find-file-literally-at-point Juri Linkov
2009-11-09 10:01 ` utf-8-with-signature (was: find-file-literally-at-point) Juri Linkov
2009-11-06 10:20 ` find-file-literally-at-point Eduard Wiebe
2009-11-09 0:55 ` find-file-literally-at-point Juri Linkov
2009-11-09 19:49 ` find-file-literally-at-point Eduard Wiebe
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871vk8uo0q.fsf@mail.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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).