* Rename, delete and move current buffer and file @ 2018-05-07 13:58 Jarosław Rzeszótko 2018-05-07 14:53 ` Stefan Monnier ` (2 more replies) 0 siblings, 3 replies; 33+ messages in thread From: Jarosław Rzeszótko @ 2018-05-07 13:58 UTC (permalink / raw To: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 3268 bytes --] 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 [-- Attachment #2: Type: text/html, Size: 6754 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 13:58 Rename, delete and move current buffer and file Jarosław Rzeszótko @ 2018-05-07 14:53 ` Stefan Monnier 2018-05-07 16:20 ` Jarosław Rzeszótko 2018-05-07 15:28 ` Yuri Khan 2018-05-07 15:29 ` Andreas Röhler 2 siblings, 1 reply; 33+ messages in thread From: Stefan Monnier @ 2018-05-07 14:53 UTC (permalink / raw To: emacs-devel > different: for the path you have default-directory, an elisp variable, and [ Side note: After C-x C-f /home/foo/bar buffer-file-name should be "/home/foo/bar" and default-directory should be "/home/foo/". But note that if you then do: M-x cd RET / RET you'll see that default-directory is now "/", i.e. default-directory is not actually tied to the name of the buffer's file. This said, the two are in-sync 99.9% of the time. ] > 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 I don't really know what's the intended difference between "rename" and "move", but I think rather than introduce new commands (whose name users won't remember), it'd make more sense to "enhance" existing commands. E.g. I personally rename/move files usually via M-x delete-file RET M-n RET C-x C-w <newname> RET so maybe we could instead have `C-x C-w` prompt the user "delete the old file (y or n)?" Similarly M-x rename-file RET could try and detect if the source name matches some of the buffers's filenames and ask whether we want to rename those buffers's filenames accordingly. > delete-visited-file-with-buffer Hmm... Not sure how best to introduce this behavior into existing commands. I don't remember being conscious of having such a need, but I think I'd do it with: M-x delete-file RET M-n RET C-x C-c [ I have C-x C-c remapped the kill the current-buffer, since I prefer to use `M-x kill-emacs RET` for those rare cases where I really want to exit the current Emacs session. ] So maybe `delete-file` could ask whether we wants to kill the corresponding buffers (as for `rename-file` above it's "buffer*S*" since it can affect several buffers in the case where the deleted/renamed "file" is actually a directory). > Those names make the functions easy to discover if you are using something > like ivy or ido for M-x, [ Same applies if you use `icomplete-mode` or if you use the bog-standard default completion ;-) ] > 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. C-x C-w gives you "/current/dir/" is initial input. If you then type "/other/dir/" it will "move" the file without "renaming" it (I personally don't like to make this distinction, probably because I consider the file's name to include all the leading directories, which is also the implicit point of view of the GNU Coding Standard which uses "file name" rather than "path" and reserves the word "path" for things like $PATH, $LS_LIBRARY_PATH, load-path, ...). And M-n inserts the current name, so I think it handles both use-cases well enough. [ For those how like the "default" to be pre-inserted in the buffer (and highlighted as the current region so that delete-selection-mode will automatically delete it) rather than go through M-n, this should be a global user-config option. ] > 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. I thought `M-x pwd RET` was a good enough way to get that info. > 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 contrary I'd be surprised if noone uses this buffer-switching system, since it's been around for so many years. I don't claim it's the best use of that "button-like thingy", but changing it would inevitably irk some users. [ FWIW, I don't use that functionality, but then again, I don't use dired either. ] > On the other hand it looks like a nice place for a menu where all the > operations mentioned could be triggered I guess it could make sense, indeed. > (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. A common key-prefix for such file operations would be nice, indeed (this key-prefix could be considered as a kind of "buffer-less lightweight dired"). Stefan ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 14:53 ` Stefan Monnier @ 2018-05-07 16:20 ` Jarosław Rzeszótko 2018-05-07 17:01 ` Stefan Monnier 2018-05-07 18:20 ` Andreas Schwab 0 siblings, 2 replies; 33+ messages in thread From: Jarosław Rzeszótko @ 2018-05-07 16:20 UTC (permalink / raw To: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 5801 bytes --] On Mon, May 7, 2018 at 4:53 PM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > > different: for the path you have default-directory, an elisp variable, > and > > [ Side note: After > > C-x C-f /home/foo/bar > > buffer-file-name should be "/home/foo/bar" and default-directory should > be "/home/foo/". But note that if you then do: > > M-x cd RET / RET > > you'll see that default-directory is now "/", i.e. default-directory is > not actually tied to the name of the buffer's file. > > This said, the two are in-sync 99.9% of the time. > ] > That's maybe one more reason a function like buffer-directory-name would be nice? Semantics for all the operations being discussed surely take some thought and maybe trial & error to get right, as is also clear when looking at set-visited-file-name and seeing how it is quite complicated. > > > 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 > > I don't really know what's the intended difference between "rename" and > "move", but I think rather than introduce new commands (whose name users > won't remember), it'd make more sense to "enhance" existing commands. > E.g. I personally rename/move files usually via > > M-x delete-file RET M-n RET > C-x C-w <newname> RET > > so maybe we could instead have `C-x C-w` prompt the user > "delete the old file (y or n)?" > > Similarly > > M-x rename-file RET > > could try and detect if the source name matches some of the buffers's > filenames and ask whether we want to rename those buffers's filenames > accordingly. > People might not remember the whole command name, but when they use M-x, or C-h f with some filtering it will pop up when typing "rename" or "move", which is what those operations are now called pretty universally in other programs. It's easily discoverable this way, and you might key bind if you want, while renaming via delete-file is something that you might figure out but not necessarily anything close to the first thing you would try. So I stand by my commands proposal. As mentioned I also hope there are ways to integrate it into keybindings and UI, maybe also a manual section for such not-dired file operations would be nice. I think those are basic things people want to do, and a bit of a gap in the basic set of Emacs functionalities. The difference between "rename" and "move" I intended was for rename to mean changing the filename (without moving to another directory), and for move to mean moving to another directory, keeping or also changing the filename. You can present slightly different prompt/completion in the minibuffer for the two cases, which I thought might make for a nice UX. I would also be fine with just a "move" command, which lets you do both things, see below. > > > delete-visited-file-with-buffer > > Hmm... Not sure how best to introduce this behavior into existing commands. > > I don't remember being conscious of having such a need, but I think I'd > do it with: > > M-x delete-file RET M-n RET > C-x C-c > > [ I have C-x C-c remapped the kill the current-buffer, since > I prefer to use `M-x kill-emacs RET` for those rare cases where > I really want to exit the current Emacs session. ] > > So maybe `delete-file` could ask whether we wants to kill the > corresponding buffers (as for `rename-file` above it's "buffer*S*" > since it can affect several buffers in the case where the > deleted/renamed "file" is actually a directory). > > > Those names make the functions easy to discover if you are using > something > > like ivy or ido for M-x, > > [ Same applies if you use `icomplete-mode` or if you use the > bog-standard default completion ;-) ] > > > 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. > > C-x C-w gives you "/current/dir/" is initial input. If you then type > "/other/dir/" it will "move" the file without "renaming" it (I > personally don't like to make this distinction, probably because > I consider the file's name to include all the leading directories, which > is also the implicit point of view of the GNU Coding Standard which uses > "file name" rather than "path" and reserves the word "path" for things > like $PATH, $LS_LIBRARY_PATH, load-path, ...). > And M-n inserts the current name, so I think it handles both > use-cases well enough. > This creates a copy of the file, while I want to rename/move it. This might include things like deal with version control. A single "move" function is fine, maybe even the set-visited-file-name semantics are OK, it just has a bad name, has no key bindings, no menu item, and I would like a delete-visited-file to complement it. When I look for a command to move a file in the M-x completion prompt, I will try "move" and "rename" and see what matches, but I would surely not naturally come up with any substring of set-visited-file-name when thinking how Emacs might have named a command to move files, except for "file-name", but this matches a ton of things. I am sure many people using Emacs don't even know the concept of a visited file. Also, note there is rename-file, rename-buffer, but then set-visited-file-name for what is effectively rename-file-with-visited-buffer. There is also an interactive delete-file, obviously there is kill-buffer, but no way to delete file and kill its visiting buffer. I just hope maybe we can find some way to make this more uniform and complete. [-- Attachment #2: Type: text/html, Size: 12574 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 16:20 ` Jarosław Rzeszótko @ 2018-05-07 17:01 ` Stefan Monnier 2018-05-07 17:47 ` Jarosław Rzeszótko 2018-05-07 18:20 ` Andreas Schwab 1 sibling, 1 reply; 33+ messages in thread From: Stefan Monnier @ 2018-05-07 17:01 UTC (permalink / raw To: emacs-devel >> Similarly >> >> M-x rename-file RET >> >> could try and detect if the source name matches some of the buffers's >> filenames and ask whether we want to rename those buffers's filenames >> accordingly. [...] > People might not remember the whole command name, but when they use M-x, or > C-h f with some filtering it will pop up when typing "rename" or "move", [...] > So I stand by my commands proposal. I don't understand: it seems like "rename-file" is a name which should just work with your M-x and C-h f examples, so I don't see how those examples argues in favor of "my commands proposal" instead of using "rename-file". >> C-x C-w gives you "/current/dir/" is initial input. If you then type >> "/other/dir/" it will "move" the file without "renaming" it (I >> personally don't like to make this distinction, probably because >> I consider the file's name to include all the leading directories, which >> is also the implicit point of view of the GNU Coding Standard which uses >> "file name" rather than "path" and reserves the word "path" for things >> like $PATH, $LS_LIBRARY_PATH, load-path, ...). >> And M-n inserts the current name, so I think it handles both >> use-cases well enough. > This creates a copy of the file, while I want to rename/move it. I only presented this example to illustrate how Emacs merges both "new name" and "new directory" into a single UI (tho indeed currently C-x C-w doesn't actually "move/rename" but it copies instead). > include things like deal with version control. A single "move" function is > fine, maybe even the set-visited-file-name semantics are OK, it just has a > bad name, has no key bindings, no menu item, C-x C-w does have all those feature (other than the name). > and I would like a delete-visited-file to complement it. Could you give details as to why you'd want to separate it from `delete-file`? > When I look for a command to move a file in the M-x completion prompt, > I will try "move" and "rename" and see what matches, Right, and you'll find `rename-file`, which is what I think should do what you want. > but I would surely not naturally come up with any substring > of set-visited-file-name when thinking how Emacs might have named a command > to move files, except for "file-name", but this matches a ton of things. I > am sure many people using Emacs don't even know the concept of a visited > file. Agreed. So I find it odd that you insist on having "visited-file" in the name of the commands ;-) > Also, note there is rename-file, rename-buffer, but then > set-visited-file-name for what is effectively > rename-file-with-visited-buffer. set-visited-file-name does not rename any file, AFAIK (and I don't see any suggestion to change this). > There is also an interactive delete-file, obviously there is kill-buffer, > but no way to delete file and kill its visiting buffer. FWIW, I very rarely need to do delete-file and kill-buffer at the same time, so I'm not convinced there's a need for a separate command for that. But as noted, I'd be OK for delete-file to kill the matching buffer(s) [ either subject to a prompt or a user-config, for those users who like to `delete-file` while keeping the buffer, as is occasionally my case. ] Stefan ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 17:01 ` Stefan Monnier @ 2018-05-07 17:47 ` Jarosław Rzeszótko 2018-05-08 1:28 ` Stefan Monnier 0 siblings, 1 reply; 33+ messages in thread From: Jarosław Rzeszótko @ 2018-05-07 17:47 UTC (permalink / raw To: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 6911 bytes --] On Mon, May 7, 2018 at 7:01 PM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > >> Similarly > >> > >> M-x rename-file RET > >> > >> could try and detect if the source name matches some of the buffers's > >> filenames and ask whether we want to rename those buffers's filenames > >> accordingly. > [...] > > People might not remember the whole command name, but when they use M-x, > or > > C-h f with some filtering it will pop up when typing "rename" or "move", > [...] > > So I stand by my commands proposal. > > I don't understand: it seems like "rename-file" is a name which should > just work with your M-x and C-h f examples, so I don't see how those > examples > argues in favor of "my commands proposal" instead of using "rename-file". > I have a file open in a buffer in front of me. I want to rename this file and have the buffer be changed accordingly: it should now be visiting the file under the new name. rename-file will instead: - rename the file but do nothing with the buffer, if I now save the buffer it will get saved under the old file name. The buffer still visits the file under the old name. - it will also first prompt for a file to rename, while I want to rename the file I am currently editing in a buffer, along with the buffer. Emacs distinguishing so strongly between buffer and visited file is why people commonly implement something they typically name rename-file-and-buffer, for example: 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 But rename-file-and-buffer acting on the current buffers file is inconsistent with rename-file first prompting for a file to rename, hence the logical way would be to have a new set of functions with some shared suffix. > > >> C-x C-w gives you "/current/dir/" is initial input. If you then type > >> "/other/dir/" it will "move" the file without "renaming" it (I > >> personally don't like to make this distinction, probably because > >> I consider the file's name to include all the leading directories, which > >> is also the implicit point of view of the GNU Coding Standard which uses > >> "file name" rather than "path" and reserves the word "path" for things > >> like $PATH, $LS_LIBRARY_PATH, load-path, ...). > >> And M-n inserts the current name, so I think it handles both > >> use-cases well enough. > > This creates a copy of the file, while I want to rename/move it. > > I only presented this example to illustrate how Emacs merges both "new > name" and "new directory" into a single UI (tho indeed currently > C-x C-w doesn't actually "move/rename" but it copies instead). > OK, I am completely fine with a single combined move/rename, no disagreement here. > > > include things like deal with version control. A single "move" function > is > > fine, maybe even the set-visited-file-name semantics are OK, it just has > a > > bad name, has no key bindings, no menu item, > > C-x C-w does have all those feature (other than the name). > > > and I would like a delete-visited-file to complement it. > > Could you give details as to why you'd want to separate it from > `delete-file`? > Like rename-file, delete-file will prompt for a file to delete, and it will do nothing to a buffer visiting the file, rather than getting rid of the *current* buffer and the file it visits. I often decide to delete the file after I have opened it and viewed it, it seems too much to retype the filename to delete it. > When I look for a command to move a file in the M-x completion prompt, > > I will try "move" and "rename" and see what matches, > > Right, and you'll find `rename-file`, which is what I think should do > what you want. > > > but I would surely not naturally come up with any substring > > of set-visited-file-name when thinking how Emacs might have named a > command > > to move files, except for "file-name", but this matches a ton of things. > I > > am sure many people using Emacs don't even know the concept of a visited > > file. > > Agreed. So I find it odd that you insist on having "visited-file" in > the name of the commands ;-) > That's because there are existing functions that end with -file that act on files but disregard any existing buffers associated with the file. In addition to those existing file functions, and to functions that act on buffers, I was thinking of having a third parallel set of functions that acts on the current buffer and its associated file, and I would like the naming to somehow be consistent between the three groups, that's why I came up with the -buffer-and-visited-file suffix. If that doesn't ring right, maybe it should be something like -current-buffer-and-file instead. Maybe it should actually be four groups: *-file functions *-buffer *-buffer-with-file *-current-buffer-with-file Since it's just move/rename and delete/kill, it's just 8 functions, 4 of which already exist. You might not want to do this everyday, but it's also not an exotic use case, again as evidenced by how many times I have seen it discussed on the web and in people's .emacs files. rename-buffer-with-file and delete-buffer-with-file might be useful for programmatic usage via emacs-lisp as well. > > > Also, note there is rename-file, rename-buffer, but then > > set-visited-file-name for what is effectively > > rename-file-with-visited-buffer. > > set-visited-file-name does not rename any file, AFAIK (and I don't see > any suggestion to change this). > If you set the along-with-file argument to t, or use prefix argument, I think it executes a rename like the one I would like to be able to do, so file+buffer. > > > There is also an interactive delete-file, obviously there is kill-buffer, > > but no way to delete file and kill its visiting buffer. > > FWIW, I very rarely need to do delete-file and kill-buffer at the same > time, so I'm not convinced there's a need for a separate command for > that. But as noted, I'd be OK for delete-file to kill the matching > buffer(s) [ either subject to a prompt or a user-config, for those users > who like to `delete-file` while keeping the buffer, as is occasionally > my case. ] delete-file and rename-file prompting whether to do the corresponding action also on the buffer makes sense in general, better yet if it would be possible to configure Emacs to do this always, by default, when using the functions interactively. Is something like that safe with regards to backward compatibility? Those act on a file you have to select though, I would like something that specifically acts on the current buffer and its visited file. Cheers, Jarosław Rzeszótko [-- Attachment #2: Type: text/html, Size: 10215 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 17:47 ` Jarosław Rzeszótko @ 2018-05-08 1:28 ` Stefan Monnier 2018-05-08 7:05 ` Jarosław Rzeszótko 0 siblings, 1 reply; 33+ messages in thread From: Stefan Monnier @ 2018-05-08 1:28 UTC (permalink / raw To: emacs-devel > I have a file open in a buffer in front of me. I want to rename this file > and have the buffer be changed accordingly: it should now be visiting the > file under the new name. > > rename-file will instead: > - rename the file but do nothing with the buffer, if I now save the buffer > it will get saved under the old file name. The buffer still visits the file > under the old name. That's how it works currently. But we're talking about making changes. > - it will also first prompt for a file to rename, while I want to rename > the file I am currently editing in a buffer, along with the buffer. Right. That's why I suggested to use C-x C-w for this particular case. (but rename-file (c|sh)ould still be changed accordingly). >> > Also, note there is rename-file, rename-buffer, but then >> > set-visited-file-name for what is effectively >> > rename-file-with-visited-buffer. >> set-visited-file-name does not rename any file, AFAIK (and I don't see >> any suggestion to change this). > If you set the along-with-file argument to t, or use prefix argument, I > think it executes a rename like the one I would like to be able to do, so > file+buffer. Nope, it ignores prefix args and the `along-with-file` argument only tells it that *something else* has moved the file. > delete-file and rename-file prompting whether to do the corresponding > action also on the buffer makes sense in general, better yet if it would be > possible to configure Emacs to do this always, by default, when using the > functions interactively. Is something like that safe with regards to > backward compatibility? If it's only done when used interactively, it should be safe, yes. > Those act on a file you have to select though, I would like something that > specifically acts on the current buffer and its visited file. Hence C-x C-w (aka `write-file`). Stefan ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-08 1:28 ` Stefan Monnier @ 2018-05-08 7:05 ` Jarosław Rzeszótko 2018-05-09 12:28 ` Stefan Monnier 0 siblings, 1 reply; 33+ messages in thread From: Jarosław Rzeszótko @ 2018-05-08 7:05 UTC (permalink / raw To: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 3014 bytes --] On Tue, May 8, 2018 at 3:28 AM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > > I have a file open in a buffer in front of me. I want to rename this file > > and have the buffer be changed accordingly: it should now be visiting the > > file under the new name. > > > > rename-file will instead: > > - rename the file but do nothing with the buffer, if I now save the > buffer > > it will get saved under the old file name. The buffer still visits the > file > > under the old name. > > That's how it works currently. But we're talking about making changes. > > > - it will also first prompt for a file to rename, while I want to rename > > the file I am currently editing in a buffer, along with the buffer. > > Right. That's why I suggested to use C-x C-w for this particular case. > (but rename-file (c|sh)ould still be changed accordingly). > I do not understand what you have in mind with write-file. This creates a copy, which is natural given the name. Do you envision some changes to it? Or do you mean I should just use write-file and delete the old file? Some years ago there was a conversation on emacs-devel on this topic and you yourself proposed something like rename-current-file: https://lists.gnu.org/archive/html/emacs-devel/2009-08/msg01132.html Someone even sent a patch, RMS objected to the name, and then the conversation stalled and I think nothing was changed. Some of the names I have thrown around like rename-visited-file-with-buffer attempt to deal with the ambiguity & asymmetry with respect to existing functions RMS might possibly had in mind back then. I think in this case the function names will either be short, intuitive and slightly ambiguous or the names will be long, unintuitive and precise - due to the distinction between buffer, visisted file, the fact that you have a current buffer but not really a current file, the fact that many buffers might visit the same file etc., it is very easy to come up with a lot of different names and equally easy to find something slightly wrong with each of them. Maybe it is better to have a shorter name that is not 100% precise but is intuitive to the users than have a very precise name that nobody remembers and few people will be able to discover. To try to move this forward constructively: I like the idea of delete-file/rename-file prompting whether to also kill/rename the associated buffers. However, by itself it does not yet fulfill the use case I had in mind, of dealing the file visited by the current buffer. I would be fine with something like delete-current-file/rename-current-file that just calls delete-file/rename-file on the current buffers file, and then having delete-file/rename-file prompt for modifying some or all of the (potentially several) visiting buffers. That's I think a pretty conservative change that helps accomplish a basic task many people want to do, quickly, easily and without distractions. Cheers, Jarosław Rzeszótko [-- Attachment #2: Type: text/html, Size: 5128 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-08 7:05 ` Jarosław Rzeszótko @ 2018-05-09 12:28 ` Stefan Monnier 2018-05-09 18:12 ` Radon Rosborough ` (2 more replies) 0 siblings, 3 replies; 33+ messages in thread From: Stefan Monnier @ 2018-05-09 12:28 UTC (permalink / raw To: emacs-devel > I do not understand what you have in mind with write-file. This creates a > copy, which is natural given the name. Do you envision some changes to it? Not sure what happened, but my first answer said: so maybe we could instead have `C-x C-w` prompt the user "delete the old file (y or n)?" -- Stefan ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-09 12:28 ` Stefan Monnier @ 2018-05-09 18:12 ` Radon Rosborough 2018-05-09 22:44 ` Stefan Monnier 2018-05-09 23:50 ` Van L 2018-05-10 8:20 ` Amit Ramon 2 siblings, 1 reply; 33+ messages in thread From: Radon Rosborough @ 2018-05-09 18:12 UTC (permalink / raw To: Stefan Monnier; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 435 bytes --] > > I do not understand what you have in mind with write-file. This creates a > > copy, which is natural given the name. Do you envision some changes to it? > > Not sure what happened, but my first answer said: > > so maybe we could instead have `C-x C-w` prompt the user > "delete the old file (y or n)?" It seems like you are proposing a way to copy a file and then delete the original. This is not the same as *moving* it. [-- Attachment #2: Type: text/html, Size: 622 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-09 18:12 ` Radon Rosborough @ 2018-05-09 22:44 ` Stefan Monnier 2018-05-10 17:01 ` Radon Rosborough 0 siblings, 1 reply; 33+ messages in thread From: Stefan Monnier @ 2018-05-09 22:44 UTC (permalink / raw To: emacs-devel > It seems like you are proposing a way to copy a file and then delete > the original. This is not the same as *moving* it. Emacs's handling of files tends to be fairly vague about how it handles file identity, so I think the fine distinction between "cp+rm" and "mv" in this case can be ignored. Stefan ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-09 22:44 ` Stefan Monnier @ 2018-05-10 17:01 ` Radon Rosborough 2018-05-10 21:49 ` Stefan Monnier 0 siblings, 1 reply; 33+ messages in thread From: Radon Rosborough @ 2018-05-10 17:01 UTC (permalink / raw To: Stefan Monnier; +Cc: emacs-devel [-- Attachment #1: Type: text/plain, Size: 623 bytes --] > Emacs's handling of files tends to be fairly vague about how it handles > file identity, so I think the fine distinction between "cp+rm" and "mv" > in this case can be ignored. I would have to disagree here. At the very least, as a *user*, when I look for a command to rename a file, if I find a command that copies and deletes the original, then I'm going to keep looking. Also, renaming a file is atomic on many filesystems, whereas copy+delete is certainly not going to be. Why would we want the "official" way to rename a file be needlessly prone to race conditions, even if the problem doesn't come up in practice? [-- Attachment #2: Type: text/html, Size: 826 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-10 17:01 ` Radon Rosborough @ 2018-05-10 21:49 ` Stefan Monnier 2018-05-11 7:31 ` Andreas Schwab 0 siblings, 1 reply; 33+ messages in thread From: Stefan Monnier @ 2018-05-10 21:49 UTC (permalink / raw To: Radon Rosborough; +Cc: emacs-devel > I would have to disagree here. At the very least, as a *user*, when I > look for a command to rename a file, if I find a command that copies > and deletes the original, then I'm going to keep looking. We have `rename-file` for those who want that. I was just discussing a proposition to provide a UI that lets one move "the current buffer's file" without having to introduce a new command (which comes with problems linked with finding a key-binding and/or a name for it that is easy enough to discover). > Also, renaming a file is atomic on many filesystems, It's not atomic on any POSIX system, AFAIK: it first creates a second name with `link` and then deletes the old name with `unlink`. The difference here is one of *identity*, because write-file+delete-file will not preserve the inode (and also potentially differences w.r.t handling of symlinks). > Why would we want the "official" way to rename a file be needlessly > prone to race conditions, even if the problem doesn't come up > in practice? It wouldn't be the official way to rename a file. Just a convenient way to rename the current buffer's file. Stefan "in any case it seems not to be popular, so I'll stop explaining it, since it seems to be confused with defending/promoting it" ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-10 21:49 ` Stefan Monnier @ 2018-05-11 7:31 ` Andreas Schwab 2018-05-11 15:33 ` Stefan Monnier 0 siblings, 1 reply; 33+ messages in thread From: Andreas Schwab @ 2018-05-11 7:31 UTC (permalink / raw To: Stefan Monnier; +Cc: Radon Rosborough, emacs-devel On Mai 10 2018, Stefan Monnier <monnier@IRO.UMontreal.CA> wrote: > It's not atomic on any POSIX system, AFAIK: it first creates a second > name with `link` and then deletes the old name with `unlink`. That method has been obsolete for decades. POSIX requires rename to be atomic. Andreas. -- Andreas Schwab, schwab@linux-m68k.org GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1 "And now for something completely different." ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-11 7:31 ` Andreas Schwab @ 2018-05-11 15:33 ` Stefan Monnier 2018-05-11 15:45 ` Paul Eggert 0 siblings, 1 reply; 33+ messages in thread From: Stefan Monnier @ 2018-05-11 15:33 UTC (permalink / raw To: Andreas Schwab; +Cc: Radon Rosborough, emacs-devel >> It's not atomic on any POSIX system, AFAIK: it first creates a second >> name with `link` and then deletes the old name with `unlink`. > That method has been obsolete for decades. POSIX requires rename to be > atomic. Even when moving from one directory to another? Stefan ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-11 15:33 ` Stefan Monnier @ 2018-05-11 15:45 ` Paul Eggert 2018-05-11 16:06 ` Clément Pit-Claudel 2018-05-11 16:14 ` Stefan Monnier 0 siblings, 2 replies; 33+ messages in thread From: Paul Eggert @ 2018-05-11 15:45 UTC (permalink / raw To: Stefan Monnier, Andreas Schwab; +Cc: Radon Rosborough, emacs-devel On 05/11/2018 08:33 AM, Stefan Monnier wrote: >> That method has been obsolete for decades. POSIX requires rename to be >> atomic. > Even when moving from one directory to another? Yes, that requirement has been in POSIX ever since POSIX was introduced; I just now checked my printed copy of IEEE Std 1003.1-1988. ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-11 15:45 ` Paul Eggert @ 2018-05-11 16:06 ` Clément Pit-Claudel 2018-05-11 16:14 ` Stefan Monnier 1 sibling, 0 replies; 33+ messages in thread From: Clément Pit-Claudel @ 2018-05-11 16:06 UTC (permalink / raw To: emacs-devel On 2018-05-11 11:45, Paul Eggert wrote: > On 05/11/2018 08:33 AM, Stefan Monnier wrote: >>> That method has been obsolete for decades. POSIX requires rename >>> to be atomic. >> Even when moving from one directory to another? > > Yes, that requirement has been in POSIX ever since POSIX was > introduced; I just now checked my printed copy of IEEE Std > 1003.1-1988. I don't know much about this, so sorry if the following is silly. Hopefully someone can clarify. The glibc implementation of rename in glibc/sysdeps/posix/rename.c is this: /* Rename the file OLD to NEW. */ int rename (const char *old, const char *new) { int save = errno; if (__link (old, new) < 0) { if (errno == EEXIST) { __set_errno (save); /* Race condition, required for 1003.1 conformance. */ if (__unlink (new) < 0 || __link (old, new) < 0) return -1; } else return -1; } if (__unlink (old) < 0) { save = errno; if (__unlink (new) == 0) __set_errno (save); return -1; } return 0; } Is this just a fallback implementation (the "obsolete for decades" method that Andreas referred to?), unused on most platforms? Thanks! Clément. ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-11 15:45 ` Paul Eggert 2018-05-11 16:06 ` Clément Pit-Claudel @ 2018-05-11 16:14 ` Stefan Monnier 1 sibling, 0 replies; 33+ messages in thread From: Stefan Monnier @ 2018-05-11 16:14 UTC (permalink / raw To: Paul Eggert; +Cc: Radon Rosborough, Andreas Schwab, emacs-devel >>> That method has been obsolete for decades. POSIX requires rename to be >>> atomic. >> Even when moving from one directory to another? > Yes, that requirement has been in POSIX ever since POSIX was introduced; > I just now checked my printed copy of IEEE Std 1003.1-1988. Cool! I had no idea. Thank, Stefan ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-09 12:28 ` Stefan Monnier 2018-05-09 18:12 ` Radon Rosborough @ 2018-05-09 23:50 ` Van L 2018-05-10 5:37 ` Jarosław Rzeszótko 2018-05-10 8:20 ` Amit Ramon 2 siblings, 1 reply; 33+ messages in thread From: Van L @ 2018-05-09 23:50 UTC (permalink / raw To: Stefan Monnier; +Cc: emacs-devel > On 9 May 2018, at 22:28, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > >> I do not understand what you have in mind with write-file. This creates a >> copy, which is natural given the name. Do you envision some changes to it? > > Not sure what happened, but my first answer said: > > so maybe we could instead have `C-x C-w` prompt the user > "delete the old file (y or n)?" > Is there a channel for demand driven development? like: https://digitalocean.uservoice.com I believe in the longer term it is better for the Emacs devotee to learn enough of Dired to `type R’ for renaming a file or use the shell command in that context `! mv ? delete-me’. ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-09 23:50 ` Van L @ 2018-05-10 5:37 ` Jarosław Rzeszótko 2018-05-10 13:18 ` Van L 0 siblings, 1 reply; 33+ messages in thread From: Jarosław Rzeszótko @ 2018-05-10 5:37 UTC (permalink / raw To: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 2046 bytes --] On Thu, May 10, 2018 at 1:50 AM, Van L <van@scratch.space> wrote: > > > On 9 May 2018, at 22:28, Stefan Monnier <monnier@iro.umontreal.ca> > wrote: > > > >> I do not understand what you have in mind with write-file. This creates > a > >> copy, which is natural given the name. Do you envision some changes to > it? > > > > Not sure what happened, but my first answer said: > > > > so maybe we could instead have `C-x C-w` prompt the user > > "delete the old file (y or n)?" > > > > Is there a channel for demand driven development? like: > > https://digitalocean.uservoice.com > > I believe in the longer term it is better for the Emacs devotee to learn > enough of Dired to `type R’ for renaming a file or use the shell command in > that context `! mv ? delete-me’. > This might be a personal thing, but Dired for a quick rename is a bit like killing a fly with a cannon. I find anything involving additional buffers distracting when I am focused on changing a set of files - I am typically refactoring a program, which already involves keeping some items in working memory. It always seemed to me rename-this-file-and-buffer (or however it might be called) is one of .emacs perennial "greatest hits". It also seems like a natural extension of existing set of functions involving buffers and files. Given this, I find the response here so far rather surprising. Personally I hoped Emacs could incorporate more of the most common customizations (the ones that do not involve breaking any compatibility or preexisting behavior) into core, the amount of additional packages you have to install in Emacs to make it competitive with a modern editor is huge, and involves changing nearly everything, e.g. how page scrolling behaves, how copy/paste behaves, ... If you look at something like prelude, some of it is very opinionated, but some of it just plugs what are IMO obvious gaps in Emacs, like this one, that could be patched without breaking anything. Cheers, Jarosław Rzeszótkot [-- Attachment #2: Type: text/html, Size: 2751 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-10 5:37 ` Jarosław Rzeszótko @ 2018-05-10 13:18 ` Van L 0 siblings, 0 replies; 33+ messages in thread From: Van L @ 2018-05-10 13:18 UTC (permalink / raw To: Jarosław Rzeszótko; +Cc: emacs-devel@gnu.org > Jarosław Rzeszótko writes: > > This might be a personal thing, but Dired for a quick rename is a bit like killing a fly with a cannon. I find anything involving additional buffers distracting when I am focused on changing a set of files - I am typically refactoring a program, which already involves keeping some items in working memory. The way a mechanism like `uservoice’ for demand driven development might work in this case is for the programmer to make the suggestion and post their idea as solved already in elisp snippet for voting on the next step. I bet the cannon’s shot won’t ever come in contact with a fly in a mythbuster test. :-) ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-09 12:28 ` Stefan Monnier 2018-05-09 18:12 ` Radon Rosborough 2018-05-09 23:50 ` Van L @ 2018-05-10 8:20 ` Amit Ramon 2018-05-10 8:59 ` Phil Sainty 2018-05-10 16:04 ` Eli Zaretskii 2 siblings, 2 replies; 33+ messages in thread From: Amit Ramon @ 2018-05-10 8:20 UTC (permalink / raw To: emacs-devel Stefan Monnier <monnier@iro.umontreal.ca> [2018-05-09 08:28 -0400]: >> I do not understand what you have in mind with write-file. This creates a >> copy, which is natural given the name. Do you envision some changes to it? > >Not sure what happened, but my first answer said: > > so maybe we could instead have `C-x C-w` prompt the user > "delete the old file (y or n)?" For me the use case for using C-x C-w is not to move a file, but to create a copy of a file leaving the original file untouched -- for example if I want to create a new file but I want to start from an existing one as a template. So for this use case C-x C-w works exactly as I would expect, and adding the option to delete the original file is unnecessary, and prompting the user would just interrupt. As for renaming/moving/deleting a file I feel very comfortable with doing it with Dired. C-x C-j, R <new name> RET, q -- for me it is convenient and not too long. Also, there is the point of "having too many commands" -- this would make Emacs more complex to use, and personally I prefer a simpler interface, even at the cost of not having a specific command for every edge case. --- Amit ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-10 8:20 ` Amit Ramon @ 2018-05-10 8:59 ` Phil Sainty 2018-05-10 16:04 ` Eli Zaretskii 1 sibling, 0 replies; 33+ messages in thread From: Phil Sainty @ 2018-05-10 8:59 UTC (permalink / raw To: emacs-devel; +Cc: Emacs-devel Count me as one of those who find a "rename buffer and file" command useful. I've had one of those bound to "C-c r" for a very long time, and I consider it convenient to be able to do this directly from the buffer in question, rather than going to dired. On 2018-05-10 20:20, Amit Ramon wrote: > Stefan Monnier <monnier@iro.umontreal.ca> [2018-05-09 08:28 -0400]: >> so maybe we could instead have `C-x C-w` prompt the user >> "delete the old file (y or n)?" > > adding the option to delete the original file is unnecessary, and > prompting the user would just interrupt. I'd certainly find it annoying if C-x C-w added an extra prompt. -Phil ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-10 8:20 ` Amit Ramon 2018-05-10 8:59 ` Phil Sainty @ 2018-05-10 16:04 ` Eli Zaretskii 1 sibling, 0 replies; 33+ messages in thread From: Eli Zaretskii @ 2018-05-10 16:04 UTC (permalink / raw To: Amit Ramon; +Cc: emacs-devel > Date: Thu, 10 May 2018 11:20:05 +0300 > From: Amit Ramon <amit.ramon@riseup.net> > > Stefan Monnier <monnier@iro.umontreal.ca> [2018-05-09 08:28 -0400]: > > >> I do not understand what you have in mind with write-file. This creates a > >> copy, which is natural given the name. Do you envision some changes to it? > > > >Not sure what happened, but my first answer said: > > > > so maybe we could instead have `C-x C-w` prompt the user > > "delete the old file (y or n)?" > > For me the use case for using C-x C-w is not to move a file, but to > create a copy of a file leaving the original file untouched -- for > example if I want to create a new file but I want to start from an > existing one as a template. Let me remind people that "C-x C-w" is the Emacs implementation of the "Save As" paradigm, so it must stay as it is today. It would be possible to make it do something slightly different given an argument, but it already accepts an argument and interprets it in a different way. Maybe we could do the renaming with some special value of the argument, though. But the default behavior should definitely stay, IMO. ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 16:20 ` Jarosław Rzeszótko 2018-05-07 17:01 ` Stefan Monnier @ 2018-05-07 18:20 ` Andreas Schwab 2018-05-08 1:28 ` Stefan Monnier 1 sibling, 1 reply; 33+ messages in thread From: Andreas Schwab @ 2018-05-07 18:20 UTC (permalink / raw To: Jarosław Rzeszótko; +Cc: emacs-devel@gnu.org On Mai 07 2018, Jarosław Rzeszótko <jrzeszotko@gmail.com> wrote: > That's maybe one more reason a function like buffer-directory-name would be > nice? How is that different from (file-name-directory (buffer-file-name))? Andreas. -- Andreas Schwab, schwab@linux-m68k.org GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1 "And now for something completely different." ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 18:20 ` Andreas Schwab @ 2018-05-08 1:28 ` Stefan Monnier 0 siblings, 0 replies; 33+ messages in thread From: Stefan Monnier @ 2018-05-08 1:28 UTC (permalink / raw To: emacs-devel >> That's maybe one more reason a function like buffer-directory-name would be >> nice? > How is that different from (file-name-directory (buffer-file-name))? I think he meant "command" when he wrote "function". Stefan ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 13:58 Rename, delete and move current buffer and file Jarosław Rzeszótko 2018-05-07 14:53 ` Stefan Monnier @ 2018-05-07 15:28 ` Yuri Khan 2018-05-07 16:20 ` Jarosław Rzeszótko 2018-05-09 11:46 ` Tino Calancha 2018-05-07 15:29 ` Andreas Röhler 2 siblings, 2 replies; 33+ messages in thread From: Yuri Khan @ 2018-05-07 15:28 UTC (permalink / raw To: jrzeszotko; +Cc: Emacs developers On Mon, May 7, 2018 at 8:59 PM Jarosław Rzeszótko <jrzeszotko@gmail.com> wrote: > It is surprisingly hard to do this in Emacs […] > You can use dired, but I personally find it to be a distraction for this use case. Why? I think of deleting, renaming and moving as operations on the file as a whole and not on its content, so saving the file and going “outside” it is the intuitive first step for me. ‘dired-jump’ takes me to the Dired buffer of the enclosing directory and puts point on the file. It’s on C-x C-j by default, but I bind it on <M-S-up> so my fingers think going “outside” is a single spatial movement. If I want to delete the file, I press D and confirm. To rename, I press R and enter the new name; the buffer is renamed automatically. When copying or moving files, I prefer to see the target directory before I do it. So, I split the window, switch there, navigate to the target directory, switch back, R (or C to copy), RET (because with ‘dired-dwim-target’ set to non-nil the target directory is automatically suggested as the default), then deal with any changes to the window configuration. Note here the DWIM behavior: R suggests the directory in the other window, but if there is no other window, then the current directory. > A very similar related pain point is that it is hard to get the path and directory of the current buffers visited file. Your favorite binding of ‘find-file’, followed by your preferred method to get the current line to clipboard. (This breaks if you ‘cd’ to a different directory while editing a file.) > Finally, while we are discussing functions everyone re-implements in their .emacs, please lets make transpose-windows happen as an Emacs builtin :) You mean the windcycle library? ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 15:28 ` Yuri Khan @ 2018-05-07 16:20 ` Jarosław Rzeszótko 2018-05-09 11:46 ` Tino Calancha 1 sibling, 0 replies; 33+ messages in thread From: Jarosław Rzeszótko @ 2018-05-07 16:20 UTC (permalink / raw To: emacs-devel@gnu.org [-- Attachment #1: Type: text/plain, Size: 4629 bytes --] On Mon, May 7, 2018 at 5:28 PM, Yuri Khan <yurivkhan@gmail.com> wrote: > On Mon, May 7, 2018 at 8:59 PM Jarosław Rzeszótko <jrzeszotko@gmail.com> > wrote: > > > It is surprisingly hard to do this in Emacs […] > > You can use dired, but I personally find it to be a distraction for this > use case. > > Why? > I personally most often want this when working on a programming project, I have a bunch of files open and I am in the middle of a planned sequence of changes, popping up a new buffer and dealing with dired which I do not otherwise use much breaks my concentration. It is hard to explain this fully rationally, but judging by how many .emacs, libraries, wiki pages etc. I have seen that have rename-file-and-buffer in them I am not the only one. Note that an interactive delete-file function already exists, but it doesn't kill the associated buffer. That's why I consider it a gap in the Emacs set of functions. There are three sets of operations: file operations (rename-file, delete-file), buffer operations (rename-buffer, kill-buffer) and some file+buffer operations (set-visited-file-name). It would be nice if there was some unity among the three sets, so that it would be possible to do the common operations in all three ways (file/buffer/file+buffer), and that the naming is reasonably consistent. Of course backwards compatibility is an issue as always. > [...] > > A very similar related pain point is that it is hard to get the path and > directory of the current buffers visited file. > > Your favorite binding of ‘find-file’, followed by your preferred method to > get the current line to clipboard. (This breaks if you ‘cd’ to a different > directory while editing a file.) > This is not that easy if you use a completion system like ivy or ido. It's also not nice from an elisp standpoint, that for the two strongly related things, one is accessible only as a variable and the other either as a command or function. > > > Finally, while we are discussing functions everyone re-implements in > their .emacs, please lets make transpose-windows happen as an Emacs builtin > :) > > You mean the windcycle library? > I mean: https://github.com/bbatsov/crux/blob/master/crux.el#L471 https://www.emacswiki.org/emacs/TransposeWindows Sure there are packages to do this, it just seems strange among the many built-in window functions there is no transpose. Again, you will easily find very many .emacs on the web implementing a function like this, which for me looks like a bit of gap in what is provided out-of-the-box. Cheers, Jarosław Rzeszótko On Mon, May 7, 2018 at 5:28 PM, Yuri Khan <yurivkhan@gmail.com> wrote: > On Mon, May 7, 2018 at 8:59 PM Jarosław Rzeszótko <jrzeszotko@gmail.com> > wrote: > > > It is surprisingly hard to do this in Emacs […] > > You can use dired, but I personally find it to be a distraction for this > use case. > > Why? > > I think of deleting, renaming and moving as operations on the file as a > whole and not on its content, so saving the file and going “outside” it is > the intuitive first step for me. ‘dired-jump’ takes me to the Dired buffer > of the enclosing directory and puts point on the file. It’s on C-x C-j by > default, but I bind it on <M-S-up> so my fingers think going “outside” is a > single spatial movement. > > If I want to delete the file, I press D and confirm. To rename, I press R > and enter the new name; the buffer is renamed automatically. > > When copying or moving files, I prefer to see the target directory before I > do it. So, I split the window, switch there, navigate to the target > directory, switch back, R (or C to copy), RET (because with > ‘dired-dwim-target’ set to non-nil the target directory is automatically > suggested as the default), then deal with any changes to the window > configuration. > > Note here the DWIM behavior: R suggests the directory in the other window, > but if there is no other window, then the current directory. > > > A very similar related pain point is that it is hard to get the path and > directory of the current buffers visited file. > > Your favorite binding of ‘find-file’, followed by your preferred method to > get the current line to clipboard. (This breaks if you ‘cd’ to a different > directory while editing a file.) > > > Finally, while we are discussing functions everyone re-implements in > their .emacs, please lets make transpose-windows happen as an Emacs builtin > :) > > You mean the windcycle library? > [-- Attachment #2: Type: text/html, Size: 7873 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 15:28 ` Yuri Khan 2018-05-07 16:20 ` Jarosław Rzeszótko @ 2018-05-09 11:46 ` Tino Calancha 1 sibling, 0 replies; 33+ messages in thread From: Tino Calancha @ 2018-05-09 11:46 UTC (permalink / raw To: jrzeszotko; +Cc: Yuri Khan, Emacs developers Yuri Khan <yurivkhan@gmail.com> writes: > I think of deleting, renaming and moving as operations on the file as a > whole and not on its content, so saving the file and going “outside” it is > the intuitive first step for me. ‘dired-jump’ takes me to the Dired buffer > of the enclosing directory and puts point on the file. > If I want to delete the file, I press D and confirm. To rename, I press R > and enter the new name; the buffer is renamed automatically. +1 Jarosław Rzeszótko <jrzeszotko@gmail.com> writes: >popping up a new buffer and dealing with dired which I do not otherwise >use much breaks my concentration. Learning the _basics_ of Dired is quite straigh and it's really worth it! If you feel cumbersome having several buffers I suggest you to try `list-buffers' or `ibuffer'. ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 13:58 Rename, delete and move current buffer and file Jarosław Rzeszótko 2018-05-07 14:53 ` Stefan Monnier 2018-05-07 15:28 ` Yuri Khan @ 2018-05-07 15:29 ` Andreas Röhler 2018-05-07 15:38 ` Andreas Röhler 2018-05-10 0:46 ` net june 2 siblings, 2 replies; 33+ messages in thread From: Andreas Röhler @ 2018-05-07 15:29 UTC (permalink / raw To: emacs-devel 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 ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 15:29 ` Andreas Röhler @ 2018-05-07 15:38 ` Andreas Röhler 2018-05-10 0:46 ` net june 1 sibling, 0 replies; 33+ messages in thread From: Andreas Röhler @ 2018-05-07 15:38 UTC (permalink / raw To: emacs-devel On 07.05.2018 17:29, Andreas Röhler wrote: > > > 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 After all seeing dired-jump is better here. So lets forget about that ;) ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-07 15:29 ` Andreas Röhler 2018-05-07 15:38 ` Andreas Röhler @ 2018-05-10 0:46 ` net june 2018-05-11 6:26 ` Andreas Röhler 1 sibling, 1 reply; 33+ messages in thread From: net june @ 2018-05-10 0:46 UTC (permalink / raw To: emacs-devel@gnu.org, Andreas Röhler [-- Attachment #1: Type: text/plain, Size: 4895 bytes --] I have a command my-rename-file for my own use for long time. It does thing as following: 1. When run with no prefix arg, rename the the visiting file in its directory, prompting for new name(read-string) with the old name as init input. 2. in 1, if user input an empty string, delete the file on disk. 3. when run with prefix arg, rename the visiting file to anywhere user choose, prompting for new file path(read-file-name) ?? Outlook for Android<https://aka.ms/ghei36> ________________________________ From: Emacs-devel <emacs-devel-bounces+netjune=outlook.com@gnu.org> on behalf of Andreas Röhler <andreas.roehler@online.de> Sent: Monday, May 7, 2018 11:29:50 PM To: emacs-devel@gnu.org Subject: Re: Rename, delete and move current buffer and file 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 [-- Attachment #2: Type: text/html, Size: 7715 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-10 0:46 ` net june @ 2018-05-11 6:26 ` Andreas Röhler 2018-05-11 16:10 ` net june 0 siblings, 1 reply; 33+ messages in thread From: Andreas Röhler @ 2018-05-11 6:26 UTC (permalink / raw To: emacs-devel; +Cc: net june Sound cool and should save a keystroke WRT dired-jump and friends. May you post the code? On 10.05.2018 02:46, net june wrote: > I have a command my-rename-file for my own use for long time. It does > thing as following: > 1. When run with no prefix arg, rename the the visiting file in its > directory, prompting for new name(read-string) with the old name as > init input. > 2. in 1, if user input an empty string, delete the file on disk. > 3. when run with prefix arg, rename the visiting file to anywhere user > choose, prompting for new file path(read-file-name) > > 获取 Outlook for Android <https://aka.ms/ghei36> > > ------------------------------------------------------------------------ > *From:* Emacs-devel <emacs-devel-bounces+netjune=outlook.com@gnu.org> on > behalf of Andreas Röhler <andreas.roehler@online.de> > *Sent:* Monday, May 7, 2018 11:29:50 PM > *To:* emacs-devel@gnu.org > *Subject:* Re: Rename, delete and move current buffer and file > > > 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 > ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: Rename, delete and move current buffer and file 2018-05-11 6:26 ` Andreas Röhler @ 2018-05-11 16:10 ` net june 0 siblings, 0 replies; 33+ messages in thread From: net june @ 2018-05-11 16:10 UTC (permalink / raw To: Andreas Röhler, emacs-devel@gnu.org On 05/11/2018 02:26 PM, Andreas Röhler wrote: > Sound cool and should save a keystroke WRT dired-jump and friends. > May you post the code? > Yes. The following is it. (defun my-rename-file (arg) "Rename or delete the file visited by current buffer." (interactive "P") (unless buffer-file-name (user-error "Not a file buffer")) (let ((old-name (file-name-nondirectory buffer-file-name)) new-file-name) (if arg (let ((tmp-file-name (read-file-name "Rename to: "))) (setq new-file-name (if (file-directory-p tmp-file-name) (concat (file-name-as-directory tmp-file-name) old-name) tmp-file-name))) (let* ((new-name (read-string "New file name: " old-name))) (when (string= new-name old-name) (user-error "Same as the old name. Not renamed.")) (if (string= new-name "") (when (yes-or-no-p (format "Delete file \"%s\"?" buffer-file-name)) ;; On fail, it will signal an error and abort. (delete-file buffer-file-name) (set-buffer-modified-p nil) (kill-buffer) (message "File deleted")) (setq new-file-name (expand-file-name new-name))))) (when new-file-name (let ((modify-flag (buffer-modified-p)) (old-file-name buffer-file-name)) ;; On fail, it will signal an error and abort. (rename-file buffer-file-name new-file-name 1) (set-visited-file-name new-file-name) (rename-buffer (file-name-nondirectory new-file-name) t) (set-buffer-modified-p modify-flag) (message "Renamed: %s ==> %s" old-file-name new-file-name))))) ^ permalink raw reply [flat|nested] 33+ messages in thread
end of thread, other threads:[~2018-05-11 16:14 UTC | newest] Thread overview: 33+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-05-07 13:58 Rename, delete and move current buffer and file Jarosław Rzeszótko 2018-05-07 14:53 ` Stefan Monnier 2018-05-07 16:20 ` Jarosław Rzeszótko 2018-05-07 17:01 ` Stefan Monnier 2018-05-07 17:47 ` Jarosław Rzeszótko 2018-05-08 1:28 ` Stefan Monnier 2018-05-08 7:05 ` Jarosław Rzeszótko 2018-05-09 12:28 ` Stefan Monnier 2018-05-09 18:12 ` Radon Rosborough 2018-05-09 22:44 ` Stefan Monnier 2018-05-10 17:01 ` Radon Rosborough 2018-05-10 21:49 ` Stefan Monnier 2018-05-11 7:31 ` Andreas Schwab 2018-05-11 15:33 ` Stefan Monnier 2018-05-11 15:45 ` Paul Eggert 2018-05-11 16:06 ` Clément Pit-Claudel 2018-05-11 16:14 ` Stefan Monnier 2018-05-09 23:50 ` Van L 2018-05-10 5:37 ` Jarosław Rzeszótko 2018-05-10 13:18 ` Van L 2018-05-10 8:20 ` Amit Ramon 2018-05-10 8:59 ` Phil Sainty 2018-05-10 16:04 ` Eli Zaretskii 2018-05-07 18:20 ` Andreas Schwab 2018-05-08 1:28 ` Stefan Monnier 2018-05-07 15:28 ` Yuri Khan 2018-05-07 16:20 ` Jarosław Rzeszótko 2018-05-09 11:46 ` Tino Calancha 2018-05-07 15:29 ` Andreas Röhler 2018-05-07 15:38 ` Andreas Röhler 2018-05-10 0:46 ` net june 2018-05-11 6:26 ` Andreas Röhler 2018-05-11 16:10 ` net june
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.