मैं Emacs में एक खुली फ़ाइल का नाम कैसे बदलूँ?


237

वहाँ Emacs में एक खुली फ़ाइल का नाम बदलने के लिए एक रास्ता है? जबकि मैं इसे देख रहा हूं? कुछ बचाओ-जैसा है, लेकिन मूल को दूर जाना चाहिए।

जवाबों:


88

स्टीव Yegge .emacs से इस फ़ंक्शन का प्रयास करें :

;; स्रोत: http://steve.yegge.googlepages.com/my-dot-emacs-file
(मान नाम बदलें फ़ाइल और बफर (नया नाम)
  "वर्तमान बफ़र और फ़ाइल का नाम बदलें, जो NEW-NAME पर जा रही है।"
  (इंटरैक्टिव "sNew नाम:")
  (चलो (नाम (बफर-नाम))
        (फ़ाइल नाम (बफर-फ़ाइल-नाम))
    (यदि फ़ाइल नाम नहीं)
        (संदेश "बफर '% s' फ़ाइल पर नहीं जा रहा है!" नाम)
      (यदि (नया नाम बफर प्राप्त करें)
          (संदेश "% s 'नाम का एक बफर पहले से मौजूद है!" नया-नाम)
        (progn
          (नया नाम फ़ाइल नाम नया नाम 1)
          (नाम-बफर नया-नाम)
          (सेट-विज़िट-फ़ाइल-नाम नया-नाम)
          (सेट-बफर-संशोधित-पी नील))))))

उस पृष्ठ पर एक नज़र डालें, वहां एक और उपयोगी उपयोगी फ़ंक्शन है, जिसे "मूव-बफर-फाइल" कहा जाता है।


