Use-case:
Mark for deletion target files and directories at the dired buffer;
Execute 'dired-do-flagged-delete' (type 'x');
Result: I'm asked about confirmation for every non-empty directory being removed.
Question: is there easy way to say 'yes' one time and get all of the marked stuff (including non-empty directories) removed?
I googled that it's possible to set 'dired-recursive-deletes' to 'always' but that doesn't protect me from accidental 'delete' processing (e.g. mistyped 'x' while wrong directory is marked).
I understand that it's possible to customize emacs via lisp injections but I don't know that language so far, that's the reason why I'm asking whether there is other solution.
I think you found your answer but didn't try it.
(setq dired-recursive-deletes 'always)
And you'll only get a single prompt, asking if you want to delete the n items, and you'll get a list of them. You will not be further prompted for the directories.
Related
A directory titled auto-save-list appeared in my .emacs.d folder. In my init.el file, I did not explicitly mention I want this folder to be made. What is the purpose of this folder? I noticed it seems to always be empty: files being auto-saved (starting with #) appear wherever the original file being edited is, not in the auto-save-list directory.
If you search the manual or its index for auto-save-list you will find:
Emacs records information about interrupted sessions in files named
‘.saves-PID-HOSTNAME’ in the directory ‘~/.emacs.d/auto-save-list/’.
This directory is determined by the variable
‘auto-save-list-file-prefix’. If you set ‘auto-save-list-file-prefix’
to ‘nil’, sessions are not recorded for recovery.
– C-hig (emacs)Recover RET
I did not explicitly mention I want this folder to be made.
Emacs and elisp libraries in general write to ~/.emacs.d/ when they need to save data. That's one of the purposes of this directory -- to provide a common place for such files to be written to; and this typically happens without asking explicit permission (although it's also pretty common for you to be able to customize the filename in question if you so wish).
phils already answered the specific question, but to answer the more general question of what to do about miscellaneous files automatically created by Emacs, check out the no-littering package.
Auto save files (the ones with '#') are not handled by no-littering, but the readme gives a work around for those if you wish.
I update from ELPA/MELPA regularly. Unfortunately, the files the Emacs package manager manipulates show up in my recentf list, basically making it useless since it's always full from whatever files were updated, and not files that I actually care about. How can I fix this?
See user options recentf-exclude, recentf-keep, recentf-auto-cleanup, and command recentf-cleanup.
The first two options let you exclude and include files that satisfy certain predicates or whose names match certain patterns, respectively.
The command ido-find-file offers the option to restrict the completion list using a filter. For example, one may input .cpp, press C-SPC et voila, the completion list is restricted to files with .cpp.
However, sometimes it is useful to restrict the list to directories in the first steps of navigation, e.g. when one is navigating to a file, residing in a subdirectory of unknown name, which is located within a directory with a lot of ordinary files.
Is there some built-in functionality for restricting ido to accept only directories in the current step (current step is either delimited by a) calling an un-restrict function, or b) [also the better solution] by an actual naviagtional command, i.e. descending/ascending in the directory tree level)? Or, if not, can someone write a function to do just that?
This functionality is already present in form of ido-dired.
UPD:
Two-stage find-file is as easy as you could imagine:
(defun find-file-2 ()
(interactive)
(ido-dired)
(ido-find-file))
Is there any way to make find-name-dired to only show filenames that I can move through and select? I have a lot of files that are buried in subdirectories, and I don't want it to print out the entire subdirectory every time it finds a file.
Two problems with this:
How would you distinguish between two files with the same file name in different directories?
Dired needs the full path in order to be able to do anything with that file.
You could deal with (2) by using text properties or overlays to hide the directories, but due to (1) I really couldn't recommend that.
Edit: to otherwise customise the output of dired to reduce unwanted noise you can use Dired Details (optionally with Dired Details Plus)
How do I hide number of links in dired?
Emacs dired: too much information
I'd like to partly automate creation of GNU-style ChangeLog entries when working with source code in version control. The add-changelog-entry-other-window works with one file at a time and you have to visit the file to use it.
What I'd like to see instead is to have some command that would take an output of diff -u -p (or have integration with VC modes so it could process svn diff etc) and to create all the skeleton entries at once.
For example, if svn status shows
D file1.c
M file2.c
A file3.c
the command would create
2009-09-05 My Name <my.email>
* file1.c: Removed.
* file2.c: WRITE YOUR CHANGES HERE
* file3.c: New.
Better yet, if it could parse the changed files in some languages to an extent so it could offer:
* file2.c (new_function): New function.
(deleted_function): Removed.
(changed_function): WRITE YOUR CHANGES HERE
I have found this feature in Emacs manual, but I don't see how I could apply it here.
Any suggestions? Thanks.
EDIT: One answer suggested vc-update-change-log. Unfortunately it only supports CVS and it creates ChangeLog entries by querying the already-commited VC logs. Thus even if it supported svn and others, it would be impossible to commit the changes and the ChangeLog in the same commit.
EDIT2: Apparently add-changelog-entry-other-window (C-x 4 a) works not only from visited file but from diff hunk involving that file too. (Source) This is almost what I am looking for. This together with elisp loop to iterate through all hunks should solve it.
There is a function vc-update-change-log that automatically generates change log entries from the version control log entries.
diff-add-change-log-entries-other-window is documented to do exactly what you mentioned in EDIT2:
diff-add-change-log-entries-other-window is an interactive compiled
Lisp function in `diff-mode.el'.
(diff-add-change-log-entries-other-window)
Iterate through the current diff and create ChangeLog entries.
I.e. like `add-change-log-entry-other-window' but applied to all hunks.
Unfortunately, it doesn't work very well for, say, new files: it doesn't even include the filenames of such files in the skeletal changelog entry.
You might have better luck with gcc's mklog script, which you can get from http://gcc.gnu.org/viewcvs/gcc/trunk/contrib/mklog.
I don't know of a function that does this, but it should be easy to implement. Basically, you want to
get the changed files
for each file, call add-change-log
"Find change log file, and add an entry for today and an item for this file.
Optional arg WHOAMI (interactive prefix) non-nil means prompt for user
name and email (stored in `add-log-full-name' and `add-log-mailing-address').
Second arg FILE-NAME is file name of the change log.
If nil, use the value of `change-log-default-name'.
Third arg OTHER-WINDOW non-nil means visit in other window.
Fourth arg NEW-ENTRY non-nil means always create a new entry at the front;
never append to an existing entry. Option `add-log-keep-changes-together'
otherwise affects whether a new entry is created.
Option `add-log-always-start-new-record' non-nil means always create a
new record, even when the last record was made on the same date and by
the same person.
The change log file can start with a copyright notice and a copying
permission notice. The first blank line indicates the end of these
notices.
Today's date is calculated according to `add-log-time-zone-rule' if
non-nil, otherwise in local time."
so the magic code is going to look something like
(apply 'make-magic-change-log-entry changed-files-list)
and make-magic-change-log-entry simply curries the add-change-log function so that the only argument is file-name — you set the other ones.
I've written a function to do something similar to what you were talking about. You can get the code at http://www.emacswiki.org/emacs/log-edit-fill