ক্লান্ত বাফারগুলিতে, সেই ডিরেক্টরিটির সর্বাধিক গুরুত্বপূর্ণ ফাইলটিতে পয়েন্ট করুন


14

আমি যখন ইমাসে একটি ডিরেক্টরি দেখি তার 90% সময় আমি প্রথম কাজটি একটি নির্দিষ্ট ফাইলের দিকে সরান এবং এটি খুলি। অনেক সময়, আমার যে ফাইলটি খুলতে হবে তা খুব অনুমানযোগ্য। এই ক্ষেত্রে:

  • .texএই ডিরেক্টরিতে যদি ফাইল থাকে তবে আমি সাধারণত সরাসরি চলে যাই master.tex
  • অ্যান্ড্রয়েড প্রকল্পগুলির মূলে, এটি সাধারণত AndroidManifest.xml
  • যে ডিরেক্টরিতে আমি ইমাস প্যাকেজ বিকাশ করি সেখানে প্রায়শই প্যাকেজের মূল উত্স ফাইল। এটি সাধারণত, তবে সর্বদা নয়, .elএই ডিরেক্টরিতে একমাত্র ফাইল।

আমি যখন এই ডিরেক্টরিগুলি খুলি তখন এই ফাইলগুলিতে স্বয়ংক্রিয়ভাবে পয়েন্ট রাখতে কোনও উপায় থাকতে পারে?

এটি প্রচুর সুবিধার্থে প্রস্তাব দেবে (যেহেতু আমি কেবল আঘাত করেই এগুলি খুলতে পারি RET) তবে অন্য ফাইলগুলিতে পরিদর্শন করার স্বচ্ছন্দতা দেয়।

উত্তর:


16

জন্য একটি কাস্টম ফাংশন লিখুন dired-initial-position-hook। এই ফাংশনটিতে আপনি ফাইলগুলি অনুসন্ধান করতে বিভিন্ন ডায়ার্ড ফাংশন ব্যবহার করতে পারেন এবং অবশেষে dired-goto-file"সেরা" ফাইলে পয়েন্টটি স্থানান্তর করতে কল করতে পারেন:

(defun my-dired-goto-important-file ()
  "Go to an important file in the current dired buffer."
  (unless (bound-and-true-p save-place)
    (let ((candidates '("master.tex" "AndroidManifest.xml"))
          candidate)
      (while (and candidates
                  (not (dired-goto-file (expand-file-name (pop candidates)))))
        nil))))

(add-hook 'dired-initial-position-hook #'my-dired-goto-important-file)

নিম্নলিখিতটিতে আমি এই ফাংশনের নির্দিষ্ট দিকগুলি ব্যাখ্যা করব এবং সম্ভাব্য এক্সটেনশনগুলি হাইলাইট করব।

ফাইলগুলিতে ঝাঁপ দাও

dired-goto-filenilবর্তমান ডায়ারড বাফারে যদি ফাইলটি না থাকে তবে ফিরে আসে , তাই পূর্বে পরীক্ষা না করে কল করা নিরাপদ। তবে এর dired-goto-fileজন্য প্রয়োজন একটি নিখুঁত ফাইলের নাম (এটি সম্পর্কিত ক্ষেত্রে ত্রুটিযুক্ত) expand-file-name

ফাইলগুলি অনুসন্ধান করা হচ্ছে

ডায়ার্ড ফাইল অনুসন্ধান করার জন্য একটি সরাসরি-ফরোয়ার্ড API সরবরাহ করে না। সাধারণত, আপনি যেমন বাফারে সমস্ত লাইনে পুনরাবৃত্তি করতে চান ঠিক তেমন সমস্ত ফাইলগুলিতে পুনরাবৃত্তি করতে পারেন:

(let (files)
  (goto-char (point-min))
  (while (not (eobp))
    (let ((filename (dired-get-filename nil 'no-error)))
      (when filename
        (push filename files)))
    (forward-line 1))
  ;; Now `files' is a list of files, which you can search for patterns
  ;; …
  )

তবে চিহ্নিতকরণের কার্যগুলি ব্যবহার করা আরও সুবিধাজনক। বিদ্যমান "ইন্টারেক্টিভ" চিহ্নগুলি শিথিল না করার জন্য কেবল একটি "অস্বাভাবিক" চিহ্নিতকারী অক্ষর ব্যবহার করার জন্য যত্ন নিন:

(unwind-protect
    (when (dired-mark-files-regexp (rx ".tex" string-end) ?t)
      (dired-goto-file (expand-file-name "master.tex")))
  (dired-unmark-all-files ?t))

স্থান মোড সংরক্ষণ করুন

আপনি যদি সক্ষম করে থাকেন তবে প্লেস মোড সংরক্ষণ করার ক্ষেত্রে আপনাকেও যত্নবান হওয়া দরকার। ডায়ার্ড বাফারে, সেভ প্লেস মোড অন্যান্য মোডের মতো পয়েন্টের মান মনে রাখে না, বরং শেষ ফাইলের নাম পয়েন্ট চালু ছিল। এটি আমাদের ফাইলের মতো এই ফাইলটির নাম পুনরুদ্ধার করে: এটি হুক করে dired-initial-position-hookএবং কল করে dired-goto-file(আসলে, আমি সেই কোডটি এখানেই চুরি করেছি :))।

যদি সংরক্ষণের জায়গার আগে আমাদের হুক আসে, প্লেস মোড মোড নিঃশর্তভাবে আমাদের অবস্থানটি ওভাররাইট করে। তবে এটি যদি আমাদের হুকের আগে আসে (যেমন আপনি যখন এই হুকটি সেটআপ করার পরে সেভ প্লেস সক্ষম করা হয় তখন) আমাদের ফাংশনটি সেভ প্লেসটি ওভাররাইট করে দেবে যা কাঙ্ক্ষিত নয়। তবে যে কোনও বাফারের মতো, সেভ প্লেস স্থানীয় ভেরিয়েবলটিকে save-placeএকটি নন-শিল মান হিসাবে সেট করে , তাই আমরা কেবল এটি যাচাই করতে পারি এবং কেবল এটির জন্য কাজ করতে পারি সেভ প্লেস কোনও ফাইলের নাম পুনরুদ্ধার করে নি।

যদি আপনার পরিবর্তে সেভ প্লেসটি “আলগা” থাকে তবে চেকটি সরিয়ে ফেলুন save-placeএবং সেভ প্লেসের পরে প্রথমে সেভ প্লেস মোড সক্ষম করে এবং add-hookতার তর্কটির জন্য একটি নন-মান সহ কল করে নিশ্চিত করুন যে আমাদের হুকটি সেভ প্লেসের পরে চালানো হবে APPEND


দুর্দান্ত উত্তর। আপনি সংজ্ঞায়িত করতে চাইতে পারেন bound-and-true-p। :-)
মালবারবাবা

@ মালাবারবা bound-and-true-pএকটি অন্তর্নির্মিত ম্যাক্রো bindings.el
লুনারিওর

প্রিয় godশ্বর, আমি যেটি খারাপ বোধ করি তা আমি করি না, সত্য আমি তা জানতাম না বা সত্য যাচাই করি না।
মালবারবা

@ মালবারবা কিছু মনে করবেন না, এই ফাংশনটির অস্তিত্ব আবিষ্কার করতে আমার এক বছর (আক্ষরিক) সময় লেগেছে।
লুনারিওর

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