বিভিন্ন প্রকল্পের জন্য পৃথক পৃথক স্টাইল


29

আমি অনন্য ইন্ডেন্টেশন শৈলীর সাথে বিভিন্ন সি প্রকল্পে কাজ করি। .dir-locals.elফাইলগুলি সহ প্রবাহিত প্রকল্পের গাছগুলিকে দূষিত না করে আমি প্রতি-প্রকল্পের ইনডেন্টেশন সেটিংসে ইমাক্স কীভাবে পাব ? আমি ডিস্কে তাদের পথ ব্যবহার করে প্রকল্পগুলি মেলাতে চাই।


2
পরিবর্তে EditorConfig ব্যবহার সম্পর্কে .dir-locals.el। সহকর্মীরা কি এই ধারণাটি পছন্দ করতে পারেন?
welldan97

উত্তর:


21

.dir-locals.el এটি সম্ভব হলে আমার পছন্দের পদ্ধতিটি, বিশেষত এটি প্রকল্পে কাজ করা সমস্ত ইমাক ব্যবহারকারীদের ক্ষেত্রে প্রযোজ্য।

যে প্রকল্পগুলি ইমাস ব্যবহারকারীদের বিরুদ্ধ বা অন্যথায় .dir-locals.elফাইলগুলি চায় না , বা আপনি যদি ব্যক্তিগত পছন্দগুলি (সম্ভবত ইন্ডেন্টেশন না চান) চান যা অন্য ব্যক্তির ক্ষেত্রে প্রযোজ্য না হয়, আপনি যদি বিতরণকৃত সংস্করণ নিয়ন্ত্রণ ব্যবস্থা ব্যবহার করেন তবে একটি বিকল্প হ'ল আপনার সর্বদা ব্যক্তিগত শাখাগুলিতে কাজ করতে .dir-locals.el। তবে, আমি কোনও ডিসিভিএস ব্যবহার করার কোনও উপায় জানি না যা এটি বেদনাবিহীন করে তোলে।

অন্য বিকল্পটি .dir-locals.elফাইলগুলি পরীক্ষা না করা। উদাহরণস্বরূপ, গিট সহ, এটি যুক্ত করুন .git/info/exclude। অবশ্যই আপনার যদি কোনও প্রকল্পের অনেকগুলি চেকআউট থাকে তবে তা বেদনাদায়ক।

.dir-locals.elঅপশন ছিল না এমন জায়গায় আমি যা করেছি তা হ'ল একটি হুক যুক্ত করা যা buffer-file-nameজ্ঞাত মানগুলির বিরুদ্ধে দেখা যায়।

