Org- মোডে উত্স ফাইলগুলি অন্তর্ভুক্ত করার সময় কীভাবে শুরু এবং শেষ লাইনগুলি গণনা করবেন?


10

আমার ডকুমেন্টেশনে আমার নীচে রয়েছে:

#+INCLUDE: "code/basic.sv" :src systemverilog :lines "14-117"

এখানে 14 লাইনটি আমার রয়েছে class basic extends ..এবং 116 লাইনটি আমার কাছে রয়েছে endclass

14 এবং 117 (= 116 + 1) নম্বরগুলিতে অটো toোকানোর কোনও উপায় আছে যাতে প্রতিবার আমি যখন সংশোধন করব তখন আমাকে সেগুলি ম্যানুয়ালি আপডেট করতে হবে না code/basic.sv?


সুতরাং আপনি কি সর্বদা এটি ক্লাস থেকে এন্ডক্লাসে যেতে চান?
মালবারবা

1
না। এটি একটি উদাহরণ ছিল। আমি এমন একটি সমাধানের কথা ভাবছি যেখানে আমি শুরু এবং শেষ রেখাগুলির জন্য রেইগেক্স সরবরাহ করতে পারি .. কোনও অনুষ্ঠানের মূল্যায়ন করা হবেorg-include-src(FILE, LANGUAGE, REGEX_BEGIN, REGEX_END)
দক্ষ মোদী

একটি উপায় হ'ল অন্তর্ভুক্ত ফাইলটিতে কিছু প্রকারের অনন্য চিহ্নিতকারী (শেষ হওয়া) স্থাপন এবং একটি ফাংশন সহ তাদের সন্ধান করুন যা org-export-before-processing-hookলাইন সংখ্যার জন্য প্রিপ্রোসেসে আবদ্ধ হবে। আর একটি উপায় হ'ল org মেলিং তালিকায় একটি বৈশিষ্ট্য অনুরোধ মেল প্রেরণ করুন :)
কিন্ডেরো

উত্তর:


8

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

ব্যবহার করা

আপনার org-file এ নিম্নলিখিতগুলির মতো কিছু করুন। ( :linesমূলশব্দটি alচ্ছিক)

#+INCLUDE: "code/my-class.sv" :src systemverilog :range-begin "^class" :range-end "^endclass" :lines "14-80"

ফাংশনটি "my-class.sv" পরিদর্শন করবে এবং সেই দুটি regexps অনুসন্ধান করবে এবং তারপরে এটি :linesম্যাচের ফলাফল অনুসারে কীওয়ার্ডটি আপডেট করবে ।

যদি :range-beginঅনুপস্থিত, ব্যাপ্তি হতে হবে "-80"।
যদি :range-endঅনুপস্থিত, ব্যাপ্তি হতে হবে "14-"।

কোড

(add-hook 'before-save-hook #'endless/update-includes)

