On 07.05.2018 15:58, Jarosław Rzeszótko wrote:
It is surprisingly hard to do this in Emacs, and I think it is a
common problem, as evidenced by e.g.:
https://stackoverflow.com/questions/384284/how-do-i-rename-an-open-file-in-emacs
http://emacsredux.com/blog/2013/05/04/rename-file-and-buffer/
http://rejeep.github.io/emacs/elisp/2010/03/26/rename-file-and-buffer-in-emacs.html
You can use dired, but I personally find it to be a distraction for
this use case.
There is set-visited-file-name, but:
a) it creates a copy of the file by default
b) the name is not intuitive and I doubt many people looking to rename
a file will find it
c) the best UI/UX is IMO different for different use cases, rename is
different from move
A very similar related pain point is that it is hard to get the path
and directory of the current buffers visited file. There exist ways to
do it, but this is a pair of related use cases and the handling is
completely different: for the path you have default-directory, an
elisp variable, and pwd, a command capable of displaying the path in
minibuffer or yanking it at point. For file name I am only aware of
the elisp function: buffer-file-name. Again, two closely related use
cases, handled very differently, I by now looked those up like 10
times and every time I forget how to get this info because the names
are so far from what you would expect.
How can we fix or improve those issues?
For rename/delete/move I would create three distinct commands:
rename-visited-file-with-buffer
move-visited-file-with-buffer
delete-visited-file-with-buffer
Those names make the functions easy to discover if you are using
something like ivy or ido for M-x, while they are still precise from
the standpoint of Emacs concepts. It seems good to me to separate
rename, which should prefill the minibuffer prompt with the current
name, and ask only for a new filename, WITHOUT directory selection,
from move, which should prompt for a full new path, WITH directory
selection.
For the current buffers file and directory name, I think aliasing
default-directory as visited-file-name-directory, and introducing
visited-file-name is one option. Another option: introduce
buffer-directory-name as a complement to the existing buffer-file-name
function. That would cleanup the elisp part, and then at least the
names are something you can remember, and with M-: you can kill,
insert or display those.
Question remains how to fix those things also on an user interface
level. I think it's a pity clicking on the filename in the modeline
changes the current buffer, I am happy to hear if I am mistaken, but
today this behavior is rather unexpected and I would be very surprised
to see somebody switching buffers this way. On the other hand it looks
like a nice place for a menu where all the operations mentioned could
be triggered (rename, move and delete file+buffer, display/kill/insert
directory name or file name). Providing default key bindings under a
common prefix for them could be nice too.
Maybe someone has some more, or better, ideas for this.
Finally, while we are discussing functions everyone re-implements in
their .emacs, please lets make transpose-windows happen as an Emacs
builtin :)
Cheers,
Jarosław Rzeszótko
Good question.
My workflow is the following:
[(control a)] ;; Store the buffer-name in kill-ring, code see below
[(control x) (d)] ;; dired, commonly the wanted working dir
[(control s)(meta y)] ;; yank the buffer-name as argument to
;; isearch-forward