2010-04-07 2 views
56

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

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

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

Благодаря

+3

Я живу с этой тупиковой ситуации: Emacs мощный текстовый редактор, который может даже интегрировать компилятор Scala, и т.д., и т.д. ... но много раз очень простые вещи усложненной. Мне легче найти «touch/path/to/filename», а затем открыть его в Emacs, чем пытаться создать новый файл внутри Emacs, в частности, когда есть другой файл с тем же именем или даже с похожим именем. Emacs «пытается помочь мне», открывая неверный файл. Пожалуйста, не «старайся помочь мне!» ... просто сделай то, что я сказал тебе, что нужно сделать! Я почти уверен, что должен быть «плагин» (возможно, он был продлен), который делает это. Усложненный! еще раз! –

+0

@RichardGomes Уже несколько лет, используя решение phils, мне гораздо проще просто набрать «_», и он спрашивает у меня имя файла. Emacs определенно очень сложный, но я не думаю, что это слишком сложно. Многое из того, что я сделал с ним в течение последних 5 лет, заключалось в том, чтобы сделать его более сложным, а также избавиться от всех этих раздражающих углов. Я страдал от той же проблемы с завершением, что и вы, но это можно устранить, если вы можете позаботиться о том, чтобы потратить несколько лет на знакомство с системой. – Singletoned

+1

'C-x C-f __init__.py RET C-x C-s' отлично работает для меня (версия' 24.5.1'), поэтому, возможно, проблема была решена, поскольку этот вопрос изначально был задан. – Jian

ответ

9

Адаптация 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)))))) 
+3

Хотя я указал привязанную пользователем привязку в коде, я фактически привязал ее к '_', которая на моей раскладке клавиатуры представляет собой сдвинутую последовательность рядом с' + ', то есть ключи для« нового каталога »и« нового каталога », новый файл "в режиме ожидания находятся рядом друг с другом. – phils

+0

Я изменил это, чтобы быть ответом, поскольку это тот, который я использую в долгосрочной перспективе. – Singletoned

52

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

M-! touch __init__.py RET 
+1

@ offby1, если вы добавите это как правильный ответ, я выберу его, так как это тот, который лучше всего подходит для меня. Он даже использует все, что было в устаревших каталогах, в качестве cwd. – Singletoned

+1

Мне это тоже очень нравится! Мне просто не нравится печатать M-! бит, но я предполагаю, что могу изменить привязку клавиш :) – Vivi

11

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

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

20

Если вы хотите 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))) 
+0

Мне это нравится, и я думаю, что, вероятно, я все равно его установлю, потому что в общем случае это похоже на здравый смысл, но 'M-! touch __init __. py' короче и не требует открытия и закрытия буфера. – Singletoned

+0

Просто использовал это, спасибо! :) – Josh

+0

@Singletoned - вам не нужно вводить это каждый раз. Просто поместите его в файл инициализации, и каждый раз, когда вы создаете новый файл с 'C-x C-f', он будет отображаться в стиле dired. Это быстрее, чем набирать команду оболочки ('touch') каждый раз. – metakermit

26

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

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

Если вы в Dired буфер файл будут сохранены в каталоге.

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

+0

Этот метод велик, потому что он создает новый файл, предупреждает, существует ли он уже и заканчивается новым файлом в открытом буфере. Это соответствует 99% моих случаев использования. –

2

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

5

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

M-! touch __init__.py RET 
0

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

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

1

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

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

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

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

8

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

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

Это, AFAIC, является правильным ответом – yPhil

0

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

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

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

M-!> __init__.pyRET

+0

Это довольно умно и определенно короче, чем прикосновение. Хотя решение, которое я использую, это @phils, который делает его просто '_', за которым следует' __init __. Py'. – Singletoned

0

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