New commands to create an empty file
Similarly as `create-directory', `dired-create-directory', the new commands create the parent dirs as needed (Bug#24150). * lisp/files.el (make-empty-file): New command. * lisp/dired-aux.el (dired-create-empty-file): New command. (dired--find-topmost-parent-dir): New function extracted from `dired-create-directory'. (dired-create-directory, dired-create-empty-file): Use it. * lisp/dired.el (dired-mode-map): Add menu entry for `dired-create-empty-file'. * doc/emacs/dired.texi (Misc Dired Features) * doc/lispref/files.texi (Create/Delete Dirs): Update manual. ; * etc/NEWS: Announce the changes.
This commit is contained in:
parent
d216d7d248
commit
e65ec81fc3
6 changed files with 70 additions and 6 deletions
|
@ -1468,6 +1468,11 @@ rotation is lossless, and uses an external utility called
|
|||
directory's name, and creates that directory. It signals an error if
|
||||
the directory already exists.
|
||||
|
||||
@findex dired-create-empty-file
|
||||
The command (@code{dired-create-empty-file}) reads a
|
||||
file name, and creates that file. It signals an error if
|
||||
the file already exists.
|
||||
|
||||
@cindex searching multiple files via Dired
|
||||
@kindex M-s a C-s @r{(Dired)}
|
||||
@kindex M-s a M-C-s @r{(Dired)}
|
||||
|
|
|
@ -3005,10 +3005,16 @@ This command creates a directory named @var{dirname}. If
|
|||
@var{parents} is non-@code{nil}, as is always the case in an
|
||||
interactive call, that means to create the parent directories first,
|
||||
if they don't already exist.
|
||||
|
||||
@code{mkdir} is an alias for this.
|
||||
@end deffn
|
||||
|
||||
@deffn Command make-empty-file filename &optional parents
|
||||
This command creates an empty file named @var{filename}.
|
||||
As @code{make-directory}, this command creates parent directories
|
||||
if @var{parents} is non-@code{nil}.
|
||||
If @var{filename} already exists, this command signals an error.
|
||||
@end deffn
|
||||
|
||||
@deffn Command copy-directory dirname newname &optional keep-time parents copy-contents
|
||||
This command copies the directory named @var{dirname} to
|
||||
@var{newname}. If @var{newname} is a directory name,
|
||||
|
|
8
etc/NEWS
8
etc/NEWS
|
@ -185,6 +185,9 @@ This triggers to search the program on the remote host as indicated by
|
|||
|
||||
* Editing Changes in Emacs 27.1
|
||||
|
||||
+++
|
||||
** New command 'make-empty-file'.
|
||||
|
||||
---
|
||||
** New variable 'x-wait-for-event-timeout'.
|
||||
This controls how long Emacs will wait for updates to the graphical
|
||||
|
@ -222,6 +225,11 @@ navigation and editing of large files.
|
|||
|
||||
* Changes in Specialized Modes and Packages in Emacs 27.1
|
||||
|
||||
+++
|
||||
** Dired
|
||||
|
||||
*** New command 'dired-create-empty-file'.
|
||||
|
||||
** Change Logs and VC
|
||||
|
||||
*** Recording ChangeLog entries doesn't require an actual file.
|
||||
|
|
|
@ -1989,6 +1989,19 @@ Optional arg HOW-TO determines how to treat the target.
|
|||
dired-dirs)))
|
||||
|
||||
|
||||
|
||||
;; We use this function in `dired-create-directory' and
|
||||
;; `dired-create-empty-file'; the return value is the new entry
|
||||
;; in the updated Dired buffer.
|
||||
(defun dired--find-topmost-parent-dir (filename)
|
||||
"Return the topmost nonexistent parent dir of FILENAME.
|
||||
FILENAME is a full file name."
|
||||
(let ((try filename) new)
|
||||
(while (and try (not (file-exists-p try)) (not (equal new try)))
|
||||
(setq new try
|
||||
try (directory-file-name (file-name-directory try))))
|
||||
new))
|
||||
|
||||
;;;###autoload
|
||||
(defun dired-create-directory (directory)
|
||||
"Create a directory called DIRECTORY.
|
||||
|
@ -1997,18 +2010,32 @@ If DIRECTORY already exists, signal an error."
|
|||
(interactive
|
||||
(list (read-file-name "Create directory: " (dired-current-directory))))
|
||||
(let* ((expanded (directory-file-name (expand-file-name directory)))
|
||||
(try expanded) new)
|
||||
new)
|
||||
(if (file-exists-p expanded)
|
||||
(error "Cannot create directory %s: file exists" expanded))
|
||||
;; Find the topmost nonexistent parent dir (variable `new')
|
||||
(while (and try (not (file-exists-p try)) (not (equal new try)))
|
||||
(setq new try
|
||||
try (directory-file-name (file-name-directory try))))
|
||||
(setq new (dired--find-topmost-parent-dir expanded))
|
||||
(make-directory expanded t)
|
||||
(when new
|
||||
(dired-add-file new)
|
||||
(dired-move-to-filename))))
|
||||
|
||||
;;;###autoload
|
||||
(defun dired-create-empty-file (file)
|
||||
"Create an empty file called FILE.
|
||||
Add a new entry for the new file in the Dired buffer.
|
||||
Parent directories of FILE are created as needed.
|
||||
If FILE already exists, signal an error."
|
||||
(interactive (list (read-file-name "Create empty file: ")))
|
||||
(let* ((expanded (expand-file-name file))
|
||||
new)
|
||||
(if (file-exists-p expanded)
|
||||
(error "Cannot create file %s: file exists" expanded))
|
||||
(setq new (dired--find-topmost-parent-dir expanded))
|
||||
(make-empty-file file 'parents)
|
||||
(when new
|
||||
(dired-add-file new)
|
||||
(dired-move-to-filename))))
|
||||
|
||||
(defun dired-into-dir-with-symlinks (target)
|
||||
(and (file-directory-p target)
|
||||
(not (file-symlink-p target))))
|
||||
|
|
|
@ -1802,6 +1802,9 @@ Do so according to the former subdir alist OLD-SUBDIR-ALIST."
|
|||
(define-key map [menu-bar immediate create-directory]
|
||||
'(menu-item "Create Directory..." dired-create-directory
|
||||
:help "Create a directory"))
|
||||
(define-key map [menu-bar immediate create-empty-file]
|
||||
'(menu-item "Create Empty file..." dired-create-empty-file
|
||||
:help "Create an empty file"))
|
||||
(define-key map [menu-bar immediate wdired-mode]
|
||||
'(menu-item "Edit File Names" wdired-change-to-wdired-mode
|
||||
:help "Put a Dired buffer in a mode in which filenames are editable"
|
||||
|
|
|
@ -5519,6 +5519,21 @@ raised."
|
|||
(dolist (dir create-list)
|
||||
(files--ensure-directory dir)))))))
|
||||
|
||||
(defun make-empty-file (filename &optional parents)
|
||||
"Create an empty file FILENAME.
|
||||
Optional arg PARENTS, if non-nil then creates parent dirs as needed.
|
||||
|
||||
If called interactively, then PARENTS is non-nil."
|
||||
(interactive
|
||||
(let ((filename (read-file-name "Create empty file: ")))
|
||||
(list filename t)))
|
||||
(when (and (file-exists-p filename) (null parents))
|
||||
(signal 'file-already-exists `("File exists" ,filename)))
|
||||
(let ((paren-dir (file-name-directory filename)))
|
||||
(when (and paren-dir (not (file-exists-p paren-dir)))
|
||||
(make-directory paren-dir parents)))
|
||||
(write-region "" nil filename nil 0))
|
||||
|
||||
(defconst directory-files-no-dot-files-regexp
|
||||
"^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*"
|
||||
"Regexp matching any file name except \".\" and \"..\".")
|
||||
|
|
Loading…
Add table
Reference in a new issue