পূর্বাবস্থায় ফিরে না গিয়ে বাফারকে কীভাবে সংশোধন করবেন?


11

প্রশ্ন: আমি কীভাবে undoলক্ষ্য না করে বাফারে পাঠ্য সন্নিবেশ / পরিবর্তন করতে পারি ?

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

আমি undoএখানে সংক্ষিপ্ত-সার্কিট করতে চাইছি কারণটি নিম্ন প্রান্তের মামলার কারণে ঘটে যা ল্যাটেক্স নথিগুলি সম্পাদনা / সংকলন করার সময় উপস্থিত হয় (এবং সম্ভবত অন্যরাও, তবে এটিই আমাকে ঘন ঘন বাদাম চালায়):

  1. এটি সংকলিত ডকটিতে কীভাবে প্রভাব ফেলবে তা দেখতে ফাইলটিতে একটি ছোট্ট পরিবর্তন করুন
  2. ফাইলটি সংরক্ষণ করুন (যা টাইমস্ট্যাম্প আপডেট করে)
  3. latexফাইল চালান
  4. সিদ্ধান্ত নিন যে পরিবর্তনটি খারাপ
  5. undo পরিবর্তন

পদক্ষেপ (5) ( undo) এ সমস্যাটি হ'ল এটি ধাপে (1) পরিবর্তিত হওয়াটিকে পূর্বাবস্থায় ফিরিয়ে আনবে না, বরং ধাপে (2) টাইমস্ট্যাম্প আপডেট করে পূর্বাবস্থায় ফিরে আসবে। এটি আমাকে বিরক্ত করবে না (কেবলমাত্র আমি undoআবারও করতে পারছিলাম ) ব্যতীত এটি ফাইলের শীর্ষে থাকা টাইমস্ট্যাম্পের সমস্ত পয়েন্টও সরায় যা প্রায় সবসময়ই প্রকৃত পরিবর্তন থেকে অনেক লাইন দূরে থাকে। এটি খুব ঝাঁকুনির সাথে আমার ঘনত্বকে পুরোপুরি ভেঙে দেয়।

আমি যে ফাইলটি ঘুরে দেখছি তাতে শ্রদ্ধার সাথে প্রশ্নটি দিচ্ছি, তবে এটি সাধারণত বাফারগুলি সংশোধন করার বিষয়ে।

সুতরাং: আমি কীভাবে undoকোনও বাফারে একটি নির্দিষ্ট পরিবর্তন লক্ষ্য করে বাধা দিতে পারি ?


1
এটি আপনার পূর্বাবস্থা প্রশ্নের সাথে সম্পর্কিত করা হয় না, কিন্তু এটা "বিন্দু পূর্বাবস্থা প্যাচসমূহ" সমস্যার সাথে সাহায্য করতে পারেন: stackoverflow.com/a/20510025/1279369
আয়া

2
এই তারিখ-স্ট্যাম্প পরিবর্তনটি পূর্বাবস্থায় ইতিহাসের সবচেয়ে সাম্প্রতিক আইটেমে সংযুক্ত করা ভাল কি হবে না? এই উপায় undoউভয় পূর্বাবস্থা হবে।
মালবারবা

আমার মনে হয় আপনি যা চান তা হ'ল atomic-change-group

@ জোহান: এটি কীভাবে সাহায্য করবে? গ্রুপে দুটি পরিবর্তন পৃথক কমান্ড দ্বারা ট্রিগার করা হয়: একটি "ছোট পরিবর্তন" (যেমন একটি সন্নিবেশ) এবং সংরক্ষণের সময় করা স্ট্যাম্পের আপডেট ating
গিলস 'অশুভ হওয়া বন্ধ করুন'

মনে রাখবেন যে কোনও কারণে বিদ্যমান উত্তরের মধ্যে এই পদ্ধতিগুলির কোনওটিই আমার পক্ষে কাজ করে নি, তবে এই উত্তরটি একটি with-undo-collapseম্যাক্রো সংজ্ঞায়িত করেছে যা খুব দরকারী ছিল: emacs.stackexchange.com/a/7560/2418
ਵਿਚਾਰ

উত্তর:


6

@ এসটিএসকোয়াডের উত্তর আমাকে সঠিক পথে পেয়েছে। মূলত, পদক্ষেপগুলি হ'ল:

  1. সংরক্ষণ buffer-undo-list
  2. নিষ্ক্রিয় undo
  3. আপনার জিনিস করতে
  4. পুনরায় সক্ষম undoএবং পুনরুদ্ধারbuffer-undo-list

সুতরাং এখানে যেমন একটি ফাংশন এর স্কেচ:

