unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
From: Florian von Savigny <florian265@uboot.com>
Subject: Re: make-auto-save-file-name: not using name transforms for mere buffers
Date: 11 Dec 2003 12:46:02 +0100	[thread overview]
Message-ID: <m3smjrtw5h.fsf@uboot.com> (raw)
In-Reply-To: mailman.1505.1071080061.399.help-gnu-emacs@gnu.org


"Eli Zaretskii" <eliz@elta.co.il> writes:

> Because its doc string says, in its very first line:
> 
>    *Transforms to apply to buffer file name before making auto-save file name.
>                         ^^^^^^^^^^^^^^^^^^^
> So buffers with no file name are not subject to such transforms.

Ok, so it doesn't do it because it is not told so ;-) but I still
wonder why it is told not to do so (I mean why, in the first place,
the author decided not to apply this feature to file names derived
from mere buffer names).

> Instead of hacking make-auto-save-file-name, I'd suggest to hack
> convert-standard-file-name.  On GNU and Unix systems, this function
> simply returns its argument.  What you need is to redefine it so that
> it recognizes that its argument file resides on a VFAT volume, and
> then applies the same transformations done by the MS-Windows variant
> of convert-standard-file-name (see w32-fns.el).

Wow, thanks for this hint; it does sound like a sane approach. But I
still need to understand when, in the particular case of auto-save
file names derived from buffer names, convert-standard-file-name takes
effect. AFAICS, it is not called directly from within
make-auto-save-file-name. I couldn't make out where, or if, it is
called indirectly.

However, I've made a start. I've decided that no direct function
to the kernel to query mounted filesystems seems available, and
between looking at the output of /proc/mounts and calling mount with
no arguments, I've decided to do the latter (I don't know if any
approach is favourable over the other). I thought it would be more
feasible to cache this information:

(setq file-systems nil)  ; alist of ((MOUNTPOINT . FS-TYPE) ... etc.

(defun cache-file-systems ()
  "Function to set `file-systems' automatically."
  (interactive)  ; useful after mounts, could also be called by gnuclient
  (call-process "mount" nil "*mount*" nil)
  (save-excursion
    (set-buffer "*mount*")
    (goto-char (point-min))
    (while
	(search-forward-regexp " on \\([^ ]+\\) type \\([^ ]+\\)" nil t)
      (setq file-systems 
	    (cons 
	     (cons (match-string 1) (match-string 2))
		  file-systems)))
    (kill-buffer "*mount*")))


So far, this works. Now we need to query it:


(defun filename-get-fs (filename)
  "Returns, as a string, the type of file system within the realm of
which a filename falls. Depends on the correct setting of `file-systems',
which can be guaranteed by setting it with `cache-file-systems'."
  ;; for this to be really sane, file-systems must be sorted such that
  ;; those pairs with the longest mount points come first
  (setq filename (expand-file-name filename))
  (let ((ind 0)
	mount-point)
    (catch 'result
      (while (setq mount-point (car (nth ind file-systems)))
	(if (< (length mount-point)
	       (length filename))
	    (if (string-equal mount-point 
			      (substring filename 0 (length mount-point)))
		(throw 'result (cdr (nth ind file-systems)))))
	  (setq ind (+ ind 1))))))


But here I'm stuck. For the function to be sane, the list must be
sorted longest mountpoint first (notably, "/" must be the last
entry, because it matches everything). How to do this?


This function working, it could be used inside
convert-standard-file-name like: 

        (cond ((equal (filename-get-fs filename) "vfat")
            (;; apply certain transforms))
              (( ...

(haven't checked the syntax, but you get the idea)


For looking up transforms, I'd like to have a list of alists of a
value and a list of alists each ;-) ... is that possible? This one
here doesn't work:

  (defvar file-name-char-transforms
    '(("vfat" . (("*" . "_") (":" . "%") 
		  ("ä" . "ae") ("ö" . "oe") ("ü" . "ue") ("ß" "ss")))
      ("fat" . (("*" . "_") (":" "%"))))
    "Complexly structured list containing rules how to translate
filename characters in the context of given file systems.")



-- 


Florian v. Savigny

If you are going to reply in private, please be patient, as I only
check for mail something like once a week. - Si vous allez répondre
personellement, patientez s.v.p., car je ne lis les courriels
qu'environ une fois par semaine.

-- 


Florian v. Savigny

If you are going to reply in private, please be patient, as I only
check for mail something like once a week. - Si vous allez répondre
personellement, patientez s.v.p., car je ne lis les courriels
qu'environ une fois par semaine.

  parent reply	other threads:[~2003-12-11 11:46 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-10 16:07 make-auto-save-file-name: not using name transforms for mere buffers Florian von Savigny
2003-12-10 17:06 ` Eli Zaretskii
2003-12-10 17:10 ` Kevin Rodgers
     [not found] ` <mailman.1505.1071080061.399.help-gnu-emacs@gnu.org>
2003-12-11 11:46   ` Florian von Savigny [this message]
2003-12-11 15:07     ` Eli Zaretskii
     [not found]     ` <mailman.1581.1071159027.399.help-gnu-emacs@gnu.org>
2003-12-12  1:19       ` Florian von Savigny
2003-12-12 18:38         ` Eli Zaretskii
2003-12-12 23:02         ` Kevin Rodgers
2003-12-13 11:44           ` Florian von Savigny
     [not found]         ` <mailman.1655.1071258163.399.help-gnu-emacs@gnu.org>
2003-12-13 11:51           ` Florian von Savigny
2003-12-13 16:25             ` Eli Zaretskii
     [not found]             ` <mailman.25.1071336560.868.help-gnu-emacs@gnu.org>
2003-12-13 19:52               ` Florian von Savigny
2003-12-14  6:28                 ` Eli Zaretskii
2004-01-04  3:57             ` David Combs
2004-01-04  6:33               ` Eli Zaretskii

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=m3smjrtw5h.fsf@uboot.com \
    --to=florian265@uboot.com \
    /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.
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).