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
[(control c) (w)] ;; or M-x wdired-change-to-wdired-mode RET
;; then edit, save.
(defun puffername-an-car-killring ()
"Store buffer-name at first place in ‘kill-ring’."
(interactive)
(let* ((name-raw (split-string (buffer-name) "<"))
(name (car name-raw)))
(kill-new name)
(message "%s" name)))
Best,
Andreas