回答:
Steve Yeggeの.emacsからこの関数を試してください。
;; ソース:http://steve.yegge.googlepages.com/my-dot-emacs-file (defun rename-file-and-buffer(new-name) 「現在のバッファとそれがNEW-NAMEにアクセスしているファイルの両方の名前を変更します。」 (インタラクティブ「s新しい名前:」) (let((name(buffer-name)) (ファイル名(バッファファイル名))) ((ファイル名ではない場合) (メッセージ「バッファ '%s'はファイルを訪問していません!」の名前) (if(get-buffer new-name) (メッセージ「「%s」という名前のバッファはすでに存在します!」新しい名前) (予測 (名前変更ファイルファイル名新しい名前1) (名前変更バッファの新しい名前) (set-visited-file-name new-name) (set-buffer-modified-p nil)))))))
そのページを見てください。「move-buffer-file」と呼ばれる、本当に便利な関連関数がもう1つあります。
(set-buffer-modified-p nil)
不要のようです。rename-file-and-buffer
変更されたバッファーを呼び出してからそれを強制終了しようとした場合、保存されていない変更について警告せずに喜んでそれを行います。
はい、dired
モードでは次のことができます。
C-x d
diredを開くRET
現在のファイルのディレクトリを選択するC-x C-j
(dired-jump
現在のファイル名に、Diredで)R
ファイルの名前を変更します(またはdired-do-rename
)。q
(名前を変更した)ファイルバッファーに戻る名前の変更はシェルと同等ですが、mv
開いているバッファも更新mv
します。ファイルシステムのファイルのアクセス時間と変更時間は変更されません。
C-x C-j
私にとっては、デフォルトではバインドされていません。こうM-x load-library RET dired-x RET
最初は、それがバインドされます。
C-x C-j
バインドされていない場合の別の選択肢はM-x dired-jump
、初めて実行することです。自動的に読み込まれますdired-x
(これによりC-x C-j
、この時点から定義されます)。
完全を期すために、Emacsの「名前を付けて保存」機能、つまり開いているファイルのCx Cwに対する答えが得られると思ってこのページにアクセスする人もいるので、
File > Save as...
私のお気に入りはMagnarsからのものです(emacs rocksスクリーンキャストの名声です)。
他の選択肢とは異なり、名前を最初から入力する必要はありません。現在の名前を変更する必要があります。
(defun rename-current-buffer-file ()
"Renames current buffer and file it is visiting."
(interactive)
(let* ((name (buffer-name))
(filename (buffer-file-name))
(basename (file-name-nondirectory filename)))
(if (not (and filename (file-exists-p filename)))
(error "Buffer '%s' is not visiting a file!" name)
(let ((new-name (read-file-name "New name: " (file-name-directory filename) basename nil basename)))
(if (get-buffer new-name)
(error "A buffer named '%s' already exists!" new-name)
(rename-file filename new-name 1)
(rename-buffer new-name)
(set-visited-file-name new-name)
(set-buffer-modified-p nil)
(message "File '%s' successfully renamed to '%s'"
name (file-name-nondirectory new-name)))))))
正しいバージョンのJames Yangに感謝します。
これがsteveyから採用されたより堅牢なバージョンです。
;; Originally from stevey, adapted to support moving to a new directory.
(defun rename-file-and-buffer (new-name)
"Renames both current buffer and file it's visiting to NEW-NAME."
(interactive
(progn
(if (not (buffer-file-name))
(error "Buffer '%s' is not visiting a file!" (buffer-name)))
;; Disable ido auto merge since it too frequently jumps back to the original
;; file name if you pause while typing. Reenable with C-z C-z in the prompt.
(let ((ido-auto-merge-work-directories-length -1))
(list (read-file-name (format "Rename %s to: " (file-name-nondirectory
(buffer-file-name))))))))
(if (equal new-name "")
(error "Aborted rename"))
(setq new-name (if (file-directory-p new-name)
(expand-file-name (file-name-nondirectory
(buffer-file-name))
new-name)
(expand-file-name new-name)))
;; Only rename if the file was saved before. Update the
;; buffer name and visited file in all cases.
(if (file-exists-p (buffer-file-name))
(rename-file (buffer-file-name) new-name 1))
(let ((was-modified (buffer-modified-p)))
;; This also renames the buffer, and works with uniquify
(set-visited-file-name new-name)
(if was-modified
(save-buffer)
;; Clear buffer-modified flag caused by set-visited-file-name
(set-buffer-modified-p nil)))
(setq default-directory (file-name-directory new-name))
(message "Renamed to %s." new-name))
これは別のバージョンで、かなり堅牢でVCに対応しています。
(defun rename-file-and-buffer ()
"Rename the current buffer and file it is visiting."
(interactive)
(let ((filename (buffer-file-name)))
(if (not (and filename (file-exists-p filename)))
(message "Buffer is not visiting a file!")
(let ((new-name (read-file-name "New name: " filename)))
(cond
((vc-backend filename) (vc-rename-file filename new-name))
(t
(rename-file filename new-name t)
(set-visited-file-name new-name t t)))))))
詳細については、こちらをご覧ください。
Spacemacsを使用している場合rename-current-buffer-file
、デフォルトでにバインドされている(マグナーに基づく)の実装が付属しているため、この動作は無料ですSPC-f-R
。
非常に簡単な方法は、コマンドを押し、ありはMxとタイプよりも、VC-名前変更・ファイルを使用すると、ディレクトリだけであなたの現在のファイルを選択する必要があり、新しい名前を選ぶよりも、その後、。変更されたファイルがあるバフが更新されます。
出典:https : //www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
magnarsバージョンに基づいて、以下のように変更し、INITファイル名の部分を修正しました。
(defun rename-current-buffer-file ()
"Renames current buffer and file it is visiting."
(interactive)
(let* ((name (buffer-name))
(filename (buffer-file-name))
(basename (file-name-nondirectory filename)))
(if (not (and filename (file-exists-p filename)))
(error "Buffer '%s' is not visiting a file!" name)
(let ((new-name (read-file-name "New name: " (file-name-directory filename) basename nil basename)))
(if (get-buffer new-name)
(error "A buffer named '%s' already exists!" new-name)
(rename-file filename new-name 1)
(rename-buffer new-name)
(set-visited-file-name new-name)
(set-buffer-modified-p nil)
(message "File '%s' successfully renamed to '%s'"
name (file-name-nondirectory new-name)))))))
コピーで実現できます。ファイルでshift + cを押すと、emacsはファイル名を含むパスの名前を示すように要求するので、新しい名前を入力して入力するだけです...もちろん、以前の名前を削除する必要があります。
(setq uniquify-buffer-name-style 'forward)
名前が付けられたバッファがある場合users\index.html
(既に別のバッファがあるためposts\index.html
)名前の変更が失敗する場合の意味と互換性がありません