ডেইজি চেইন .dir-local.el ফাইলগুলি করার কোনও উপায় আছে?


15

মনে করুন এই ফাইলগুলির সাথে আমার একটি ডিরেক্টরি আছে।

/foo/bar/baz/.dir-locals.el
/foo/bar/.dir-locals.el
/foo/.dir-locals.el

আমি যখন কোনও ফাইল তৈরি করতে যাই /foo/bar/baz/, আমি তাদের সাথে ডেইজি চেইন তৈরি করতে চাই যা /foo/.dir-locals.elপ্রথমে প্রযোজ্য এবং তারপরে /foo/bar/.dir-locals.elএবং তারপরে এবং তারপরে/foo/bar/baz/.dir-locals.el



এমন কোনও বিকল্প নেই যা করতে পারে (আমি কোডটি বেশ ভাল করে দেখলাম), তবে এটি কিছুটা অতিরিক্ত কোডের সাথেই (প্রায় অবশ্যই সম্ভব) হওয়া উচিত । আমারও এটির একটি ব্যবহার রয়েছে, তাই আমি এটি সন্ধান করতে পারি ...
কনস্টান্টাইন

এলিসপ দিয়ে, সমস্ত কিছু সম্ভব। :)
এরিক জনসন

উত্তর:


7

উত্তর ভিত্তিক এখানে , আমরা পরামর্শ করে এটি করতে hack-dir-local-variablesএকটি ডিরেক্টরী আপ এবং লোড চেক দেখুন যদি .dir-locals.elফাইল পাঠযোগ্য। এটি অব্যাহত থাকবে যতক্ষণ না এটি পঠনযোগ্য কোনও ডিরেক্টরি খুঁজে না পায় .dir-locals.el

walk-dir-locals-upwardফাইলগুলির মানের উপর নির্ভর করে বর্তমান ডিরেক্টরি থেকে wardর্ধ্বমুখী বা শেষের থেকে .dir-locals.elনিচের দিকে পাওয়া যায়। নিম্নমুখী হ'ল ডিফল্ট যাতে সাব-ডিরেক্টরিগুলি তাদের পিতামাতার সেটিংস ক্লোবার করতে পারে।

(defvar walk-dir-locals-upward nil
  "If non-nil, evaluate .dir-locals.el files starting in the
  current directory and going up. Otherwise they will be
  evaluated from the top down to the current directory.")

(defadvice hack-dir-local-variables (around walk-dir-locals-file activate)
  (let* ((dir-locals-list (list dir-locals-file))
         (walk-dir-locals-file (first dir-locals-list)))
    (while (file-readable-p (concat "../" walk-dir-locals-file))
      (progn
        (setq walk-dir-locals-file (concat "../" walk-dir-locals-file))
        (add-to-list 'dir-locals-list walk-dir-locals-file
                     walk-dir-locals-upward)
        ))
    (dolist (file dir-locals-list)
      (let ((dir-locals-file (expand-file-name file)))
        (message dir-locals-file)
        ad-do-it
        )))
  )

এই আশা যে গাছ (আপ বর্তমান পথ থেকে কিছু স্তর পর্যন্ত) প্রতিটি ডিরেক্টরির একটি আছে বলে মনে হয় .dir-locals.el। আমার যদি ডিরেক্টরিগুলির একটি ট্রি a/b/cথাকে এবং সেখানে উপস্থিত থাকে a/.dir-locals.elএবং এটি কার্যকর হয় a/b/c/.dir-locals.elতবে a/b/.dir-locals.el(না ধরে নিই যে আমি পরিদর্শন করছি a/b/c/foo.elএবং আমি সেটিংস a/.dir-locals.elপ্রয়োগ করতে চাই )?
কনস্টান্টাইন

1
হ্যাঁ, আমি এটিই ধরে নিচ্ছি। নিখোঁজ দির-স্থানীয়রা a/b/চেইন ভাঙছে। এটি কোথাও থামতে হবে এবং আপনি যদি এটি চালিয়ে যেতে চান তবে আপনি একটি খালি দির-লোকাল ফাইল যুক্ত করতে পারেন।
এরিকস্টোক

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

6

এটি করার একটি আলাদা উপায় এখানে।

আমি একটি ফাংশন সংজ্ঞায়িত করি যা বর্তমান ডিরেক্টরি শ্রেণিবদ্ধের সমস্ত ডিরেক্টরিগুলির তালিকা তৈরি করে।

(defun file-name-directory-nesting-helper (name previous-name accumulator)
  (if (string= name previous-name)
      accumulator                       ; stop when names stop changing (at the top)
      (file-name-directory-nesting-helper
       (directory-file-name (file-name-directory name))
       name
       (cons name accumulator))))

(defun file-name-directory-nesting (name)
  (file-name-directory-nesting-helper (expand-file-name name) "" ()))

একটি উদাহরণ ক্রমযুক্ত:

(file-name-directory-nesting "/foo/bar/baz/quux/foo.el")
;; => ("/" "/foo" "/foo/bar" "/foo/bar/baz" "/foo/bar/baz/quux" "/foo/bar/baz/quux/foo.el")

এখন hack-dir-local-variablesএটিকে "ভান" করার পরামর্শের জন্য আমি যুক্ত করতে পারি যে আমরা গাছের একেবারে শীর্ষে একটি ফাইল পরিদর্শন করছি, ডিরেক্টরি-স্থানীয় সেটিংস প্রয়োগ করব, তারপরে এক স্তর থেকে নীচে নামব, আবার সেটিংস প্রয়োগ করুন এবং এই জাতীয় কিছু।

(defun hack-dir-local-variables-chained-advice (orig)
  "Apply dir-local settings from the whole directory hierarchy,
from the top down."
  (let ((original-buffer-file-name (buffer-file-name))
        (nesting (file-name-directory-nesting (or (buffer-file-name)
                                                  default-directory))))
    (unwind-protect
        (dolist (name nesting)
          ;; make it look like we're in a directory higher up in the
          ;; hierarchy; note that the file we're "visiting" does not
          ;; have to exist
          (setq buffer-file-name (expand-file-name "ignored" name))
          (funcall orig))
      ;; cleanup
      (setq buffer-file-name original-buffer-file-name))))

(advice-add 'hack-dir-local-variables :around
            #'hack-dir-local-variables-chained-advice)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.