সমস্ত উন্মুক্ত বাফারগুলি (এবং ত্রুটিগুলি উপেক্ষা করুন) ফিরে করুন


12

গিটের সাথে সংস্করণ নিয়ন্ত্রণের অধীনে কোনও প্রকল্পে কাজ করার সময়, আমি প্রায়শই শেলটিতে এমন কিছু কাজ করতে চাই যা আমার অনেকগুলি মুক্ত ফাইলগুলিকে প্রভাবিত করে, তবে আমি যে নতুন বাফারটি খোলামেলাভাবে নতুন সংস্করণটি ক্লোবার না করে তা নিশ্চিত করার জন্য আমার যে সমস্ত বাফার খোলা আছে তা ফিরিয়ে দিন আমি যা খুলেছিলাম তা দিয়ে আমি জানি magitএখানে সহায়ক হতে পারে তবে আমি শেলটিতে আমার ওয়ার্কফ্লোতে অভ্যস্ত এবং আমি এটি আপাতত রাখতে চাই। সুতরাং পরিবর্তে, আমি সমস্ত খোলা বাফারগুলি ফিরিয়ে আনতে চাই এবং বিদ্যমান থাকা বন্ধ করে দেওয়া যেকোনটি বন্ধ করে দিতে পারি (উদাহরণস্বরূপ git checkoutযে শাখার আর সেই ফাইল নেই has

আমার কাছে এলিজপের নীচের স্নিপেট রয়েছে যা আমি গুগল অনুসন্ধান থেকে ধরেছিলাম:

(defun revert-all-buffers ()
  "Refreshes all open buffers from their respective files"
  (interactive)
  (let* ((list (buffer-list))
         (buffer (car list)))
    (while buffer
      (when (and (buffer-file-name buffer) 
                 (not (buffer-modified-p buffer)))
        (set-buffer buffer)
        (revert-buffer t t t))
      (setq list (cdr list))
      (setq buffer (car list))))
  (message "Refreshed open files"))

কিন্তু এই বিরতি যদি এটা আমার ফাইল খুলুন এক, অর্থাত যখন প্রত্যাবর্তন একটি ত্রুটি হিট B1, B2, B3, ..., Bnরূপে ফিরিয়ে নিয়ে যেতে চেষ্টা করার সময় একটি ত্রুটি B2প্রতিরোধ B3- Bnথেকে প্রত্যাবর্তন করা হচ্ছে।

এই ক্ষেত্রে পপ আপ হওয়া কোনও ত্রুটি উপেক্ষা করতে আমি কীভাবে ইম্যাক্সকে বলতে পারি? আমি ব্যবহার করতে চাই না global-auto-revert-modeকারণ প্রত্যেকটি রিভার্ট কিছু ভারী শুল্ক সামগ্রী যেমন ট্রিট করে তোলে যেমন আমার অটো-সম্পূর্ণ এবং সিনট্যাক্স চেকার ফাইলটির পুনরায় পার্সিং, এক মুহূর্তের জন্য ইম্যাকগুলি ঝুলিয়ে রাখে।


কী ধরণের ত্রুটি B2আপনার উদাহরণে বাফারটিকে ফিরিয়ে আটকায় । আমি একটি খুব অনুরূপ ফাংশন ব্যবহার করি (সম্ভবত এই স্নিপেট থেকে প্রাপ্ত) এবং এটি দুর্দান্ত কাজ করেছে।
দক্ষ মোদী

@ কাউশাল: মনে হচ্ছে এটি "ফাইল আর বিদ্যমান নেই", এবং / বা প্যাকেজগুলির দ্বারা ত্রুটিগুলি ছুঁড়ে ফেলা হয়েছে যে আমার আবার চালানো বাফার রিভার্ট আছে। বেশিরভাগই আমি লক্ষ্য করেছি যে এটি চালানোর পরে আমি একটি "পেয়ে যাব শেষ বার দেখার পরে ফাইলটি পরিবর্তিত হয়েছে!" চালুC-x s
প্যাট্রিক কলিন্স

"file no longer exists".. আহা! আমার সংস্করণটি ঠিক করে দিয়েছে :) এটি শীঘ্রই পোস্ট করবে।
দক্ষ মোদী

উত্তর:


12

মূল

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

এখানে কোডটি আমার জন্য স্থিতিশীল ছিল:

