Programing

Emacs에서 열린 파일의 이름을 바꾸려면 어떻게해야합니까?

lottogame 2020. 4. 15. 10:22
반응형

Emacs에서 열린 파일의 이름을 바꾸려면 어떻게해야합니까?


Emacs에서 열린 파일의 이름을 바꾸는 방법이 있습니까? 내가 보는 동안? 다른 이름으로 저장과 같은 것이지만 원래는 사라져야합니다.


Steve Yegge의 .emacs 에서이 기능을 사용해보십시오 .

;; 출처 : http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun 이름 바꾸기 파일 및 버퍼 (새 이름)
  "현재 버퍼와 NEW-NAME을 방문하는 파일의 이름을 모두 바꿉니다."
  (대화식 "새 이름 :")
  ((((이름 (버퍼 이름)))
        (파일 이름 (버퍼 파일 이름)))
    (파일 이름이 아닌 경우)
        ( "버퍼 '% s'은 (는) 파일을 방문하지 않습니다!"메시지)
      (만약 (get-buffer new-name)
          ( " '% s'버퍼가 이미 존재합니다!"메시지)
        (프론
          (이름 바꾸기 파일 이름 new-name 1)
          (버퍼 이름 변경)
          (방문 파일 이름 new-name)
          (버퍼-수정 -p nil))))))))

해당 페이지를 살펴보면 "move-buffer-file"이라는 또 다른 유용한 관련 기능이 있습니다.


예, dired모드를 사용하면 다음을 수행 할 수 있습니다.

  • C-x d 찢어지다
  • RET 현재 파일의 디렉토리를 선택
  • C-x C-j( dired-jump현재 파일 이름에 Dired로 표시)
  • R파일 이름을 바꿉니다 (또는 dired-do-rename).
  • q (이름이 바뀐) 파일 버퍼로 돌아가려면

이름 바꾸기는 shell과 동일 mv하지만 열린 버퍼도 업데이트 mv하며 파일 시스템의 파일에 대한 액세스 및 수정 시간을 변경하지 않습니다.


완전성을 위해 일부 사람들은이 페이지를 방문하여 Emacs의 "다른 이름으로 저장"기능에 대한 답변을 얻을 것이라고 생각합니다. 즉, 열린 파일의 경우 Cx Cw입니다.


내가 가장 좋아하는 것은 Magnars ( emacs rock screencasts fame)의 것입니다.

다른 대안과 달리 처음부터 이름을 입력하지 않아도됩니다. 현재 이름을 수정할 수 있습니다.

(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)))))))

자세한 내용은 여기를 참조 하십시오 .


Mx 명령을 누르고 vc-rename-file 유형보다 훨씬 쉬운 방법이 있습니다. 그런 다음 디렉토리에서 현재 파일을 선택하고 새 이름을 선택하면됩니다. 변경된 파일이있는 버프가 새로 고쳐집니다.

출처 : 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)))))))

Spacemacs사용하는 경우 rename-current-buffer-file기본적으로에 바인딩 된 (magnars 기반) 구현이 제공 되므로이 동작은 무료 SPC-f-R입니다.

https://github.com/syl20bnr/spacemacs/blob/bd7ef98e4c35fd87538dd2a81356cc83f5fd02f3/layers/%2Bdistributions/spacemacs-base/funcs.el#L294


복사하여 얻을 수 있습니다. 파일에서 shift + c를 누르면 emacs는 파일 이름을 포함한 경로의 이름을 표시하도록 요청하므로 새 이름을 제공하고 입력하십시오. 물론 이전 이름을 삭제해야합니다.

참고 URL : https://stackoverflow.com/questions/384284/how-do-i-rename-an-open-file-in-emacs

반응형