কোটের মধ্যে শেল ভেরিয়েবল হাইলাইট করা


13

ভিমে, নীচের নথিতে $PWD2 এবং 3 লাইনগুলিকে দুটি ভিন্ন উপায়ে রঙিন করা হবে:

#/bin/sh
echo "Current Directory: $PWD"
echo 'Current Directory: $PWD'

প্রথম দৃষ্টান্তটি এতে $PWDথাকা বাকী স্ট্রিংয়ের চেয়ে আলাদা রঙে থাকবে This এটি স্পষ্টত ভিজ্যুয়াল ইঙ্গিত দেয় যে আক্ষরিক পাঠ্য হিসাবে বিবেচনা না করে পরিবর্তকটি প্রসারিত হবে। বিপরীতে, দ্বিতীয় উদাহরণটি অন্য $PWDস্ট্রিংয়ের মতোই রঙিন হবে কারণ একক উদ্ধৃতিগুলির কারণে এটি আক্ষরিক পাঠ্য হিসাবে বিবেচিত হয়।

এমন কোন ইম্যাকস মোড আছে যা এই ধরণের "শেল-কোটিং সচেতনতা" সরবরাহ করে?


1
অবশ্যই, এটি যুক্ত করা ভয়ানক কঠিন হবে না sh-mode? এটি নিজেই ইমাসে যুক্ত হতে পারে।
পাইথননট

উত্তর:


11

নীচের কোডগুলিতে একটি রেগএক্সপ্যাকের পরিবর্তে ফাংশন সহ একটি ফন্ট-লক নিয়ম ব্যবহার করে, ফাংশন অনুসন্ধানের ঘটনাগুলি অনুসন্ধান করে $VARতবে কেবলমাত্র যখন তারা ডাবল-কোটেড স্ট্রিংয়ের ভিতরে থাকে। (syntax-ppss)এটি নির্ধারণ করতে ফাংশনটি ব্যবহৃত হয়।

ফন্ট-লক নিয়মটি prependবিদ্যমান স্ট্রিং হাইলাইটের শীর্ষে নিজেকে যুক্ত করতে পতাকা ব্যবহার করে । (মনে রাখবেন যে এর জন্য অনেকগুলি প্যাকেজ ব্যবহার করা tহয়েছে Unfortunately দুর্ভাগ্যক্রমে, এটি বিদ্যমান হাইলাইটিংয়ের সমস্ত দিককে ওভাররাইট করে For উদাহরণস্বরূপ, prependঅগ্রভাগের রঙ প্রতিস্থাপন করার সময় ব্যবহার করে স্ট্রিং পটভূমির রঙ ধরে রাখা হবে (যদি সেখানে থাকে)))

(defun sh-script-extra-font-lock-is-in-double-quoted-string ()
  "Non-nil if point in inside a double-quoted string."
  (let ((state (syntax-ppss)))
    (eq (nth 3 state) ?\")))

(defun sh-script-extra-font-lock-match-var-in-double-quoted-string (limit)
  "Search for variables in double-quoted strings."
  (let (res)
    (while
        (and (setq res
                   (re-search-forward
                    "\\$\\({#?\\)?\\([[:alpha:]_][[:alnum:]_]*\\|[-#?@!]\\)"
                    limit t))
             (not (sh-script-extra-font-lock-is-in-double-quoted-string))))
    res))

(defvar sh-script-extra-font-lock-keywords
  '((sh-script-extra-font-lock-match-var-in-double-quoted-string
     (2 font-lock-variable-name-face prepend))))

(defun sh-script-extra-font-lock-activate ()
  (interactive)
  (font-lock-add-keywords nil sh-script-extra-font-lock-keywords)
  (if (fboundp 'font-lock-flush)
      (font-lock-flush)
    (when font-lock-mode
      (with-no-warnings
        (font-lock-fontify-buffer)))))

আপনি উপযুক্ত হুকটিতে শেষ ফাংশনটি যুক্ত করে এটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

(add-hook 'sh-mode-hook 'sh-script-extra-font-lock-activate)

এটি আমার পক্ষে কাজ করে তবে স্ট্রিংটি হাইলাইট করে "$" রেখে যায়।
এরিকস্টোক

এটি ডিজাইনের দ্বারা, যেহেতু এটি স্ট্রিংয়ের বাইরের একটি পরিবর্তনশীল কীভাবে হাইলাইট হয়েছিল। তবে এটি সহজেই পরিবর্তন করা যায়। আপনি যদি 2ফন্ট-লক নিয়মে এটি প্রতিস্থাপন করেন তবে 0এটি কাজ করা উচিত। ( সঠিকভাবে }হাইলাইট করার জন্য আপনাকে ট্রিজিং অন্তর্ভুক্ত করার জন্য রেজিএক্সপেক্স বাড়িয়ে দিতে হতে পারে ${FOO})) এই সংখ্যাটি ম্যাচের রিজেক্সপ সাবগ্রুপকে বোঝায়, এর 0অর্থ পুরো ম্যাচটি হাইলাইট করা উচিত।
লিন্ডাইড্যান্সার

