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



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



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



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



спасибо

585   15  

15 ответов:

вот адаптация 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))))))

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

M-! touch __init__.py RET

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

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

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

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

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

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

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

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

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

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

M-! touch __init__.py RET

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

м-!> __init__.pyRET

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

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

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

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

  1. make-empty-file
  2. дирэд-создать пустой файл

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

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

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

Я использую следующую привязку к 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))

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

лучшим вариантом будет:

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

Comments

    Ничего не найдено.