(defvar guessed-project nil)
(make-variable-buffer-local 'guessed-project)
(defun guess-project-from-file-name ()
  (save-match-data
    (setq guessed-project
          (cond
           ((string-match "/linux-kernel/" buffer-file-name)
            'linux-kernel)
           ((string-match "/gnu/" buffer-file-name)
            'gnu)
           ; etc.
          ))))
(defun c-my-project-hook ()
  (guess-project-from-file-name)
  (case guessed-project
    ((gnu) (c-sty-style 'gnu))
    ((linux-kernel) (c-sty-style 'linux))
  ))
(add-hook 'c-mode-hook 'c-my-project-hook)

(সতর্কতা: এখনই আমার আসল কোডটিতে আমার অ্যাক্সেস নেই বলে কোডটি সরাসরি আমার ব্রাউজারে টাইপ করা হয়))


2
যোগ .dir-locals.elকরা .git/info/excludeএকটি ভাল বিকল্প বলে মনে হচ্ছে ।
shosti

.gitignoreকোনও প্রকল্পের মূলের সাথে এটি যুক্ত করে কী ভুল ?
স্কোয়াডলি

@ কিছুই নয়, তবে কিছু প্রকল্প সেখানে সম্পাদক-নির্দিষ্ট ফাইল চায় না।
গিলস 14'13

গিট ব্যবহারকারীদের জন্য, আপনি এখানে .dir-locals.elআপনার গ্লোবাল গিটিগনরে যুক্ত করতে পারেন ~/.config/git/ignore
জেরেমি হিলার

7

আপনি llvm এবং linux এর মতো উজানের প্রকল্পগুলিকে একটিতে পরীক্ষা করতে রাজি করতে পারবেন না .dir-locals.el

সমস্যার একটি বিস্তৃত সমাধান:

(defmacro define-new-c-style (name derived-from style-alist match-path)
  `(progn
     (c-add-style ,name
                  '(,derived-from ,@style-alist))
     (add-hook 'c-mode-hook
               (lambda ()
                 (let ((filename (buffer-file-name)))
                   (when (and filename
                              (string-match (expand-file-name ,match-path) filename))
                     (c-set-style ,name)))))))

নিম্নলিখিত হিসাবে ব্যবহৃত:

(define-new-c-style "llvm" "gnu" ((fill-column . 80)
                                  (c++-indent-level . 2)
                                  (c-offsets-alist . ((innamespace 0))))
  "~/src/llvm")

(define-new-c-style "emacs" "gnu" nil "~/src/emacs")

অন্যান্য ভাষা মোডের জন্যও আমার একই রকম ম্যাক্রো রয়েছে।


6

বিভিন্ন প্রকল্পে .dir-local.el বিতরণ রক্ষণাবেক্ষণ করা কঠিন।

আমার উপায় বেশ সহজ, সমস্ত কোড এক one / .custom.el এ রাখুন।

মূলত, কোডটি প্রোগ-মোড-হুক (বা আপনার-যাই-বড়-মোড-মোড-হুক) তে চালানো হবে এবং নিম্নলিখিত জিনিসগুলি করুন:

  • ফাইলের পুরো পথে নির্দিষ্ট প্রকল্পের নাম রয়েছে কিনা তা বিশ্লেষণ করুন
  • যদি সত্য হয় তবে সেই প্রকল্পের জন্য সেটআপটি করুন (ইনডেন্টটি টিকিয়েট করা সহ)।

আমি এক বছর ধরে এই পদ্ধতিটি সফলভাবে ব্যবহার করছি।

এখানে কোডটি রয়েছে (প্রগ-মোড-হুকটিতে আমার সেটআপ-বিকাশ-পরিবেশকে কল করুন):

(defun my-project-name-contains-substring (REGEX)
  (let ((dir (if (buffer-file-name)
                 (file-name-directory (buffer-file-name))
               "")))
    (string-match-p REGEX dir)))

(defun my-office-code-style ()
  (interactive)
  (message "Office code style!")
  ;; web development
  (setq coffee-tab-width 4)
  (setq javascript-indent-level 4)
  (setq js-indent-level 4)
  (setq js2-basic-offset 4)
  (setq web-mode-indent-style 4)
  (setq web-mode-markup-indent-offset 4)
  (setq web-mode-css-indent-offset 4)
  (setq web-mode-code-indent-offset 4)
  )

(defun my-personal-code-style ()
  (interactive)
  (message "My personal code style!")
  (setq coffee-tab-width 4)
  (setq javascript-indent-level 2)
  (setq js-indent-level 2)
  (setq js2-basic-offset 2)
  (setq web-mode-indent-style 2)
  (setq web-mode-markup-indent-offset 2)
  (setq web-mode-css-indent-offset 2)
  (setq web-mode-code-indent-offset 2)
  )

(defun my-setup-develop-environment ()
  (interactive)
  (cond
   ;; company's project for ttag
   ((my-project-name-contains-substring "commerical-proj1")
    (my-office-code-style))
   ((my-project-name-contains-substring "hobby-proj1")
    (my-personal-code-style))
  )
)
(add-hook 'prog-mode-hook 'my-setup-develop-environment)

2

এটি করার স্বাভাবিক উপায়টি হ'ল ব্যবহার করা .dir-locals। এ কারণেই তাদের প্রথম স্থান দেওয়া হয়েছিল। কেন না? আমার জানা মতে, প্রকল্প সম্পর্কিত বেশিরভাগ সরঞ্জামগুলি তাদের কনফিগারগুলি মূল প্রকল্প ডিরেক্টরিতে রাখে: গিট, এসএনএন, এক্সলিপস এবং আরও অনেকগুলি ...

কেবল ফাইলটি .gitignoreবা অনুরূপ যুক্ত করতে ভুলবেন না ।


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