Kei Minagawa
Kei Minagawa

Reputation: 4521

How to create new file from dired mode?

I want to create a new file in dired mode. Is there "create new file" command in dired mode ? For example, When I type "c" in dired mode, it creates "untitled.txt". It's very simple , but I can't find it.

Upvotes: 64

Views: 44492

Answers (7)

Julian
Julian

Reputation: 1012

The answers are slightly outdated in that there now IS a command to do this in emacs:

dired-create-empty-file

See: [[info:emacs#Misc Dired Features]]

Upvotes: 1

user3113626
user3113626

Reputation: 699

  1. press C-x C-f
  2. enter file name
  3. press C-j

after the above steps, emacs will create an empty buffer with the name you input. But emacs doesn't support to create empty file by default. You can refer to How do I create an empty file in emacs for more ideas

Upvotes: 13

Kei Minagawa
Kei Minagawa

Reputation: 4521

Thanks to all, I finally solved it myself. Here is my answer. Typing "c" in dired mode will prompt you creating new untitled file. Then press enter will create new untitled file. Yes it's very verbose code. Someone may fix it.

(eval-after-load 'dired
  '(progn
     (define-key dired-mode-map (kbd "c") 'my-dired-create-file)
     (defun create-new-file (file-list)
       (defun exsitp-untitled-x (file-list cnt)
         (while (and (car file-list) (not (string= (car file-list) (concat "untitled" (number-to-string cnt) ".txt"))))
           (setq file-list (cdr file-list)))
         (car file-list))

       (defun exsitp-untitled (file-list)
         (while (and (car file-list) (not (string= (car file-list) "untitled.txt")))
           (setq file-list (cdr file-list)))
         (car file-list))

       (if (not (exsitp-untitled file-list))
           "untitled.txt"
         (let ((cnt 2))
           (while (exsitp-untitled-x file-list cnt)
             (setq cnt (1+ cnt)))
           (concat "untitled" (number-to-string cnt) ".txt")
           )
         )
       )
     (defun my-dired-create-file (file)
       (interactive
        (list (read-file-name "Create file: " (concat (dired-current-directory) (create-new-file (directory-files (dired-current-directory))))))
        )
       (write-region "" nil (expand-file-name file) t) 
       (dired-add-file file)
       (revert-buffer)
       (dired-goto-file (expand-file-name file))
       )
     )
  )

Upvotes: 11

lawlist
lawlist

Reputation: 13467

The following contains two (2) options, one of which requires that touch be in the $PATH -- alternatively, the absolute path may be used. touch is usually available on unix flavor systems, e.g., OSX, etc. This function will automatically number the files / buffers successively -- e.g., untitled.txt; untitled1.txt; untitled2.txt, etc.

(define-key dired-mode-map (kbd "c") 'dired-new-file)

(defun dired-new-file ()
(interactive)
  (let* (
      (n 0)
      lawlist-filename
      (dired-buffer-name (buffer-name)))
    (catch 'done
      (while t
        (setq lawlist-filename (concat "untitled"
          (if (= n 0) "" (int-to-string n))
            ".txt"))
        (setq n (1+ n))
        (if (not (file-exists-p lawlist-filename))
          (throw 'done nil)) ))
    (message "[b]uffer + file (maybe) | [f]ile + buffer (maybe)")
    (let ((file-or-buffer (read-char-exclusive)))
      (cond
        ((eq file-or-buffer ?b)
          (switch-to-buffer (get-buffer-create lawlist-filename))
          (text-mode)
          (or (y-or-n-p (format "Save Buffer `%s'? "lawlist-filename))
            (error "Done."))
          (write-file lawlist-filename)
          (with-current-buffer dired-buffer-name
            (revert-buffer)))
        ((eq file-or-buffer ?f)
          (start-process "touch-file" nil "touch" lawlist-filename)
          (revert-buffer)
          (or (y-or-n-p (format "Open `%s'? "lawlist-filename))
            (error "Done."))
          (find-file lawlist-filename)
          (text-mode))
        (t (message "You have exited the function.")) )) ))

Upvotes: 5

Drew
Drew

Reputation: 30708

If you want c in Dired mode to do what C-x C-f does, the answer is trivial:

(define-key dired-mode-map "c" 'find-file)

Or if you want it to have the name untitled.txt then:

(define-key dired-mode-map "c"
  (lambda () (interactive) (find-file "untitled.txt")))

Upvotes: 34

phils
phils

Reputation: 73345

If you want to enter the filename, then I think this is a duplicate of:

How do I create an empty file in emacs?

If you don't want to enter the filename, you could still use some of those answers, and easily adapt others by hard-coding the name rather than prompting for it interactively.

Upvotes: 3

Robin Green
Robin Green

Reputation: 33093

Just press C-x C-f. This will prompt for a filename, using the current directory of the current buffer as the directory to put it in. For a dired buffer, its current directory is simply the directory you are looking at.

Upvotes: 62

Related Questions