Câu trả lời:
Hãy thử chức năng này từ .emacs của Steve Yegge :
;; nguồn: http://steve.yegge.googlepages.com/my-dot-emacs-file (defun đổi tên tập tin và bộ đệm (tên mới) "Đổi tên cả bộ đệm hiện tại và tệp mà nó đang truy cập vào TÊN MỚI." (tương tác "tên mới:") (hãy ((tên (tên đệm)) (tên tệp (tên tệp đệm))) (nếu (không phải tên tệp) (thông báo "Bộ đệm '% s' không truy cập tệp!" tên) (nếu (tên đệm get-đệm) (thông báo "Bộ đệm có tên '% s' đã tồn tại!" tên mới) (tiên lượng (đổi tên tập tin tên mới 1) (đổi tên bộ đệm-tên mới) (set-visit-file-name new name) (bộ-đệm-sửa đổi-p nil)))))))
Hãy xem trang đó, có một chức năng liên quan thực sự hữu ích khác ở đó, được gọi là "move-buffer-file".
(set-buffer-modified-p nil)
dường như không cần thiết Nếu bạn gọi rename-file-and-buffer
một bộ đệm đã sửa đổi và sau đó cố gắng giết nó, nó sẽ vui vẻ làm điều đó mà không cảnh báo bạn về những thay đổi chưa được lưu.
Có, với dired
chế độ, bạn có thể:
C-x d
để mở diredRET
để chọn thư mục của tập tin hiện tạiC-x C-j
( dired-jump
theo tên của tệp hiện tại, trong Dired)R
để đổi tên tập tin (hoặc dired-do-rename
).q
để quay lại bộ đệm tệp (đã đổi tên)Việc đổi tên tương đương với trình bao mv
, nhưng nó cũng sẽ cập nhật bất kỳ bộ đệm mở nào và không giống như mv
nó sẽ không thay đổi quyền truy cập và sửa đổi thời gian trên tệp trong hệ thống tệp.
C-x C-j
không bị ràng buộc bởi mặc định cho tôi. Làm M-x load-library RET dired-x RET
đầu tiên làm cho nó bị ràng buộc.
C-x C-j
không liên kết chỉ là thực hiện M-x dired-jump
lần đầu tiên. Nó sẽ tự động tải dired-x
(điều này cũng sẽ C-x C-j
được xác định từ thời điểm này trở đi).
Để hoàn thiện, vì một số người có thể truy cập trang này với suy nghĩ họ sẽ nhận được câu trả lời cho tính năng "lưu dưới dạng" của Emacs, đó là Cx Cw cho một tệp đang mở.
File > Save as...
Yêu thích của tôi là một từ Magnars (của đá emacs screencasts danh tiếng.)
Không giống như các lựa chọn thay thế khác, bạn không phải gõ tên từ đầu - bạn có được tên hiện tại để sửa đổi.
(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)))))))
Cảm ơn James Yang cho một phiên bản chính xác.
Đây là một phiên bản mạnh mẽ hơn được điều chỉnh từ 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))
Đây là một phiên bản khác, đó là khá mạnh mẽ và nhận thức được 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)))))))
Bạn có thể đọc thêm về nó ở đây .
Nếu bạn đang sử dụng Spacemac thì bạn sẽ có được hành vi này miễn phí vì nó đi kèm với việc triển khai rename-current-buffer-file
(dựa trên các nam châm) mà theo mặc định ràng buộc SPC-f-R
.
Có một cách rất dễ dàng, bạn nhấn lệnh Mx và hơn gõ vc-rename-file , sau đó bạn chỉ cần chọn tệp hiện tại của mình trong thư mục, và chọn tên mới. Các buff có tập tin thay đổi sẽ được làm mới.
Nguồn: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html
dựa trên phiên bản phóng đại, tôi đã sửa đổi như dưới đây, đã sửa phần tên tệp 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)))))))
Nó có thể đạt được bằng bản sao. shift + c trên tệp và emacs sẽ yêu cầu bạn biểu thị tên cho đường dẫn bao gồm tên tệp, vì vậy bạn chỉ cần cung cấp tên mới và nhập ... tất nhiên, bạn phải Xóa tên cũ.
(setq uniquify-buffer-name-style 'forward)
ý nghĩa nếu bạn có bộ đệm được đặt tênusers\index.html
(vì bạn đã có bộ đệm khác choposts\index.html
) việc đổi tên sẽ thất bại