(defun modi/revert-all-file-buffers ()
  "Refresh all open buffers from their respective files."
  (interactive)
  (let* ((list (buffer-list))
         (buffer (car list)))
    (while buffer
      (let ((filename (buffer-file-name buffer)))
        ;; Revert only buffers containing files, which are not modified;
        ;; do not try to revert non-file buffers like *Messages*.
        (when (and filename
                   (not (buffer-modified-p buffer)))
          (if (file-exists-p filename)
              ;; If the file exists, revert the buffer.
              (with-current-buffer buffer
                (revert-buffer :ignore-auto :noconfirm :preserve-modes))
            ;; If the file doesn't exist, kill the buffer.
            (let (kill-buffer-query-functions) ; No query done when killing buffer
              (kill-buffer buffer)
              (message "Killed non-existing file buffer: %s" filename)))))
      (setq buffer (pop list)))
    (message "Finished reverting buffers containing unmodified files.")))

হালনাগাদ

@ ড্রয়ের সমাধানটি দেখার পরে উপরের একটি উন্নত এবং আরও ভাল নথিভুক্ত সংস্করণ এখানে ।

(defun modi/revert-all-file-buffers ()
  "Refresh all open file buffers without confirmation.
Buffers in modified (not yet saved) state in emacs will not be reverted. They
will be reverted though if they were modified outside emacs.
Buffers visiting files which do not exist any more or are no longer readable
will be killed."
  (interactive)
  (dolist (buf (buffer-list))
    (let ((filename (buffer-file-name buf)))
      ;; Revert only buffers containing files, which are not modified;
      ;; do not try to revert non-file buffers like *Messages*.
      (when (and filename
                 (not (buffer-modified-p buf)))
        (if (file-readable-p filename)
            ;; If the file exists and is readable, revert the buffer.
            (with-current-buffer buf
              (revert-buffer :ignore-auto :noconfirm :preserve-modes))
          ;; Otherwise, kill the buffer.
          (let (kill-buffer-query-functions) ; No query done when killing buffer
            (kill-buffer buf)
            (message "Killed non-existing/unreadable file buffer: %s" filename))))))
  (message "Finished reverting buffers containing unmodified files."))

উল্লেখ


5

আরেকটি:

(defun revert-all-no-confirm ()
  "Revert all file buffers, without confirmation.
Buffers visiting files that no longer exist are ignored.
Files that are not readable (including do not exist) are ignored.
Other errors while reverting a buffer are reported only as messages."
  (interactive)
  (let (file)
    (dolist (buf  (buffer-list))
      (setq file  (buffer-file-name buf))
      (when (and file  (file-readable-p file))
        (with-current-buffer buf
          (with-demoted-errors "Error: %S" (revert-buffer t t)))))))

ধন্যবাদ। আমি dolistপ্রতিস্থাপন করতে স্টাইল চুরি করছি carএবং pop। মজাদার আপনি কীভাবে আপনার কনফিগারেশনের উন্নতি করতে পারবেন আপনি আরও শিখতে পারেন :)
মোদি

@ কাউশালমোদি এই কারণেই আমি এটি কিছুটা পোস্ট করেছি। ;-)
ড্রিউ

1

আমি কৌসালের জবাব গ্রহণ করেছি যেহেতু এটি আমার যা চেয়েছিল তার নিকটতম, তবে আমিও ড্রয়ের সমাধানের অংশটি ধরলাম। আমি আবৃত revert-bufferমধ্যে with-demoted-errorsএবং বাদ :preserve-modesতাই পরামিতি যে আমার বাক্য গঠন পরীক্ষক হবে আমার ফাইল খুলুন সব পুনরায় বিশ্লেষণ। আমি এটিকে পরিবর্তিত ফাইলের পাশাপাশি অশোধিত ফাইলগুলিও মেরে ফেলতে পারি, যেহেতু আমি প্রায়শই পরিবর্তিত ফাইল খোলার C-x sপরে ঘটনাক্রমে-দুর্ঘটনাকবলিত হয়ে সমস্যায় পড়ি git checkout

চূড়ান্ত সংস্করণটি হ'ল:

(defun revert-all-buffers ()
  "Refresh all open buffers from their respective files."
  (interactive)
  (let* ((list (buffer-list))
         (buffer (car list)))
    (while buffer
      (let ((filename (buffer-file-name buffer)))
        ;; Revert only buffers containing files, which are not modified;
        ;; do not try to revert non-file buffers like *Messages*.
        (when filename
          (if (file-exists-p filename)
              ;; If the file exists, revert the buffer.
              (with-demoted-errors "Error: %S"
                (with-current-buffer buffer
                  (revert-buffer :ignore-auto :noconfirm)))
            ;; If the file doesn't exist, kill the buffer.
            (let (kill-buffer-query-functions) ; No query done when killing buffer
              (kill-buffer buffer)
              (message "Killed non-existing file buffer: %s" buffer))))
        (setq buffer (pop list)))))
  (message "Finished reverting non-file buffers."))

