Emacsから、理想的にはdiredバッファー内から空のファイルを作成するにはどうすればよいですか?
たとえば、Pythonモジュールをdiredモードで開き、新しいディレクトリを作成し、diredで開いた後、ディレクトリに空の___init__.py
_ファイルを追加する必要があります。
_C-x C-f __init__.py RET C-x C-s
_を使用すると、変更が加えられていないため、emacsはファイルを作成しません。ファイルを入力し、保存し、入力を削除してから、再度保存する必要があります。
ありがとう
これは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))))))
Touchコマンドを使用できます。
M-! touch __init__.py RET
次の作品:
C-x b __init__.py RET C-x C-w RET
保存されたバッファにいる場合、ファイルはここに表示されているディレクトリに保存されます。
トリックは、最初に存在しない名前に切り替えることで空のバッファーを作成することです。次に、ファイルを書き出します。
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、次に(たとえば)スペースとバックスペースを押すと、内容のないファイルを保存できるはずです。
「バッファが変更されました」フラグを変更する方法は他にもありますが、もっと簡単な方法はないと思います。
プログラムでtouch
に依存せずに、非常に簡単です:
(with-temp-buffer (write-file "path/to/empty/file/"))
このスレッドの後、Emacsは2つの新しいコマンドを追加しました:
これらのコマンドは、emacs 27.1リリースで使用可能になります。
タッチコマンドを使用します。
M-! touch __init__.py RET
最短の方法
M-! > __init__.py
RET
(Shell-command (concat "touch " (buffer-file-name)))
は、空のファイルを既に開いている場合、必要な処理を行います。
Diredの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))
set-buffer-modified-p
を実行することにより、空のバッファーを変更済みとしてマークできます。それを保存すると、Emacsはファイルを書き込みます。
M-; ; Eval
(set-buffer-modified-p t) ; Mark modified
C-x C-s ; Save buffer
最適なオプションは次のとおりです。
(with-temp-file "filename"
(insert ""))
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)
これは、新しいPythonプロジェクトフォルダーのどこでもinit。pyを作成するという繰り返しのアクションに時間を費やさないために非常に便利です。