কারও আগ্রহী যদি এটি আমার .emacs.d সংগ্রহস্থলটিতে যোগ করার সময় এটি প্যাকেজ করা হয়েছে: github.com/moonlite/.emacs.d/blob/… @ লিন্ডাডেন্সার কি জিপিএলভি 3 + এবং আপনি সেই ফাইলটিতে লেখক হিসাবে ভাল? (আমি না থাকলে আপডেট আপডেট করব)।
ম্যাটিয়াস বেনগটসন

ভাল লাগছে। এটিকে একটি সঠিক প্যাকেজ তৈরি করার জন্য আমার সম্ভবত সময় লাগবে না। তবে, আমি চাই আপনি আমার ইমেল ঠিকানাটি ফেলে দিন এবং তার পরিবর্তে আমার ইমাসিকুই পৃষ্ঠায় একটি লাইন যুক্ত করুন ( emacswiki.org/emacs/AndersLindgren )। এছাড়াও, আপনি প্রয়োজনীয় কপিরাইট সাইন অপসারণ করতে পারেন কারণ এটি প্রয়োজনীয় নয় এবং এটি উত্স কোডটিকে অ-অ্যাসিআই করে তোলে।
লিন্ডাইড্যান্সার

3

আমি @ লিন্ডাইড্যান্সারের উত্তরকে নিম্নলিখিত উপায়ে উন্নত করেছি:

  • sh-script-extra-font-lock-is-in-double-quoted-stringফাংশনটি ইনলাইন করা হয়েছে , কারণ এটি কেবল একবার ব্যবহার করা হয়েছিল
  • ভেরিয়েবলের কাজগুলি ছেড়ে যাওয়া।
  • সংখ্যা ভেরিয়েবল ( $10, $1ইত্যাদি) হাইলাইট করা হয়।

কোড জন্য বিরতি

(defun sh-script-extra-font-lock-match-var-in-double-quoted-string (limit)
  "Search for variables in double-quoted strings."
  (let (res)
    (while
        (and (setq res (progn (if (eq (get-byte) ?$) (backward-char))
                              (re-search-forward
                               "[^\\]\\$\\({#?\\)?\\([[:alpha:]_][[:alnum:]_]*\\|[-#?@!]\\|[[:digit:]]+\\)"
                               limit t)))
             (not (eq (nth 3 (syntax-ppss)) ?\")))) res))

(defvar sh-script-extra-font-lock-keywords
  '((sh-script-extra-font-lock-match-var-in-double-quoted-string
     (2 font-lock-variable-name-face prepend))))

(defun sh-script-extra-font-lock-activate ()
  (interactive)
  (font-lock-add-keywords nil sh-script-extra-font-lock-keywords)
  (if (fboundp 'font-lock-flush)
      (font-lock-flush)
    (when font-lock-mode (with-no-warnings (font-lock-fontify-buffer)))))

[^\\\\]হিসেবে লেখা যেতে পারে [^\\], এটা কিছু অক্ষর আছে যা মিলেছে করা উচিত নয় একটি সেট, এবং আপনার কোড দুইবার ব্যাকস্ল্যাশ অন্তর্ভুক্ত করা হয়েছে। পুরানো ইম্যাক্স সংস্করণগুলিতে অবশ্যই ব্যবহার করা উচিত font-lock-fontify-buffer, আরও নতুনতে আপনাকে কল করার কথা font-lock-flushএবং font-lock-fontify-bufferএলিসপ থেকে কল করা অবহেলা করা হয়। আমার আসল কোড এটি অনুসরণ করেছে, আপনার কোড দেয় না। যাইহোক, এটি একটি গিটহাব সংরক্ষণাগারে স্থানান্তরিত করা এবং প্রয়াসে যোগ দেওয়া ভাল ধারণা হতে পারে।
Lindydancer

@Lindydancer না [^\\]অব্যাহতি ]? আমি জানি যে জাভাতে রেইজেক্স কীভাবে কাজ করে।
সিজিপার্জ

@ লিন্ড্যান্সার মনে হয় এটি ইলিস্প চরিত্রের গ্রুপগুলিতে পালানোর অক্ষর ব্যবহার করার অনুমতি দেয় না বলে মনে হয় না ।
সিজিপার্জ

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