একটি ছোটখাটো মোডে জটিল সিনট্যাক্স হাইলাইট কিভাবে যুক্ত করবেন?


10

আমি একটি ছোটখাটো মোডে বিভিন্ন মুখের সাথে কোডটি হাইলাইট করতে চাই।

এখানে একটি স্ক্রিনশট যা আমি চাই তার নিকটবর্তী:

পাইথন-সিনট্যাক্স-হাইলাইট

একটি জিনিস যা আমি মিস করছি তা মন্তব্যে অন্তর্ভুক্ত #রয়েছে font-lock-comment-face। ধারণাটি এমন মন্তব্য করা উচিত যা প্লেইন পাঠ্য হিসাবে হাইলাইট করা একটি রূপরেখার সাথে "সম্পর্কিত", তাই এটি পড়া সহজ। তাদের স্বাভাবিক কম বিশিষ্ট মুখের সাথে নিয়মিত মন্তব্য করার সময়।

আমি যে কোডটি ব্যবহার করেছি তা এখানে:

(setq-local font-lock-defaults
            '(python-font-lock-keywords
              nil nil nil nil
              (font-lock-syntactic-face-function
               . lpy-font-lock-syntactic-face-function)))

(defun lpy-font-lock-syntactic-face-function (state)
  "Return syntactic face given STATE.
Returns 'defalt face for comments that belong to an outline."
  (cond ((nth 3 state)
         (if (python-info-docstring-p state)
             font-lock-doc-face
           font-lock-string-face))
        ((save-excursion
           (while (and (> (point) (point-min))
                       (progn (move-beginning-of-line 0)
                              (eq (char-after) ?\#))))
           (forward-line 1)
           (looking-at "#\\*+ "))
         'default)
        (t
         font-lock-comment-face)))

জিনিসটি হ'ল, ইন্টারফেসটি কীভাবে font-lock-syntactic-face-functionপরিচালিত হয় সে সম্পর্কে আমার কোনও ধারণা নেই , এটি একটি জটিল ডেটা স্ট্রাকচার গ্রহণ করে state, আলাদা পয়েন্ট স্টেট থাকে এবং একটি চেহারা দেয়।

কেউ এই ইন্টারফেস ব্যাখ্যা করতে পারে? এর চেয়ে ভাল আর কি আছে?

উত্তর:


6

font-lock-syntactic-face-functionহ'ল ফন্ট লক থেকে নিয়মিত পরিবর্তনশীল, বিশেষত সিনট্যাকটিক ফন্ট লক ফেজ (জোর দেওয়া খনি) থেকে:

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

ফাংশনটিকে একটি যুক্তি দিয়ে ডাকা হয়, পার্স স্টেটটি বিন্দুতে ফিরে আসে parse-partial-sexpএবং একটি মুখ ফিরানো উচিত । ডিফল্ট মান মন্তব্যগুলির জন্য ফন্ট-লক-মন্তব্য-মুখ এবং স্ট্রিংগুলির জন্য ফন্ট-লক-স্ট্রিং-চেহারা দেয় (ফন্ট লকের জন্য মুখগুলি দেখুন)।

parse-partial-sexpপরিবর্তে ইম্যাক্সের বর্তমান সিনট্যাকটিক অবস্থা বর্ণনা করে এমন একটি তালিকা প্রত্যাবর্তন করে যা মূলত বর্তমান বাফারে সিনট্যাক্স টেবিল প্রয়োগের ফলাফল। তালিকাটি বরং জটিল, সুতরাং আমি এটিকে এখানে ছাড়ব; আপনি ডক্ট্রিংয়ে সম্পূর্ণ রেফারেন্স দেখতে পারেন parse-partial-sexp। এই ফাংশনটির উদ্দেশ্য হ'ল নির্দিষ্ট নিয়মের অধীনে সিনট্যাকটিক উপাদানটিতে প্রয়োগ করা মুখ পরিবর্তন করা। আপনার ক্রিয়াকলাপের সূচনাটি এটি দেখায়: বর্তমান স্ট্রিং যদি একটি ডক্ট্রিং হয় তবে এর জন্য আলাদা মুখ ব্যবহার করুন।

যাইহোক, মুখটি সর্বদা পুরো সিনট্যাকটিক উপাদান, অর্থাৎ পুরো স্ট্রিং বা মন্তব্যের ক্ষেত্রে প্রযোজ্য । আপনি এই ক্রিয়াকলাপের সাথে পৃথক অংশ হাইলাইট করতে পারবেন না এবং আপনার stateউদ্দেশ্যটিতে যেমন দেওয়া হয়েছে তেমনই আপনার দৃষ্টি দেওয়া উচিত (python-info-docstring-p state)। এই জায়গায় পয়েন্ট ব্যবহার করবেন না ; আমি এমনকি pointফন্ট লকিংয়ের এই পর্যায়ে মান সঠিকভাবে সংজ্ঞায়িত করা হয়েছে তা নিশ্চিত না ।


টুকরা একসাথে রেখে, আপনি নিজের উদ্দেশ্যে ভুল ফাংশন ব্যবহার করছেন, যার কারণে আপনি এটি কাজ করতে পারবেন না।

আমি আপনার পছন্দসই হাইলাইটিং বাস্তবায়নের চেষ্টা করি নি, তবে আমি মনে করি আপনি নিজের উদ্দেশ্যে খুব গভীরভাবে পথ খনন করেছেন। যদি আমি জিনিসগুলি যথাযথভাবে বুঝতে পারি তবে আপনি কেবল একটি মন্তব্যে রূপরেখার হাইলাইট পছন্দ করতে চাই।

আমি যদি সঠিক হয়ে থাকি তবে আপনার কেবল font-lock-keywordsএকটি বিশেষ উপায়ে প্রয়োজন, যথা:

(my/find-outline-in-comment-p 0 'outline-face t)

যেখানে outline-faceমুখ আপনি, শিরোনাম প্রয়োগ করতে চাই tএই স্থানে সাথে আপনার পূর্বের ফন্ট-লকিং ওভাররাইড করতে মানে, এবং my/find-outline-in-commentএকটি মিলকারীর ফাংশন (এর docstring দেখতে font-lock-defaults) যা একটি মন্তব্যে প্রথম রূপরেখা জন্য একটি অবস্থান এবং অনুসন্ধানগুলি লাগে মধ্যে (point)এবং যে অবস্থান, রূপরেখা এক্সটেন্টের ফেরার ম্যাচে তথ্য হাইলাইট করা হয়।

রূপরেখা সন্ধান করতে, আপনি মন্তব্যগুলির জন্য এগিয়ে স্ক্যান করতেন (ব্যবহার font-lock-comment-faceবা সিনট্যাকটিক অবস্থা) এবং তারপরে looking-atমন্তব্যটির কোনও রূপরেখা রয়েছে কিনা তা পরীক্ষা করে ব্যবহার করতে পারেন।


1

এর font-lock-syntactic-face-functionমতো সংজ্ঞা দিতে বিবেচনা করুন :

(setq font-lock-syntactic-face-function
      (lambda (state)
    (cond ((nth 3 state)
           font-lock-string-face)
          ((and (nth 4 state)(nth 8 state))
            MY-COMMENT-FACE
          (t  font-lock-comment-face))))

এটি পাইথন-মোড.এল দিয়ে পরীক্ষা করা হয়েছে, মন্তব্য ছাড়াই "# *" দিয়ে শুরু করে একটি বিভাগ রেখে:

(setq py--font-lock-syntactic-face-function
      (lambda (state)
    (cond ((nth 3 state)
           font-lock-string-face)
          ((and (nth 4 state)(nth 8 state)
            (progn (save-excursion
                 (goto-char (nth 8 state))
                 (looking-at (concat comment-start (regexp-quote "*"))))))
           nil)
          (t font-lock-comment-face))))

এটি মোডের সাথে পরিচালিত হওয়ার সময়:

(font-lock-syntactic-face-function
                    . py--font-lock-syntactic-face-function)

পরিবর্তে nil, কোনও বৈধ মুখের কাজ করা উচিত।

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