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

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

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

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

Спасибо


person Singletoned    schedule 07.04.2010    source источник
comment
Я живу в этом тупике: Emacs - мощный текстовый редактор, который может даже интегрировать компилятор Scala и т. Д., И т. Д., Но во многих случаях очень простые вещи оказываются слишком сложными. Мне легче коснуться / path / to / filename, а затем открыть его в Emacs, чем пытаться создать новый файл внутри Emacs, в частности, когда есть другой файл с тем же именем или даже с похожим именем. Emacs пытается помочь мне открыть не тот файл. Пожалуйста, не пытайтесь мне помочь! ... просто делайте то, что я вам сказал, что должно быть сделано! Я почти уверен, что должен быть плагин (возможно, dired), который это делает. Слишком сложно! опять таки!   -  person Richard Gomes    schedule 25.06.2015
comment
@RichardGomes Пользуясь решением phils уже пару лет, мне намного проще просто ввести _, и он попросит меня указать имя файла. Emacs определенно очень сложен, но я не думаю, что это слишком сложно. Многое из того, что я сделал с ним за последние 5 лет, было сделано, чтобы усложнить его, а также сбрить все эти раздражающие углы. Я столкнулся с той же проблемой с завершением, что и вы, но это поправимо, если вы потратите несколько лет на знакомство с системой.   -  person Singletoned    schedule 26.06.2015
comment
C-x C-f __init__.py RET C-x C-s у меня отлично работает (версия 24.5.1), так что, возможно, проблема была решена с тех пор, как этот вопрос был задан изначально.   -  person Jian    schedule 16.07.2015
comment
Вы правы, похоже, это исправили. И что приятно, это работает где угодно, даже когда вы не в дреде. В эти дни я привязал C-x j к открытию dired, а затем _ для создания нового файла, который довольно короткий   -  person Singletoned    schedule 16.07.2015


Ответы (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))))))
person phils    schedule 19.09.2013
comment
Хотя я указал в коде привязку, зарезервированную пользователем, я фактически привязал ее к _, который на моей раскладке клавиатуры представляет собой смещенную последовательность рядом с +, что означает, что клавиши для нового каталога и нового файла в dired находятся рядом с друг друга. - person phils; 18.03.2014
comment
Я изменил это, чтобы быть ответом, так как это тот, который я использую в долгосрочной перспективе. - person Singletoned; 12.01.2015

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

M-! touch __init__.py RET
person Dani    schedule 07.04.2010
comment
@ offby1, если вы добавите это как правильный ответ, я выберу его, так как он лучше всего подходит для меня. Он даже использует любой каталог, в котором находится dired, как cwd. - person Singletoned; 07.04.2010
comment
Мне это тоже очень нравится! Я просто не люблю печатать М-! немного, но я думаю, что могу изменить привязку клавиш :) - person Vivi; 08.06.2010

The following works:

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

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

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

person slu    schedule 08.04.2010
comment
Этот метод хорош, потому что он создает новый файл, предупреждает, если он уже существует, и заканчивается новым файлом в открытом буфере. Это соответствует 99% моих вариантов использования. - person Timothy C. Quinn; 25.03.2014
comment
В моей настройке, если имя файла совпадает с другим именем в его истории буфера, то C-x b откроет этот файл вместо нового. Это удобно, за исключением случаев, когда вы хотите создать новый файл или у вас есть несколько файлов с одинаковым именем (init .py будет одним из них). - person Jacob Lee; 11.05.2021

Если вы хотите, чтобы 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)))
person Kilian Foth    schedule 07.04.2010
comment
Мне это нравится, и я думаю, что все равно установлю его, потому что в общем случае это кажется более разумным, но M-! touch __init__.py короче и не требует открытия и закрытия буфера. - person Singletoned; 07.04.2010
comment
@Singletoned - вам не нужно вводить это каждый раз. Просто поместите его в свой файл инициализации, и каждый раз, когда вы создаете новый файл с C-x C-f, он будет отображаться в dired. Это быстрее, чем каждый раз вводить команду оболочки (touch). - person metakermit; 03.12.2013

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

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

person Vatine    schedule 07.04.2010

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

(with-temp-buffer (write-file "path/to/empty/file/"))
person Joao Tavora    schedule 23.05.2014

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

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

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

person Tino    schedule 02.08.2018
comment
И это то, что make-empty-file использует для создания пустого файла: (write-region "" nil filename nil 0) - person Hubisan; 18.07.2019
comment
Годы (много лет) назад emacs Новая вкладка файла сделала именно это: Открытие окна без необходимости в имени файла. Хорошо, что они каким-то образом вернулись к этому (лучше! Imho) способу. - person Michael; 02.12.2019

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

M-! touch __init__.py RET
person Uchenna Nwanyanwu    schedule 16.08.2012

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

Создает пустой файл с помощью операции оболочки (но не открывает его):

М-! > __init__.py RET

Откройте новый файл:

C-x C-f RET

(Примечание: нам не нужно снова вводить имя, потому что новый файл автоматически выбирается первым)

person thanhpk    schedule 02.12.2016
comment
Это довольно умно и определенно короче, чем сенсорное управление. Хотя я использую решение @phils, что делает его просто _, за которым следует __init__.py. - person Singletoned; 02.12.2016

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

person Squidly    schedule 16.08.2012

В дополнение к другим ответам на странице вы можете использовать функцию f.el _ 2_:

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

person Mirzhan Irkegulov    schedule 18.03.2014


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

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

person alex_koval    schedule 06.08.2013

Оптимальным вариантом будет:

(with-temp-file "filename"
  (insert ""))
person Marcin Antczak    schedule 25.03.2016