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

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

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

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

Спасибо

62
задан 7 April 2010 в 15:49

11 ответов

Вот адаптация 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))))))
11
ответ дан 31 October 2019 в 13:27

Наилучший вариант был бы:

(with-temp-file "filename"
  (insert ""))
0
ответ дан 31 October 2019 в 13:27

Я изменил ответ от MrBones и создал пользовательскую функцию с привязкой клавиш:

; create empty __init__.py at the place
(defun create-empty-init-py()
  (interactive)
  (shell-command "touch __init__.py")
)
(global-set-key (kbd "C-c p i") 'create-empty-init-py)

Это очень полезно для не проведения времени на повторяющемся действии создания init.py везде в новой папке проекта Python.

0
ответ дан 31 October 2019 в 13:27

Я использую следующее, связанное с t в сушеном.

(defun my-dired-touch (filename)
  (interactive (list (read-string "Filename: " ".gitkeep")))
  (with-temp-buffer
    (write-file filename)))

;; optionally bind it in dired
(with-eval-after-load 'dired
  (define-key dired-mode-map "t" 'my-dired-touch))
1
ответ дан 31 October 2019 в 13:27

Можно отметить пустой буфер, как изменено путем выполнения set-buffer-modified-p . Затем при сохранении его Emacs запишет файл.

M-;                         ; Eval
(set-buffer-modified-p t)   ; Mark modified
C-x C-s                     ; Save buffer
1
ответ дан 31 October 2019 в 13:27

В дополнение к другим ответам на странице можно использовать f.el функция f-touch :

M-: (f-touch "__init__.py") RET

2
ответ дан 31 October 2019 в 13:27

Самый короткий путь

M-! > __init__.py RET

4
ответ дан 31 October 2019 в 13:27

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

3
ответ дан 31 October 2019 в 13:27

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

M-! touch __init__.py RET
6
ответ дан 31 October 2019 в 13:27

Programatically и без любой зависимости от touch, это довольно легко:

(with-temp-buffer (write-file "path/to/empty/file/"))
10
ответ дан 31 October 2019 в 13:27

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

  1. make-empty-file
  2. dired-create-empty-file

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

6
ответ дан 31 October 2019 в 13:27

Другие вопросы по тегам:

Похожие вопросы: