ফায়ারফক্স ব্রাউজারে সিএসটি-র মতো স্রেফ মেরে যাওয়া বাফার কীভাবে পুনরায় খুলবেন?


35

মাঝে মাঝে আমি ঘটনাক্রমে একটি বাফার হত্যা এবং এটি পুনরায় খোলা, ঠিক CST মত ফায়ারফক্সে পূর্বাবস্থা বন্ধ ট্যাবটি করতে চাই, কিন্তু কোন এ গিয়ে Emacs মধ্যে বিল্ট-ইন করা হয় কমান্ড defun undo-kill-bufferমধ্যে http://www.emacswiki.org/RecentFiles :

(defun undo-kill-buffer (arg)
  "Re-open the last buffer killed.  With ARG, re-open the nth buffer."
  (interactive "p")
  (let ((recently-killed-list (copy-sequence recentf-list))
     (buffer-files-list
      (delq nil (mapcar (lambda (buf)
                  (when (buffer-file-name buf)
                (expand-file-name (buffer-file-name buf)))) (buffer-list)))))
    (mapc
     (lambda (buf-file)
       (setq recently-killed-list
         (delq buf-file recently-killed-list)))
     buffer-files-list)
    (find-file
     (if arg (nth arg recently-killed-list)
       (car recently-killed-list)))))

মোটেই কাজ করে না আপনি যদি এলিস্প জানেন তবে কীভাবে এই সমস্যাটি সমাধান করবেন?

এটি যদি বন্ধ হওয়া বাফারগুলির একটি তালিকা প্রদর্শন করতে পারে এবং তাদের পুনরায় খোলার জন্য আমি তাদের মধ্য থেকে একটি চয়ন করতে পারি, এটি আরও ভাল।


7
এখনও অবধি দেওয়া উত্তরের কোনও উত্তরই উত্থাপিত প্রশ্নের মতো প্রতিক্রিয়া জানায় না, যা একটি নিহত বাফার "পুনরায় খোলা" বা পুনরুদ্ধার সম্পর্কিত। এটি কারণ এটি বেশ অসম্ভব, সাধারণভাবে - সবচেয়ে ভাল যেটি করা যেতে পারে তা হ'ল এটি আবার তৈরি করা। তবে আপনি যদি কেবল ফাইল-পরিদর্শনকারী বাফার বলতে চান তবে উত্তরটি সহজ, এবং এখানে দেওয়া উত্তরগুলি উপযুক্ত। যদি এটি হয় তবে এই সীমাবদ্ধতা প্রতিফলিত করতে আপনার প্রশ্নটি সম্পাদনা করুন
ড্রিউ

2
একটি বিকল্প পদ্ধতি those বাফারদের হত্যা না করা। বুড়ি-বাফার দুর্দান্ত আপনি কল্পনাপ্রসূত পদ্ধতির কল্পনাও করতে পারেন, উদাহরণস্বরূপ একটি (এখনও সংজ্ঞায়িত করা হয়নি) কিল-বাফার-পরে যা তত্ক্ষণাত বাফারকে কবর দেবে এবং কয়েক মিনিটের পরে বাফারটিকে হত্যা করার জন্য একটি টাইমার সেটআপ করবে। অথবা একটি কিল-বাফার-সম্ভবত-পরে এটি কোনও ফাইল দেখার জন্য বাফারটিকে মেরে ফেলবে এবং যদি তা না হয় তবে তার মৃত্যুর জন্য বিলম্ব করে (সিক্স বি ব্যবহার করার সময় গোলমাল এড়াতে এটির নামে একটি স্থান প্রস্তুতও করতে পারে)।
ইয়ংফ্রোগ

@ ইউংফ্রোগ, ঠিক আছে, আমি আমার উত্তরে এই সুযোগটিকে সম্বোধন করেছি।
মার্ক কার্পভ

উত্তর:


27

এখানে অন্য একটি সহজ বিকল্প যা প্রয়োজন হয় না recentf। প্রথম ফাংশনটি হুক করা kill-buffer-hookবাফারের সাথে যুক্ত ফাইলের নামটিকে একটি তালিকার দিকে ঠেলে দেবে। (দ্রষ্টব্য, আপনি যদি কোনও বাফারকে মেরে থাকেন যা কোনও ফাইল দেখেন না, তবে এটি ভাল হয়েছে)) পরবর্তী কার্যটি সেই ফাইলটিকে তালিকার বাইরে নিয়ে যায় এবং এটি পরিদর্শন করে:

(defvar killed-file-list nil
  "List of recently killed files.")

(defun add-file-to-killed-file-list ()
  "If buffer is associated with a file name, add that file to the
`killed-file-list' when killing the buffer."
  (when buffer-file-name
    (push buffer-file-name killed-file-list)))

(add-hook 'kill-buffer-hook #'add-file-to-killed-file-list)

(defun reopen-killed-file ()
  "Reopen the most recently killed file, if one exists."
  (interactive)
  (when killed-file-list
    (find-file (pop killed-file-list))))

দ্রষ্টব্য এটি killed-file-listএকটি তালিকা, সুতরাং আপনি উদাহরণস্বরূপ, এখানে বর্ণিত সাধারণটির চেয়ে সেই তালিকাটির মধ্যে চক্রের জন্য আরও জটিল পদ্ধতিতে লিখতে পারেন: আপনি এটির সাথে কতটা করতে চান তা আপনার বিষয় up

সম্পাদনা: দুঃখিত, ফাইলগুলির একটি তালিকা চাওয়ার বিষয়ে আপনার প্রশ্নে শেষ বিধানটি আমি মিস করেছি। নীচের ফাংশনটি ইনসোফারের উপরের সংস্করণটির তুলনায় সামান্য কৌতুকপূর্ণ কারণ এটি completing-readআপনাকে হত্যা করা ফাইলগুলির মধ্যে কোনটি নির্দিষ্ট করে তা নির্দিষ্ট করতে দেয়। আপনি যদি এর মতো কিছু ব্যবহার করে idoথাকেন তবে এটি আপনাকে সর্বাধিক সাম্প্রতিক সময়ে ডিফল্ট করে বর্তমান সেশনে যে সমস্ত ফাইল মেরে ফেলেছে তার সবকটি চক্রটি চালিয়ে দেবে। মনে রাখবেন যে এটি অনুমান করে যে আপনার ইতিমধ্যে প্রয়োজন cl-lib:

(defun reopen-killed-file-fancy ()
  "Pick a file to revisit from a list of files killed during this
Emacs session."
  (interactive)
  (if killed-file-list
      (let ((file (completing-read "Reopen killed file: " killed-file-list
                                   nil nil nil nil (car killed-file-list))))
        (when file
          (setq killed-file-list (cl-delete file killed-file-list :test #'equal))
          (find-file file)))
    (error "No recently-killed files to reopen")))

5

আমি আপনাকে জিজ্ঞাসা করতে চাই: "আপনি কি সত্যিই এটি হত্যা করতে চান?"। প্রকৃতপক্ষে, ইমার্স বিশ্বে বাফারকে হত্যা করা একটি সাধারণ বিষয়, তবে একবার মারা গেলে বাফার চলে যায় এবং আপনার প্রশ্নটি প্রমাণ করে যে এটি সর্বদা কাম্য নয়।

তবে আমরা অন্য কোনও উপায় চয়ন করতে পারি, যাতে আপনার কখনই নিহত বাফার পুনরুদ্ধার করতে হবে না - কেবল হত্যার উদ্দেশ্যে কবর দেওয়া পছন্দ করুন। কটাক্ষপাত হত্যা বা জীবন্ত কবর প্যাকেজ, এটা Melpa মাধ্যমে উপলব্ধ

প্যাকেজের বিবরণ থেকে:

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

আমরা যখন সত্যিই কোনও বাফারকে হত্যা করতে চাই, তখন দেখা যায় যে সমস্ত বাফার একইভাবে মারা যেতে পছন্দ করে না। প্যাকেজটি বিভিন্ন ধরণের বাফারকে কীভাবে হত্যা করতে পারে তা নির্দিষ্ট করতে দেয় । এটি বিশেষত কার্যকর হতে পারে যখন আপনি কিছু সম্পর্কিত বাফারের সাথে কাজ করছেন যার একটি সম্পর্কিত প্রক্রিয়া রয়েছে for

তবে কখনও কখনও আপনি বেশিরভাগ বাফার থেকে মুক্তি পেতে এবং ইমাক্স আরও কিছু বা কম ভার্জিন অবস্থায় আনতে চাইতে পারেন। আপনি সম্ভবত স্ক্র্যাচ বাফার এবং ERC- সম্পর্কিত বাফারগুলি মারতে চান না। আপনি কোন বাফারগুলি পরিষ্কার করতে পারেন তা নির্দিষ্ট করতে পারেন।


4

আমি এই এসও পোস্ট থেকে এই সমাধানটি ব্যবহার করি এবং এটি দুর্দান্ত কাজ করে।

সমাধান মার্জিত তবে নিখুঁত নয়; এটি সক্রিয় বাফারগুলির একটি তালিকা সঞ্চয় করে এবং সাম্প্রতিক তালিকা থেকে প্রথম ফাইলটি সক্রিয় করে যা সক্রিয় বাফারগুলির তালিকাভুক্ত নয়।

;; শেষ নিহত বাফারটি আবার খুলুন
;; উত্স: https://stackoverflow.com
('সিএল প্রয়োজন)
(প্রয়োজন 'সাম্প্রতিক)
(সাম্প্রতিক-মোড 1)
(পূর্বাবস্থায় ফিরিয়ে দেওয়া-হত্যা-বাফার ()
  (ইন্টারেক্টিভ)
  (আসুন ((অ্যাক্টিভ-ফাইলগুলি (বুফ-ইন লুফ ইন (বাফার-তালিকা))
                            কখন (বাফার-ফাইল-নাম বুফ) এটি সংগ্রহ করে)))
    (সাম্প্রতিক তালিকাতে ফাইলের জন্য লুপ)
          (সদস্য ফাইল অ্যাক্টিভ-ফাইলগুলি) ফিরে না আসা (ফাইল-ফাইল ফাইল))))

3

আপনি চালু করতে হবে recentf-mode। এটি করতে, চালান M-x recentf-mode। তারপরে, আপনি কিছু নতুন বাফার না খোলার বা হত্যা না করা পর্যন্ত ফাংশনটি কাজ করতে পারে না; আমি মনে করি না আপনি recentf-listপূরণ করেছেন।

যদি আপনি চান যে ইমাসগুলি শুরু হয়ে গেলে এটি সক্ষম করা থাকে তবে এটি আপনার ডিআইডি ফাইলে রাখুন:

(recentf-mode)

তারপরে defunআপনি যা খুঁজে পেয়েছেন তা সেখানে রেখে দিতে পারেন, এবং যদি চান তবে এটি একটি কীতে আবদ্ধ করতে পারেন।

এই মোডের এক দিক থেকে মনে হয় যে সাম্প্রতিকতম মোড openedফাইলগুলি ট্র্যাক করতে নির্মিত হয়েছে , নিহতদের নয়। সুতরাং, আপনি যদি দুটি বার এই ফাংশনটি চালনা করেন তবে এটি আপনার দ্বিতীয়-সর্বাধিক মারা যাওয়া ফাইলটি পুনরায় খোলে না।


4
যদিও ইমাস 24 24 কার্যকরভাবে এই ছোট্ট মোডগুলির জন্য এই বিকল্পটি তৈরি করেছে, আমি এখনও (recentf-mode 1)স্পষ্ট যুক্তি দিয়ে লিখতে আগ্রহী হব , যাতে ইমাস 23 এর অধীনে কেউ যদি তাদের আরআইডি ফাইলটির পুনরায় মূল্যায়ন করে তবে মোডটি টগলিং শেষ না করে।
21

1

এরগোএম্যাকসের একটি ফাংশন রয়েছে close-current-bufferযা বিশেষত সম্প্রতি বন্ধ হওয়া বাফারগুলির একটি তালিকা রাখে:

(defvar recently-closed-buffers (cons nil nil) "A list of recently closed buffers. The max number to track is controlled by the variable recently-closed-buffers-max.")
(defvar recently-closed-buffers-max 10 "The maximum length for recently-closed-buffers.")

(defun close-current-buffer ()
"Close the current buffer.

Similar to (kill-buffer (current-buffer)) with the following addition:

• prompt user to save if the buffer has been modified even if the buffer is not associated with a file.
• make sure the buffer shown after closing is a user buffer.
• if the buffer is a file, add the path to the list recently-closed-buffers.

A emacs buffer is one who's name starts with *.
Else it is a user buffer."
 (interactive)
 (let (emacsBuff-p isEmacsBufferAfter)
   (if (string-match "^*" (buffer-name))
       (setq emacsBuff-p t)
     (setq emacsBuff-p nil))

   ;; offer to save buffers that are non-empty and modified, even for non-file visiting buffer. (because kill-buffer does not offer to save buffers that are not associated with files)
   (when (and (buffer-modified-p)
              (not emacsBuff-p)
              (not (string-equal major-mode "dired-mode"))
              (if (equal (buffer-file-name) nil) 
                  (if (string-equal "" (save-restriction (widen) (buffer-string))) nil t)
                t
                )
              )
     ;; (progn ;; I'VE ADDED THIS LINE
     ;;   (switch-to-buffer (buffer-name)) ;; AND THIS LINE
     (if (y-or-n-p
          (concat "Buffer " (buffer-name) " modified; Do you want to save?"))
         (save-buffer)
       (set-buffer-modified-p nil))
     ;; ) ;; AND ALSO A PARENTHESIS HERE
     )

   ;; save to a list of closed buffer
   (when (not (equal buffer-file-name nil))
     (setq recently-closed-buffers
           (cons (cons (buffer-name) (buffer-file-name)) recently-closed-buffers))
     (when (> (length recently-closed-buffers) recently-closed-buffers-max)
           (setq recently-closed-buffers (butlast recently-closed-buffers 1))
           )
     )

   ;; close
   (kill-buffer (current-buffer))

   ;; if emacs buffer, switch to a user buffer
   (if (string-match "^*" (buffer-name))
       (setq isEmacsBufferAfter t)
     (setq isEmacsBufferAfter nil))
   (when isEmacsBufferAfter
     (next-user-buffer)
     )
   )
 )

সুতরাং এটি ব্যবহার করে এই সেশনটি বন্ধ বাফার দিয়ে আবার খুলতে পারে

;; undo close this-session buffer:
(defun ergo-undo-close-buffer ()
  "Opens some this-session closed buffer."
  (interactive)
  (let* ((mylist (delq nil (delete-dups (mapcar 'car recently-closed-buffers))))
         (baseName (ido-completing-read "Open this session closed buffer: " mylist))
         (fileName (cdr (assoc baseName recently-closed-buffers))))
    (find-file fileName)))

1

সম্পাদনা: উত্তর দেওয়ার সময় আমি মনোযোগ দিলাম না, এবং ওপি জিজ্ঞাসা করলো না এমন অন্য কোনও উত্তর দিয়েছিল। আবারও আমি দুঃখিত। আপনার শব্দগুলির জন্য আপনাকে ধন্যবাদ, কোডি চ্যান।

ঠিক আছে, আমি কোনও ইম্যাক্স প্রবীণ নই, এবং সম্ভবত এটি সাম্প্রতিক সংস্করণগুলিতে উপলভ্য হয়েছে। আমি জানি যে আমি কয়েক বছর পরে আসছি, তবে এটি অন্যের পক্ষে সহায়ক হতে পারে, যেহেতু আমার অনুসন্ধান আমাকে এখানে পেয়েছে।

আমি ইমাস ভিভি 25.2.1 এ আছি, recentfইতিমধ্যে এখানে উপলব্ধ এবং একটি প্রস্তুত ফাংশন রয়েছে যা আপনার প্রয়োজন অনুযায়ী করে। আমি ইতিমধ্যে এটি পুরানো সংস্করণগুলিতে ইতিমধ্যে সক্রিয় করেছি, তাই আমার .emacsরয়েছে:

(recentf-mode 1)
(global-set-key (kbd "C-S-t") 'recentf-open-most-recent-file)

এবং এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে। অবশ্যই, যা আপনাকে আরও সন্তুষ্ট করে তার জন্য শর্টকাট পরিবর্তন করুন।


2
দেখে মনে হচ্ছে ফাংশনটি ইতিমধ্যে অনেক আগে থেকেই ছিল যা ইমাস সোর্স কোড ট্রিতে চেঞ্জলগ ফাইল অনুসারে 2005 is এটি কাজ করে, এবং এটি পূর্ববর্তী ইমাস সেশন থেকে বদ্ধ বাফার পুনরায় খোলার জন্যও কাজ করতে পারে, তবে মনে হয় এটি বন্ধ তালিকাভুক্ত বাফারগুলি তালিকা থেকে আমাকে তালিকা থেকে একটি বেছে নিতে দেয় না।
কোডিচান

2
সুতরাং এটি কেবলমাত্র খুন হওয়া বাফারটিকে বিশেষত পুনরায় খোলে না তবে সম্প্রতি খোলা ফাইলগুলি আবার খোলে।
কোডিচান

@ কোডিচান, আমি খুব দুঃখিত এবং অবশ্যই আপনি ঠিক বলেছেন। এটি সর্বাধিক খোলা ফাইল হবে এবং আপনি যা চেয়েছিলেন তা নয়। আমি শীঘ্রই উত্তরটি মুছব, আমি আপনাকে এবং অন্যান্য সাথীদের কাছে ক্ষমা চাই।
চার্লস রবার্তো কানাটো

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