(defun endless/update-includes (&rest ignore)
  "Update the line numbers of #+INCLUDE:s in current buffer.
Only looks at INCLUDEs that have either :range-begin or :range-end.
This function does nothing if not in org-mode, so you can safely
add it to `before-save-hook'."
  (interactive)
  (when (derived-mode-p 'org-mode)
    (save-excursion
      (goto-char (point-min))
      (while (search-forward-regexp
              "^\\s-*#\\+INCLUDE: *\"\\([^\"]+\\)\".*:range-\\(begin\\|end\\)"
              nil 'noerror)
        (let* ((file (expand-file-name (match-string-no-properties 1)))
               lines begin end)
          (forward-line 0)
          (when (looking-at "^.*:range-begin *\"\\([^\"]+\\)\"")
            (setq begin (match-string-no-properties 1)))
          (when (looking-at "^.*:range-end *\"\\([^\"]+\\)\"")
            (setq end (match-string-no-properties 1)))
          (setq lines (endless/decide-line-range file begin end))
          (when lines
            (if (looking-at ".*:lines *\"\\([-0-9]+\\)\"")
                (replace-match lines :fixedcase :literal nil 1)
              (goto-char (line-end-position))
              (insert " :lines \"" lines "\""))))))))

(defun endless/decide-line-range (file begin end)
  "Visit FILE and decide which lines to include.
BEGIN and END are regexps which define the line range to use."
  (let (l r)
    (save-match-data
      (with-temp-buffer
        (insert-file file)
        (goto-char (point-min))
        (if (null begin)
            (setq l "")
          (search-forward-regexp begin)
          (setq l (line-number-at-pos (match-beginning 0))))
        (if (null end)
            (setq r "")
          (search-forward-regexp end)
          (setq r (1+ (line-number-at-pos (match-end 0)))))
        (format "%s-%s" l r)))))

2
এটা অসাধারণ! এখন আমি একই ফাইল থেকে একাধিক স্নিপেট রফতানি করতে এটি ব্যবহার করতে পারি। স্নিপেট 1: #+INCLUDE: "code/basic.sv" :src systemverilog :range-begin "// Example 1" :range-end "// End of Example 1"। স্নিপেট 2: #+INCLUDE: "code/basic.sv" :src systemverilog :range-begin "// Example 2" :range-end "// End of Example 2"। ফাঁসি ফাঁসি! এই দ্রুত বাস্তবায়নের জন্য ধন্যবাদ !
দক্ষ মোদী

5

আমি সবচেয়ে ভাল উপায়টি ভাবতে পারি তা হ'ল এই সংখ্যাগুলি রফতানির আগে বা মূল্যায়ণের আগে আপডেট করা।

আপডেটার

এটি ফাংশন যা বাফারের মধ্য দিয়ে যায়। আপনি এটি একটি কীতে বাঁধতে পারেন, বা এটি একটি হুকের সাথে যুক্ত করতে পারেন। আপনি যখনই ফাইলটি সংরক্ষণ করেন নীচের কোডগুলি লাইনগুলিকে আপডেট করে তবে আপনার ব্যবহারের কেসটি যদি আলাদা হয় তবে আপনার কোন হুকটি দরকার তা সন্ধান করুন! (org- মোড হুক পূর্ণ হয়)

(add-hook 'before-save-hook #'endless/update-includes)

(defun endless/update-includes (&rest ignore)
  "Update the line numbers of all #+INCLUDE:s in current buffer.
Only looks at INCLUDEs that already have a line number listed!
This function does nothing if not in org-mode, so you can safely
add it to `before-save-hook'."
  (interactive)
  (when (derived-mode-p 'org-mode)
    (save-excursion
      (goto-char (point-min))
      (while (search-forward-regexp
              "^\\s-*#\\+INCLUDE: *\"\\([^\"]+\\)\".*:lines *\"\\([-0-9]+\\)\""
              nil 'noerror)
        (let* ((file (expand-file-name (match-string-no-properties 1)))
               (lines (endless/decide-line-range file)))
          (when lines
            (replace-match lines :fixedcase :literal nil 2)))))))

রিজেক্সপস

এটিই আপনি পুনরায় সংজ্ঞা নির্ধারণ করেছেন যা অন্তর্ভুক্ত হওয়ার জন্য প্রথম এবং শেষ লাইন হিসাবে ব্যবহৃত হবে। আপনি প্রতিটি ফাইলের এক্সটেনশনের জন্য রেজিেক্সপগুলির একটি তালিকা দিতে পারেন।

(defcustom endless/extension-regexp-map 
  '(("sv" ("^class\\b" . "^endclass\\b") ("^enum\\b" . "^endenum\\b")))
  "Alist of regexps to use for each file extension.
Each item should be
    (EXTENSION (REGEXP-BEGIN . REGEXP-END) (REGEXP-BEGIN . REGEXP-END))
See `endless/decide-line-range' for more information."
  :type '(repeat (cons string (repeat (cons regexp regexp)))))

পটভূমি কর্মী

এই লোকটিই বেশিরভাগ কাজ করে।

(defun endless/decide-line-range (file)
  "Visit FILE and decide which lines to include.
The FILE's extension is used to get a list of cons cells from
`endless/extension-regexp-map'. Each cons cell is a pair of
regexps, which determine the beginning and end of region to be
included. The first one which matches is used."
  (let ((regexps (cdr-safe (assoc (file-name-extension file)
                                  endless/extension-regexp-map)))
        it l r)
    (when regexps
      (save-match-data
        (with-temp-buffer
          (insert-file file)
          (while regexps
            (goto-char (point-min))
            (setq it (pop regexps))
            (when (search-forward-regexp (car it) nil 'noerror)
              (setq l (line-number-at-pos (match-beginning 0)))
              (when (search-forward-regexp (cdr it) nil 'noerror)
                (setq regexps nil
                      r (line-number-at-pos (match-end 0))))))
          (when r (format "%s-%s" l (+ r 1))))))))

1
আমি যদি পরামর্শ দিতে পারি তবে দুটি ফাংশনকে কমিয়ে আনুন এবং তারপরে এমএক্সের সাথে প্রথমটিকে অনুরোধ করুন। এটি খুব তথ্যপূর্ণ হওয়া উচিত। :-)
মালবারবা

নিজেই ফাংশনটি সূক্ষ্মভাবে চলে। তবে হুককে যে ফাংশনটি কল করছে তার একটি যুক্তি পাস করতে হবে। ডক্স থেকে জন্য org-export-before-processing-hook, Every function in this hook will be called with one argument: the back-end currently used, as a symbol। যেহেতু আমরা কোনও তর্কটি পাস করছি না, আমরা ত্রুটি পেয়েছি run-hook-with-args: Wrong number of arguments। এখন আমি নিশ্চিত নই কি যুক্তিতে যুক্ত হব endless/update-includes... (&optional dummy)?
দক্ষ মোদী

@ কুশলমোদি উফ, আমার খারাপ। আমি উত্তর আপডেট করেছি। আপনি নিজের লেখা জিনিসটি ব্যবহার করতে পারেন।
মালাবারবা

ঠিক আছে .. যুক্ত (&optional dummy)আসলে কাজ! হুকের মাধ্যমে ফাংশনটি কল করার একটি আকর্ষণীয় পার্শ্ব-প্রতিক্রিয়া। যদি আমি ব্যবহার করে ফাংশনটি কল করি তবে এটি আপডেট হওয়া লাইন নম্বরগুলির M-xসাহায্যে .orgফাইলটি পরিবর্তন করে । তবে যদি আমি কেবল এইচটিএমএল রফতানি করি এবং হুককে ফাংশনটি কল করার অনুমতি দিই, আপডেট হওয়া লাইন নম্বরগুলি কেবল রফতানি হওয়া ফাইলটিতে প্রতিফলিত হয়, .orgফাইলটিতে নয়।
দক্ষ মোদী

@ কৈশালমোদি হ্যাঁ, এইভাবেই org হুক কাজ করে। এর পরিবর্তে আপনি এটিকে পূর্ব-সংরক্ষণ-হুকটিতে যুক্ত করতে পারেন।
মালবারবা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.