(defun disable-undo-one-off ()
  (let ((undo buffer-undo-list))        ; save the undo list
    (buffer-disable-undo)               ; disable undo
    (do-some-stuff)                     ; do your thing
    (buffer-enable-undo)                ; re-enable undo
    (setq buffer-undo-list undo)))      ; restore the undo list

সম্পাদনা: প্রকৃতপক্ষে, দেখা যাচ্ছে যে একটি সহজ সমাধান এখনও সরল- letবাঁধা buffer-undo-listযাতে letমূল তালিকাটি পুনঃস্থাপনের সময় ক্লোবারড হয়ে যাওয়ার শরীরের তালিকায় পরিবর্তিত হয় :

(defun disable-undo-one-off ()
  (let (buffer-undo-list)
    (do-some-stuff)))

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


আপনি যদি আপনার জিনিসটির মধ্য দিয়ে মাঝামাঝি কার্যকলাপটি ভেঙে দেন তবে আপনি এটি অনিচ্ছাকৃতভাবে সুরক্ষিত রাখতে চাইতে পারেন। আমি বুঝতে পারি নি যে আপনি কোনও ফাংশনে এই সমস্ত করছেন যা জিনিসপত্রের ট্র্যাক রাখা সহজ করে তোলে।
stsquad

পূর্বাবস্থার ইতিহাসটি আপডেট না করার জন্য আপনি কি টাইম-স্ট্যাম্প আপডেটের সমাধানটিতে যুক্ত করতে পারেন (এবং যদি সম্ভব হয় তবে ইতিহাসের ইতিহাস)?
দক্ষ মোদী

@ অ্যাসোস্কোড: ভাল ধারণা, পরে এটি করার চেষ্টা করবে। ফাংশন এবং প্রশ্নের তালিকায় টিপ-অফ করার জন্য আবার ধন্যবাদ।
ড্যান

@ কৌশালমোদি: স্পষ্ট করে প্রশ্ন: আপনি প্রকৃত টাইমস্ট্যাম্প আপডেটের কার্যকারিতাটি দেখতে চান?
ড্যান

@ ড্যান কী করতে চান যে কীভাবে টাইমস্ট্যাম্প আপডেট ফাংশনটি পূর্বাবস্থায় ফিরিয়ে আনতে বা বিন্দুর ইতিহাস আপডেট করতে হবে না।
कुशल মোদী

3

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

(defun time-stamp-group-undo ()
  (if (eq nil (car buffer-undo-list))
      (setq buffer-undo-list (cdr buffer-undo-list)))
  (time-stamp))

(সতর্কতা: অপরিশোধিত, পূর্বাবস্থায় ফিরতে তালিকার আরও ম্যাসেজের প্রয়োজন হতে পারে))

আপনি টাইমস্ট্যাম্প আপডেটের জন্য অবস্থান এন্ট্রি (একটি পূর্ণসংখ্যার) সংশোধন করেও পূর্বে তালিকার সাথে আলাদাভাবে খেলতে পারেন ।

¹ গ্রুপ সন্নিবেশ একটি অনুরূপ অপসারণ করে। self-insert-command


2

আপনার প্রস্তাবিত সমস্যাটি হ'ল পূর্বাবস্থায় গাছ আপনি যেখানে থাকতে চান সেখান থেকে ডেল্টাসের একটি তালিকা। যদিও কোনও বাফারে পূর্বাবস্থায় ফিরে আসা অক্ষম করা পুরোপুরি সম্ভব তবে সক্রিয়ভাবে পরিবর্তন রেকর্ডিং না করার প্রভাব কী হবে তা আমি নিশ্চিত নই। আমার কাছে বর্তমানে একটি নির্দিষ্ট বাফারকে পূর্বাবস্থা চালু / বন্ধ করতে একটি টগল রয়েছে কারণ এটি বর্ধমান লগ বা রিফ্রেশ পৃষ্ঠায় পূর্বাবস্থায় ফিরে আসা তথ্যটি বোধগম্য নয়। তবে এটি টগল পরিবর্তনগুলি nixes:

(defun my-toggle-buffer-undo ()
  "Toggle undo tracking in current buffer."
  (interactive)
  (with-current-buffer (current-buffer)
    (if (eq buffer-undo-list t)
        (setq buffer-undo-list nil)
      (buffer-disable-undo (current-buffer)))))

(define-key my-toggle-map "u" 'my-toggle-buffer-undo)

বাফার-অক্ষম-পূর্বাবস্থা আসলে শুধু সেট করে বাফার-পূর্বাবস্থা-তালিকা থেকে শূন্য । আপনি যদি টগল করে বাফার-পূর্বাবস্থা-তালিকার রাজ্যটি সংরক্ষণ করেন তবে আপনি এটি পরে পুনরুদ্ধার করতে পারবেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.