আমি কীভাবে ইমাসে একটি মুক্ত ফাইলটির নাম পরিবর্তন করব?


237

ইমাক্সে খোলা ফাইলটির নামকরণের কোনও উপায় আছে কি? আমি এটি দেখার সময়? কিছু সংরক্ষণের মতো, তবে আসলটি চলে যাওয়া উচিত।

উত্তর:


88

স্টিভ ইয়েজের .emacs থেকে এই ফাংশনটি ব্যবহার করে দেখুন :

;; উত্স: http://steve.yegge.googlepages.com/my-dot-emacs-file
(পুনরায় নামকরণ-ফাইল-এবং-বাফার (নতুন নাম)
  "বর্তমান বাফার এবং নতুন-NAME এ এটি দেখার জন্য ফাইল দুটির নামকরণ করুন" "
  (ইন্টারেক্টিভ "এস নতুন নাম:")
  (যাক ((নাম (বাফার-নাম))
        (ফাইলের নাম (বাফার-ফাইল-নাম)))
    (যদি (ফাইলের নাম না)
        (বার্তা 'বাফার'% s 'কোনও ফাইল দেখছে না! "নাম)
      (যদি (গেট-বাফার নতুন নাম)
          (বার্তা "'% s' নামের একটি বাফার ইতিমধ্যে বিদ্যমান!" নতুন নাম)
        (progn
          (নতুন নাম ফাইল-ফাইল নাম নতুন নাম 1)
          (নতুন নাম-বাফার নতুন নাম)
          (সেট-ভিজিট-ফাইল-নাম নতুন নাম)
          (সেট-বাফার-মডিফায়েড-পি নীল))))))

এই পৃষ্ঠাটি একবার দেখুন, সেখানে আরও একটি কার্যকর সম্পর্কিত ফাংশন রয়েছে যার নাম "মুভ-বাফার-ফাইল"।


1
দ্রষ্টব্য: এই পদ্ধতিটি (setq uniquify-buffer-name-style 'forward)অর্থের সাথে সামঞ্জস্যপূর্ণ নয় যদি আপনার বাফার নামকরণ করা হয় users\index.html(কারণ আপনার কাছে ইতিমধ্যে অন্য একটি বাফার রয়েছে posts\index.html) নামকরণ ব্যর্থ হবে
ডলজেনকো

(set-buffer-modified-p nil)অপ্রয়োজনীয় মনে হচ্ছে আপনি যদি rename-file-and-bufferকোনও পরিবর্তিত বাফারকে কল করে এবং তারপর এটি হত্যা করার চেষ্টা করেন, এটি সংরক্ষণে সংরক্ষণ না করা পরিবর্তন সম্পর্কে আপনাকে সতর্ক না করে আনন্দের সাথে এটি করবে।
roldugin

এই ফাংশনটি (কিছুটা বিরক্তিকরভাবে) আপনাকে জিজ্ঞাসা করার আগে একটি নতুন নামও জিজ্ঞাসা করবে বর্তমান বাফার মোটামুটি কোনও ফাইলের সাথে যুক্ত রয়েছে কিনা (যে ক্ষেত্রে এটি প্রস্থান করে)।
থমাস

338

হ্যাঁ, diredমোডের সাহায্যে আপনি এটি করতে পারেন:

  • C-x d খোলা খোলা
  • RET বর্তমান ফাইল ডিরেক্টরি নির্বাচন করতে
  • C-x C-j( dired-jumpচলিত ফাইলের নামটি শুকিয়ে যাওয়াতে)
  • Rফাইলটির নাম পরিবর্তন করতে (বা dired-do-rename)।
  • q (নাম পরিবর্তিত) ফাইল বাফারে ফিরে যেতে

পুনরায় নামটি শেলের সমতুল্য mv, তবে এটি কোনও উন্মুক্ত বাফার আপডেট করবে এবং এর বিপরীতে mvএটি অ্যাক্সেস পরিবর্তন করবে না এবং ফাইল সিস্টেমে ফাইলের সময় পরিবর্তন করবে না।


9
এটি সরাসরি বর্তমান ফাইলটির নাম পরিবর্তন করে না।
pupeno

4
সিক্স বি এবং আপনি আসল বাফারে ফিরে এসেছেন। এটি করার জন্য আপনি একটি এলিস্প ফাংশন লিখতে পারেন তবে আমি সন্দেহ করি আপনি এটির সাথে অনেকগুলি কীস্ট্রোক সংরক্ষণ করবেন।
ক্রিস কনওয়ে

6
এছাড়াও, সিক্স বি-এর পরিবর্তে, আপনি মূল বাফারে ফিরে আসতে Cx কে টিপতে পারেন।
ইয়ো

32
আমার পক্ষে C-x C-jএটি ডিফল্টরূপে আবদ্ধ নয়। M-x load-library RET dired-x RETপ্রথম কাজটি এটি আবদ্ধ করে তোলে।
এনটিসি 2

4
যদি C-x C-jআনবাউন্ড না M-x dired-jumpহয় তবে অন্য বিকল্পটি কেবল প্রথমবারেই করা উচিত। এটি স্বয়ংক্রিয়ভাবে লোড হবে dired-x(যার ফলে এটি এ C-x C-jথেকে সংজ্ঞায়িতও হবে)।
ফার্নান্দো বাসো

120

কেবল সম্পূর্ণতার জন্য, যেহেতু কিছু লোকেরা এই পৃষ্ঠাটি ভিজিট করতে পারে ভেবে তারা ইমাসসের "সংরক্ষণ হিসাবে সংরক্ষণ করুন" বৈশিষ্ট্যের জন্য একটি উত্তর পাবে, এটি একটি উন্মুক্ত ফাইলের জন্য সিএক্সডাব্লু।


Cx Cw বা মেনুটি ব্যবহার করুনFile > Save as...
ইয়ু

আপনি যে ফাইলটি সম্পাদনা করছেন সেটি এখনও মূল হিসাবে থাকবে বলে পুরোপুরি "সংরক্ষণ করুন" নয়।
asmeurer

11
@ এসম্যুরার আপনি ভুল! সংরক্ষণের পরে, আপনি নতুন ফাইলটি সম্পাদনা করবেন।
জোয়েল জি ম্যাথিউ

3
আবার, কেন মন্তব্যগুলিকে হ্রাস করার কোনও বৈশিষ্ট্য নেই ?!
ভালুক

7
সম্ভবত অ্যাসিউমারের অর্থ, "আপনি [যে ফাইলটি সম্পাদনা করছেন] তার ফাইলটি এখনও বিদ্যমান থাকবে"। তাহলে, এটা কি সঠিক? আমি যাচাই করতাম, তবে তবে আপনি আমার মন্তব্যকে হ্যাহাহাও করতে পারবেন না।
ব্র্যাডি ট্রেনার

25

আমার প্রিয়টি ম্যাগনারদের থেকে একটি (ইমাস রকস স্ক্রিনকাস্ট খ্যাতির।)

অন্যান্য বিকল্পগুলির মতো নয়, আপনাকে স্ক্র্যাচ থেকে নামটি টাইপ করতে হবে না - আপনি বর্তমান নামটি পরিবর্তন করতে পারেন।

(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
আমার জন্য এটি পোস্ট করার জন্য ধন্যবাদ। এই উপায়টি হ'ল উত্তরগুলি সংশোধন করা, নতুন কোনও পোস্ট করা নয়, কিছুটা সংশোধিত।
আনফুন বিড়াল

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

সুন্দর. এখন আমার ফাংশনগুলিতে শীতল হচ্ছে el
ফেলিক্স ডি

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

আপনি যদি স্পেসম্যাকস ব্যবহার করছেন তবে আপনি নিখরচায় এই আচরণটি পান কারণ এটি rename-current-buffer-fileডিফল্টরূপে আবদ্ধ (ম্যাগনারের উপর ভিত্তি করে) বাস্তবায়নের সাথে আসে SPC-f-R

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


4

খুব সহজ উপায় আছে, আপনি কমান্ড এমএক্স টিপুন এবং ভিসি-পুনর্নাম-ফাইল টাইপ করুন , তারপরে আপনাকে কেবলমাত্র আপনার বর্তমান ফাইল ডিরেক্টরিতে ডিরেক্টরি নির্বাচন করতে হবে এবং নতুন নামটি বেছে নেওয়ার চেয়ে বেশি দরকার। পরিবর্তিত ফাইল রয়েছে এমন বাফটি রিফ্রেশ হবে।

সূত্র: https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Delete_002fRename.html


1
পুরানো এবং নতুন ফাইলগুলি সংস্করণ নিয়ন্ত্রণে প্রতিশ্রুতিবদ্ধ করার জন্য এটির (অগত্যা কাম্য নয়) পার্শ্ব প্রতিক্রিয়া রয়েছে। তবে +1 কারণ এটি ওপি-র প্রশ্নের উত্তর দেওয়ার জন্য একটি বিল্টিন ফাংশন ব্যবহার করে (বেশিরভাগ)।
ডায়নোসর

3

ম্যাগনার ভার্সনের উপর ভিত্তি করে, আমি নীচের হিসাবে সংশোধন করেছি, আইএনআইটি ফাইল নাম অংশটি স্থির করেছি:

(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

এটি অনুলিপি দ্বারা অর্জন করা যেতে পারে। ফাইলটিতে ইমফ করুন + সি এবং ইমাস আপনাকে ফাইলের নাম সহ পথের একটি নাম বোঝাতে বলবে, সুতরাং আপনি কেবল নতুন নামটি সরবরাহ করেন এবং প্রবেশ করুন ... অবশ্যই আপনাকে পূর্বেরটি মুছতে হবে।


1
মনে হচ্ছে আপনি ডায়ার্ড মোডে "সি" উল্লেখ করছেন? এটি ফাইলটি অনুলিপি করছে, নাম পরিবর্তন করে না, যা (@ ক্রিসকনওয়ে উল্লিখিত হিসাবে) বিরক্তিতে "আর" দিয়ে সম্পন্ন হয়েছে। এবং পাশাপাশি, ওপি বর্তমান বাফারের একটি নাম চেয়েছিল।
ডাভর কিউবারিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.