How to create new file from dired mode?

前端 未结 6 1266
眼角桃花
眼角桃花 2021-02-06 20:52

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

相关标签:
6条回答
  • 2021-02-06 20:54

    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")))
    
    0 讨论(0)
  • 2021-02-06 20:59
    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

    0 讨论(0)
  • 2021-02-06 21:02

    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))
           )
         )
      )
    
    0 讨论(0)
  • 2021-02-06 21:04

    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.

    0 讨论(0)
  • 2021-02-06 21:04

    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.

    0 讨论(0)
  • 2021-02-06 21:09

    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.")) )) ))
    
    0 讨论(0)
提交回复
热议问题