Subject: Re: bug#60929: 30.0.50; [FR] `file-name-extension' and backup suffixes

From: Eli Zaretskii <[email-masked]>
Date: Wed, 18 Jan 2023 14:47:14 +0200

> From: Ihor Radchenko <[email-masked]>
> Date: Wed, 18 Jan 2023 10:50:08 +0000
> 
> Would it be possible to make `file-name-sans-extension' strip extension
> upon removing backup suffixes (optionally)?
> 
> Currently, Emacs' handling of backup extensions is a bit inconsistent:

file-name-sans-extension isn't supposed to remove backup suffixes,
it's supposed to remove file _versions_.

> auto-mode-alist recognizes
> 
>  ("\\.~?[0-9]+\\.[0-9][-.0-9]*~?\\'" nil t)
>  ("\\.\\(?:orig\\|in\\|[bB][aA][kK]\\)\\'" nil t)
> 
> as backup extension and thus opens files like foo.org.bak with Org mode.

And this is wrong because...?

> Further, `file-name-extension' returns:
> 
>     The extension, in a file name, is the part that begins with the last .,
>     excluding version numbers and backup suffixes, except that a leading .
>     of the file name, if there is one, doesn't count.

This documentation is slightly inaccurate, and thus misleading.  It
should be fixed.  The truth is evident if you look at the code: this
function is the opposite of file-name-sans-extension, whose doc string
doesn't say anything about backup suffixes.

> But it only works for the native Emacs "~" style of backups (on Linux,
> at least). If one tries (file-name-extension "foo.org.bak") ; => "bak",
> we do not see backup extension stripped, which is correct wrt the
> docstring, but problematic when we need to handle backup files on
> Windows.
> 
> If one needs to strip backup extension/suffix for .bak and similar
> files, there is a need to re-use
> "\\.\\(?:orig\\|in\\|[bB][aA][kK]\\)\\'" regexp, which is not ideal
> because auto-mode-alist may include other backup suffixes in future.
> 
> It would be useful if functions like `file-name-extension',
> `file-name-sans-extension', and similar could optionally strip backup
> suffixes that contain ".".

Can't you do this by binding file-name-version-regexp to something
that gets the job done.

> Context: https://orgmode.org/list/[email-masked]

FWIW, I don't understand this context: is it wrong for some reason
that foo.org.bak is visited in Org mode?  If it's wrong, then why?
And what does that have to do with the main issue you are raising
here?  I feel there's some logical gap here.