Подтвердить что ты не робот

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

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

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

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

Спасибо

4b9b3361

Ответ 1

Здесь приведена адаптация 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))))))

Ответ 2

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

M-! touch __init__.py RET

Ответ 3

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

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

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

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

Ответ 4

Если вы хотите, чтобы 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)))

Ответ 5

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

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

Ответ 6

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

(with-temp-buffer (write-file "path/to/empty/file/"))

Ответ 7

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

M-! touch __init__.py RET

Ответ 8

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

M-! > __init__.py RET

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

M-;                         ; Eval
(set-buffer-modified-p t)   ; Mark modified
C-x C-s                     ; Save buffer

Ответ 12

Я изменил ответ от 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.

Ответ 13

Лучший вариант:

(with-temp-file "filename"
  (insert ""))

Ответ 14

Я использую следующую привязку к t в dired.

(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))