Как создать новый файл в режиме dired?

Я хочу создать новый файл в режиме dired. Есть ли в dired-режиме команда "создать новый файл"? Например, когда я набираю «c» в режиме dired, создается «untitled.txt». Это очень просто, но я не могу его найти.


person Kei Minagawa    schedule 30.11.2013    source источник
comment
Я не хочу набирать C-x C-f. Я хочу более простой способ.   -  person Kei Minagawa    schedule 30.11.2013
comment
Что произойдет, если untitled.txt уже существует? Просто поверьте мне, что эта проблема решена и C-x C-f самый простой способ   -  person abo-abo    schedule 30.11.2013
comment
untitled2.txt должен быть создан.   -  person Kei Minagawa    schedule 30.11.2013
comment
Поэтому команда создания нового файла не предусмотрена. Но я хочу завершить операцию, связанную с файлом, в режиме dired.   -  person Kei Minagawa    schedule 30.11.2013
comment
Я использовал эту функцию несколько недель. И я заметил, что стираю untitled.txt, а затем ввожу новое имя файла. Стирание - пустая трата времени. В конце концов, я использую C-x C-f, как вы сказали. Спасибо abo-abo.   -  person Kei Minagawa    schedule 14.01.2014
comment
@ abo-abo, это не так уж и глупо. Почему я должен нажимать две клавиши с префиксом, которые переключат меня на ненужный буфер, когда все, что я хочу, - это создать файл (а не переключаться на него). В режиме, посвященном одноклавишным функциям справочника, не меньше. Должен быть touch аналог в dired, согласитесь   -  person Dodgie    schedule 30.01.2017
comment
Я нахожу поразительным, что редактор каталогов (dired) / файловый менеджер не имеет встроенных средств для создания пустых файлов.   -  person Jacob Lee    schedule 11.05.2021


Ответы (6)


Просто нажмите C-x C-f. Это запросит имя файла, используя текущий каталог текущего буфера в качестве каталога, в который его нужно поместить. Для управляемого буфера его текущий каталог - это просто каталог, на который вы смотрите.

person Robin Green    schedule 30.11.2013
comment
У меня это не работает. Что касается меня, когда я делаю C-x, C-f, я получаю приглашение найти файл. Я ввожу новое имя файла. Я получаю File does not exist, create buffer? Я выбираю y. Я получаю новый БУФЕР с указанным мной именем файла. Однако, если я оставлю буфер пустым, тогда, когда я сделаю C-x C-w, он снова предложит мне ввести имя файла, и я вернусь к тому, с чего начал. Другими словами, этот метод заставляет меня вводить имя файла дважды. Предполагая, что я просто хочу создать файл, но не вводить текст, есть ли способ обойти это? - person incandescentman; 20.08.2015
comment
Оболочка M-x и в оболочке типа touch filename. Это работает только в системах, отличных от Windows, и только в том случае, если у вас еще нет открытой оболочки внутри Emacs. - person Robin Green; 20.08.2015
comment
@incandescentman: Поскольку emacs старается не создавать пустой файл, Emacs подтверждает, что вы действительно хотите создать пустой файл. Вот почему вам нужно подробное подтверждение. Чтобы этого избежать, вам нужно изменить буфер. Например, введите, а затем удалите его из буфера. Или elisp здесь, что угодно. - person Kei Minagawa; 24.08.2015

Если вы хотите, чтобы c в режиме Dired выполнял то же самое, что и C-x C-f, ответ будет тривиальным:

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

Или, если вы хотите, чтобы он имел имя untitled.txt, тогда:

(define-key dired-mode-map "c"
  (lambda () (interactive) (find-file "untitled.txt")))
person Drew    schedule 30.11.2013
comment
Пришлось завернуть в (with-eval-after-load 'dired ...) - person Jay; 29.09.2016
comment
да, здесь то же самое. если не упакован, вы получите сообщение об ошибке - Значение символа как переменной недействительно: dired-mode-map - person Kirill Yunussov; 31.03.2019

Спасибо всем, Я наконец решил это сам. Вот мой ответ. Ввод «c» в режиме dired предложит вам создать новый безымянный файл. Затем нажмите Enter, чтобы создать новый безымянный файл. Да, это очень подробный код. Кто-то может это исправить.

(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))
       )
     )
  )
person Kei Minagawa    schedule 01.12.2013

  1. нажмите C-x C-f
  2. введите имя файла
  3. нажмите C-j

после вышеуказанных шагов emacs создаст пустой буфер с введенным вами именем. Но emacs не поддерживает создание пустых файлов по умолчанию. Вы можете обратиться к Как мне создать пустой файл в emacs для получения дополнительных идей

person user3113626    schedule 06.12.2016

Следующее содержит две (2) опции, одна из которых требует, чтобы touch находился в $PATH - в качестве альтернативы можно использовать абсолютный путь. touch обычно доступен в системах типа unix, например, OSX и т. Д. Эта функция будет автоматически последовательно нумеровать файлы / буферы - например, untitled.txt; untitled1.txt; untitled2.txt и т. д.

(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.")) )) ))
person lawlist    schedule 30.11.2013
comment
Теперь я понимаю, о чем вы. Из этого кода я могу узнать много полезных советов по emacs. Спасибо. - person Kei Minagawa; 28.02.2014

Если вы хотите ввести имя файла, то я думаю, что это дубликат:

Как создать пустой файл в emacs?

Если вы не хотите вводить имя файла, вы все равно можете использовать некоторые из этих ответов и легко адаптировать другие, жестко закодировав имя, а не запрашивая его в интерактивном режиме.

person phils    schedule 30.11.2013
comment
Да!! Вот и все. Ваш код очень полезен. Я использовал некоторые функции в вашем коде. Большое Вам спасибо. - person Kei Minagawa; 01.12.2013
comment
Это единственное решение, которое действительно сработало так, как я хотел. - person incandescentman; 29.02.2016