Как мне создать пустой файл в Emacs? - PullRequest
60 голосов
/ 07 апреля 2010

Как я могу создать пустой файл из emacs, в идеале из буфера dired?

Например, я только что открыл модуль Python в режиме dired, создал новый каталог, открыл его в diredи теперь нужно добавить в каталог пустой файл __init__.py.

Если я использую C-x C-f __init__.py RET C-x C-s, тогда emacs не создаст файл, потому что в него не было внесено никаких изменений.Я должен был бы напечатать в файле, сохранить его, удалить мой набор текста, а затем сохранить его снова, чтобы это работало.

Спасибо

Ответы [ 15 ]

55 голосов
/ 07 апреля 2010

Вы можете использовать сенсорную команду:

M-! touch __init__.py RET
27 голосов
/ 08 апреля 2010

работают следующие работы:

C-x b __init__.py RET C-x C-w RET

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

Хитрость заключается в том, чтобы сначала создать пустой буфер, переключившись на имя, которое не существует. Затем запишите файл.

20 голосов
/ 07 апреля 2010

Если вы хотите, чтобы Emacs рассматривал все новые файлы как измененные, вы можете автоматизировать решение следующим образом:

(add-hook 'find-file-hooks 'assume-new-is-modified)
(defun assume-new-is-modified ()
  (when (not (file-exists-p (buffer-file-name)))
    (set-buffer-modified-p t)))
12 голосов
/ 07 апреля 2010

Emacs не позволит вам сохранить буфер, если он не думает, что содержимое изменилось. Самое быстрое, хотя, возможно, и не самое чистое, - открыть файл с помощью C-x C-f , затем нажать, скажем, пробел и клавишу Backspace, тогда вы сможете сохранить файл без содержимого.

Существуют и другие способы изменить флаг "буфер был изменен", но я не думаю, что есть что-то более легкое.

10 голосов
/ 23 мая 2014

Программно и без какой-либо зависимости от touch это довольно просто:

(with-temp-buffer (write-file "path/to/empty/file/"))
10 голосов
/ 19 сентября 2013

Вот адаптация dired-create-directory. Он работает таким же образом, поэтому, помимо простого имени файла, вы также можете указать новые родительские каталоги (которые будут созданы в текущем каталоге) для файла (например, foo/bar/filename).

(eval-after-load 'dired
  '(progn
     (define-key dired-mode-map (kbd "C-c n") 'my-dired-create-file)
     (defun my-dired-create-file (file)
       "Create a file called FILE.
If FILE already exists, signal an error."
       (interactive
        (list (read-file-name "Create file: " (dired-current-directory))))
       (let* ((expanded (expand-file-name file))
              (try expanded)
              (dir (directory-file-name (file-name-directory expanded)))
              new)
         (if (file-exists-p expanded)
             (error "Cannot create file %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))))
         (when (not (file-exists-p dir))
           (make-directory dir t))
         (write-region "" nil expanded t)
         (when new
           (dired-add-file new)
           (dired-move-to-filename))))))
6 голосов
/ 16 августа 2012

Используйте сенсорную команду.

M-! touch __init__.py RET
5 голосов
/ 02 августа 2018

После этой темы Emacs добавил две новые команды:

  1. сделать пустой-файл
  2. Dired создать пустой-файл

Эти команды будут доступны в выпуске emacs 27.1.

4 голосов
/ 02 декабря 2016

Кратчайший путь

M -! > __init__.py RET

3 голосов
/ 16 августа 2012

(shell-command (concat "touch " (buffer-file-name))) будет делать то, что вы хотите, если вы уже открыли пустой файл.

...