এটি যুক্ত হওয়া অগ্রগামী বার্তাগুলি যেহেতু প্রদর্শিত হতে পারে এতে অনেকগুলি ফাইল খোলা থাকে: emacs.stackexchange.com/a/50730/2418
ধারণাগুলি 42

1

আমি এটি একটি condition-caseবা ignore-errors( এখানে ডক্স ) দিয়ে ঠিক করব । আপনি ঠিক কী করতে চাইবেন তা আমি জানি না ; আপনি যদি ত্রুটিগুলি নিয়ে কিছু করতে চান, যদি আপনি condition-caseফলাফলটি নির্দিষ্ট করতে ব্যবহার করতে পারেন বা আপনি ignore-errorsচালিয়ে যেতে ব্যবহার করতে পারেন । কিছুটা এইরকম:

(defun revert-all-buffers ()
  "Refreshes all open buffers from their respective files"
  (interactive)
  (let* ((list (buffer-list))
         (buffer (car list)))
    (while buffer
      (when (and (buffer-file-name buffer) 
                 (not (buffer-modified-p buffer)))
        (set-buffer buffer)
        (ignore-errors (revert-buffer t t t)))
      (setq list (cdr list))
      (setq buffer (car list))))
  (message "Refreshed open files"))

0

সংযোজন সহ @ ড্রয়ের উত্তরের ভিত্তিতে:

  • অগ্রগতি প্রতিবেদন (যেহেতু এটি অনেকগুলি ফাইল খোলার সাথে ধীর হতে পারে)
  • পূর্বাবস্থায় ফেলা পরিস্থিতি সাফ করুন (বাফার পুনরায় লোড করার সময় পূর্বাবস্থায় পূর্বাবস্থায় লোড হওয়া প্যাকেজগুলির সমর্থন সহ - উদাহরণস্বরূপ পূর্বাবস্থায়-ফু-সেশন )
(defun revert-all-buffers ()
  "Refresh all open buffers from their respective files.

Buffers which no longer exist are closed.

This can be useful when updating or checking out branches outside of Emacs."
  (interactive)
  (let* ((filename-and-buffer-list ;; Pairs of '(filename . buf)'.
          (let ((temp-list nil))
            (dolist (buf (buffer-list))
              (let ((filename (buffer-file-name buf)))
                (when filename
                  (push (cons filename buf) temp-list))))
            temp-list))

         (count (length filename-and-buffer-list))
         (count-final 0)
         (count-close 0)
         (count-error 0)
         ;; Keep text at a fixed width when redrawing.
         (format-count
          (format "%%%dd" (length (number-to-string count))))
         (format-text
          (concat "Reverting [" format-count " of " format-count "] %3d%%: %s"))
         (index 1))

    (message "Begin reverting %d buffers..." count)
    (while filename-and-buffer-list
      (pcase-let ((`(,filename . ,buf) (pop filename-and-buffer-list)))
        ;; Revert only buffers containing files, which are not modified;
        ;; do not try to revert non-file buffers such as '*Messages*'.
        (message format-text
                 index count (round (* 100 (/ (float index) count))) filename)
        (if (file-exists-p filename)
            ;; If the file exists, revert the buffer.
            (if (with-demoted-errors "Error: %S"
                  (with-current-buffer buf
                    (let ((no-undo (eq buffer-undo-list t)))

                      ;; Disable during revert.
                      (unless no-undo
                        (setq buffer-undo-list t)
                        (setq pending-undo-list nil))

                      (unwind-protect
                          (revert-buffer :ignore-auto :noconfirm)

                        ;; Enable again (always run).
                        (unless no-undo
                          ;; It's possible a plugin loads undo data from disk,
                          ;; check if this is still unset.
                          (when (and (eq buffer-undo-list t)
                                     (null pending-undo-list))
                            (setq buffer-undo-list nil))))))
                  t)
                (setq count-final (1+ count-final))
              (setq count-error (1+ count-error)))

          ;; If the file doesn't exist, kill the buffer.
          (let (kill-buffer-query-functions) ;; No query done when killing buffer.
            (message "Closing non-existing file buffer: %s" buf)
            (kill-buffer buf)
            (setq count-close (1+ count-close))))
        (setq index (1+ index))))
    (message
     (concat
      "Finished Revert All: " (format "%d buffer(s)" count-final)
      (if (zerop count-close)
          ""
        (format ", %d closed" count-close))
      (if (zerop count-error)
          ""
        (format ", %d error (see message buffer)" count-error))))))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.