1
नोट: यह विधि (setq uniquify-buffer-name-style 'forward)अर्थ के साथ संगत नहीं है यदि आपके पास बफर का नाम है users\index.html(क्योंकि आपके पास पहले से ही एक और बफर है posts\index.html) का नाम बदलकर विफल हो जाएगा
dolzenko

(set-buffer-modified-p nil)अनावश्यक लगता है। यदि आप rename-file-and-bufferएक संशोधित बफर पर कॉल करते हैं और फिर इसे मारने का प्रयास करते हैं, तो यह बिना किसी परिवर्तन के आपको चेतावनी दिए बिना खुशी से करेगा।
रोलडगिन

यह फ़ंक्शन (कुछ हद तक नाराज) यह जांचने से पहले आपसे एक नया नाम पूछेगा कि क्या वर्तमान बफर एक फ़ाइल से जुड़ा हुआ है (जिस स्थिति में यह गर्भपात करता है)।
थॉमस

338

हां, diredमोड के साथ , आप कर सकते हैं:

  • C-x d खोलने के लिए
  • RET वर्तमान फ़ाइल की निर्देशिका का चयन करने के लिए
  • C-x C-j( dired-jumpमौजूदा फ़ाइल के नाम पर, Dired में)
  • Rफ़ाइल (या dired-do-rename) का नाम बदलने के लिए ।
  • q (बदला हुआ) फ़ाइल बफ़र पर वापस जाने के लिए

नाम एक शेल के बराबर है mv, लेकिन यह किसी भी खुले बफ़र्स को भी अपडेट करेगा, और इसके विपरीत mvयह फ़ाइल सिस्टम में फ़ाइल पर पहुंच और संशोधित समय को नहीं बदलेगा।


9
यह सीधे वर्तमान फ़ाइल का नाम नहीं है।
पलेनो

4
Cx b और आप मूल बफर में वापस आ गए हैं। आप इसे करने के लिए एक एलिफ़ फ़ंक्शन लिख सकते हैं, लेकिन मुझे संदेह है कि आप इसके साथ कई कीस्ट्रोक्स बचाएंगे।
क्रिस कॉनवे

6
इसके अलावा, Cx b के बजाय, आप मूल बफर में वापस आने के लिए Cx k दबा सकते हैं।
यूओ

32
C-x C-jमेरे लिए डिफ़ॉल्ट रूप से बाध्य नहीं है। M-x load-library RET dired-x RETपहले करना बाध्य करता है।
ntc2

4
एक और विकल्प यदि C-x C-jअनबाउंड है, तो बस M-x dired-jumpपहली बार में है। यह स्वचालित रूप से लोड होगा dired-x(जो C-x C-jइस बिंदु से परिभाषित होने का कारण भी होगा )।
फर्नांडो बैसो

120

पूर्णता के लिए, चूँकि कुछ लोग यह सोचकर इस पृष्ठ पर जा सकते हैं कि उन्हें Emacs की "सेव एज़" सुविधा के लिए एक उत्तर मिलेगा, जो कि Cx Cw एक खुली फ़ाइल के लिए है।


Cx Cw या मेन्यू का उपयोग करेंFile > Save as...
Yoo

नहीं "के रूप में सहेजें", क्योंकि आप जिस फ़ाइल को संपादित कर रहे हैं वह अभी भी मूल एक होगी।
अपराह्न

11
@asmeurer आप गलत हैं! सेव करने के बाद आप नई फाइल को एडिट करेंगे।
जोएल जी मैथ्यू

3
फिर, टिप्पणियों को डाउनवोट करने की सुविधा क्यों नहीं है ?!
सहपाठी

7
शायद asmeurer का मतलब था, "फ़ाइल [आप] संपादन अभी भी [अस्तित्व]" होगा। फिर, क्या यह सही है? मैं जांच करूंगा, लेकिन फिर भी, आप मेरी टिप्पणी को हाहाहा नहीं कह सकते।
ब्रैडी ट्रेनर

25

मेरा पसंदीदा मैग्नेर्स से है ( Emacs चट्टानों के नाम से प्रसिद्ध)

अन्य विकल्पों के विपरीत, आपको नाम को खरोंच से टाइप करने की आवश्यकता नहीं है - आपको संशोधित करने के लिए वर्तमान नाम मिलता है।

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

एक सही संस्करण के लिए जेम्स यांग का धन्यवाद।


यह ठीक से काम नहीं कर रहा है। यह एक फ़ाइल के अंत में एक "/" जोड़ता है।
पौराणिक

2
मेरे लिए पोस्ट करने के लिए धन्यवाद। SO तरीका उत्तर सही करना है, नया पोस्ट नहीं करना है, थोड़ा संशोधित करना है।
अनफिन कैट

15

यहाँ एक और अधिक मजबूत संस्करण है जो स्टीवे से अनुकूलित है।

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

अच्छा है। अब मेरे कार्यों में ठंड लग रही है।
फेलिक्स डी।

11

यहाँ एक और संस्करण है, यह बहुत मजबूत है और कुलपति अवगत है:

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

आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं ।


7

यदि आप Spacemacs का उपयोग कर रहे हैं तो आपको यह व्यवहार मुफ्त में मिलता है क्योंकि यह rename-current-buffer-file(मैग्नास पर आधारित) कार्यान्वयन के साथ आता है जो डिफ़ॉल्ट रूप से बाध्य है SPC-f-R

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


4

एक बहुत आसान तरीका है, आप कमांड Mx टाइप करें और vc-rename-file टाइप करें , इसके बाद आपको बस डायरेक्टरी में अपनी वर्तमान फ़ाइल का चयन करना है, और नया नाम चुनना है। जिस बफ़र में बदली हुई फ़ाइल है वह ताज़ा हो जाएगी।

स्रोत: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html


1
संस्करण नियंत्रण में प्रतिबद्ध होने के लिए पुरानी और नई फ़ाइलों को जोड़ने का यह (आवश्यक रूप से वांछनीय नहीं) पक्ष प्रभाव है। लेकिन +1 क्योंकि यह ओपिन के प्रश्न का उत्तर देने के लिए (ज्यादातर) एक बिलियन फ़ंक्शन का उपयोग करता है।
डायनासोर

3

मैगर्स संस्करण के आधार पर, मैंने नीचे के रूप में संशोधित किया, 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)))))))

यह बेहतर है। ऊपर दिया गया मैग्नर्स वर्जन ठीक से काम नहीं कर रहा है। अंत में एक "/" वर्ण जोड़ें
पौराणिक

-1

इसे कॉपी करके हासिल किया जा सकता है। फ़ाइल पर em + c और emacs आपको फ़ाइल नाम सहित पथ के लिए एक नाम सूचित करने के लिए कहेंगे, इसलिए आप बस नया नाम प्रदान करते हैं, और दर्ज करते हैं ... बेशक, आपको पूर्व को हटाना होगा।


1
आप "सी" का उल्लेख करने के लिए प्रतीत हो रहे हैं? यह फ़ाइल की प्रतिलिपि बना रहा है, इसे नाम नहीं दे रहा है, जो (@ChrisConway के रूप में विख्यात) ने "आर" के साथ किया है। और इसके अलावा, ओपी ने वर्तमान बफर का नाम बदलने के लिए कहा।
काबर्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.