Emacs'ta açık bir dosyayı nasıl yeniden adlandırabilirim?


237

Emacs'ta açık bir dosyayı yeniden adlandırmanın bir yolu var mı? Ben görüntülerken? Farklı kaydet gibi bir şey, ama orijinal olan gitmeli.

Yanıtlar:


88

Bu işlevi Steve Yegge'nin .emac'lerinden deneyin :

;; kaynak: http://steve.yegge.googlepages.com/my-dot-emacs-file
(defun rename-dosya-ve-buffer (yeni ad)
  "Hem mevcut arabelleği hem de ziyaret ettiği dosyayı NEW-NAME olarak yeniden adlandırır."
  (etkileşimli "sYeni ad:")
  (let ((ad (arabellek adı))
        (dosya adı (buffer-file-name)))
    (eğer (dosya adı değil)
        ("Tampon '% s' bir dosyayı ziyaret etmiyor!" adı)
      (eğer (get-buffer yeni adı)
          ("% s 'adlı bir arabellek zaten var!" yeni adı)
        (progn
          (yeniden adlandırma dosyası dosya adı yeni ad 1)
          (yeniden adlandır-arabellek yeni adı)
          (ziyaret edilen dosya adı yeni adı)
          (set-buffer-değiştirilmiş-p nil))))))

O sayfaya bir bakın, burada "move-buffer-file" adı verilen gerçekten yararlı bir işlevin daha var.


1
Not: (setq uniquify-buffer-name-style 'forward)arabellek adında users\index.html(zaten başka bir arabelleğe sahip olduğunuz için posts\index.html)
isminiz

(set-buffer-modified-p nil)gereksiz görünüyor. rename-file-and-bufferDeğiştirilmiş bir arabellek çağırdı ve sonra öldürmeye çalıştıysanız, kaydedilmemiş değişiklikler hakkında sizi uyarmadan bunu mutlu bir şekilde yapar.
roldugin

Bu işlev ayrıca (biraz can sıkıcı bir şekilde) , geçerli ara belleğin bir dosyayla ilişkili olup olmadığını kontrol etmeden önce sizden yeni bir ad isteyecektir (bu durumda iptal edilir).
Thomas

338

Evet, diredmod ile şunları yapabilirsiniz:

  • C-x d dirsek açmak
  • RET geçerli dosyanın dizinini seçmek için
  • C-x C-j( dired-jumpGeçerli dosyanın adı için Dired'de)
  • Rdosyayı (veya dired-do-rename) yeniden adlandırmak için .
  • q (yeniden adlandırılmış) dosya arabelleğine dönmek için

Yeniden adlandırma bir kabuğa eşdeğerdir mv, ancak açık arabellekleri de güncelleştirir ve aksine mvdosya sistemindeki dosyadaki erişimi ve süreleri değiştirmez.


9
Bu, geçerli dosyayı doğrudan yeniden adlandırmıyor.
pupeno

4
Cx b ve tekrar orijinal arabellekte. Bunu yapmak için bir Elisp işlevi yazabilirsiniz, ancak bununla birlikte birçok tuş vuruşunu kaydedeceğinizden şüpheliyim.
Chris Conway

6
Ayrıca, Cx b yerine, orijinal arabelleğe geri dönmek için Cx k tuşuna basabilirsiniz.
Yoo

32
C-x C-jBenim için varsayılan olarak bağlı değildir. Yapma M-x load-library RET dired-x RETöncelikle bağlı hale getirir.
ntc2

4
C-x C-jBağlanmamışsa başka bir alternatif sadece M-x dired-jumpilk kez yapmaktır . Otomatik olarak yüklenir dired-x( C-x C-jbu noktadan itibaren tanımlanmasına da neden olur ).
Fernando Basso

120

Tamlık için, bazı insanlar bu sayfayı ziyaret ederek Emacs'ın "farklı kaydet" özelliği için bir cevap alacaklarını düşünüyorlar, bu açık bir dosya için Cx Cw.


Cx Cw veya menüyü kullanınFile > Save as...
Yoo

Tam olarak "farklı kaydet" değil, çünkü düzenlemekte olduğunuz dosya orijinal dosya olmaya devam edecektir.
asmeurer

11
@asmeurer Yanılıyorsunuz! Kaydettikten sonra yeni dosyayı düzenleyeceksiniz.
Joel G Mathew

3
Tekrar, neden yorumları düşürmek için bir özellik yok ?!
bearfriend

7
Belki de asmeurer, "düzenlediğiniz [dosya] hala [var]" anlamına geliyordu. O zaman, bu doğru mu? Kontrol ederdim, ama sonra yorumumu küçümseyemezsin, hahaha.
Brady Trainor

25

En sevdiğim Magnars'tan ( emacs rocks screencasts şöhreti).

Diğer alternatiflerin aksine, adı sıfırdan yazmak zorunda değilsiniz - değiştirilecek geçerli adı alırsınız.

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

Doğru sürüm için James Yang'a teşekkürler.


Bu düzgün çalışmıyor. Bu dosyanın sonuna bir "/" ekler.
mythicalcoder

2
Bunu bana gönderdiğin için teşekkürler. SO yolu cevapları düzeltmek, yeni, biraz değiştirilmiş cevaplar göndermektir.
Unfun Cat

15

İşte stevey'den uyarlanmış daha sağlam bir sürüm.

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

Güzel bir. Şimdi fonksiyonlarımı soğutuyorum. El.
Felix

11

İşte oldukça sağlam ve VC farkında olan başka bir sürüm:

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

Burada daha fazla bilgi edinebilirsiniz .



4

Çok kolay bir yol var, Mx komutuna basın ve daha sonra vc-rename-file yazın , bundan sonra dizinde geçerli dosyanızı seçmeniz ve yeni adı seçmeniz yeterlidir. Değiştirilen dosyayı içeren buff yenilenir.

Kaynak: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html


1
Bunun, sürüm kontrolüne işlenecek eski ve yeni dosyaları eklemenin (zorunlu olarak istenmez) yan etkisi vardır. Ancak +1, OP'nin sorusunu (çoğunlukla) cevaplamak için yerleşik bir işlev kullandığından.
dinozor

3

magnars versiyonuna göre, aşağıdaki gibi değiştirdim, INIT dosya adı bölümünü düzeltti:

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

Bu daha iyi. Yukarıda verilen magnars sürümü düzgün çalışmıyor. Sonuna bir "/" karakteri ekleyin
mythicalcoder

-1

Kopya ile elde edilebilir. shift + c dosya ve emacs dosya adı da dahil olmak üzere yol için bir ad belirtmenizi isteyecektir, bu yüzden sadece yeni bir ad verin ve girin ... tabii ki, bir öncekini silmeniz gerekir.


1
Dired modunda "C" den bahsediyor musunuz? Bu dosyayı kopyalamak, yeniden adlandırmak değil, (@ChrisConway belirtildiği gibi) dired "R" ile yapılır. Bunun yanı sıra OP mevcut arabellek için bir yeniden adlandırma istedi.
Davor Cubranic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.