আমি কীভাবে ন্যাডভাইস ব্যবহার করব?


29

আমার কনফিগারেশনে পরামর্শ পূর্ণ, এবং আমি নতুন চকচকে মিনিমালিস্ট nadvice.elপ্যাকেজ সম্পর্কে শুনছি ।

আমি ম্যানুয়ালগুলি সন্ধান করেছি এবং উত্সটি পড়েছি , তবে আমি প্রকাশ্যে স্বীকার করব: আসলে কীভাবে এটি ব্যবহার করবেন সে সম্পর্কে আমার এখনও ধারণা নেই।

এখানে যে কেউ আমাকে গাইডের দিকে ইঙ্গিত করতে পারেন, বা আমার পুরানো স্টাইলের পরামর্শটি কীভাবে পোর্ট করা শুরু করবেন তা আমাকে বলতে পারেন?


7
প্রশ্নের জন্য +1। আপনি ম্যানুয়াল অনুসন্ধান এবং থাকেন তাহলে দেখেছি যে আপনার কী প্রয়োজন ছিল তা অনুগ্রহ করে একটি (ডক) বাগ রিপোর্ট জমা দেওয়ার কথা বিবেচনা: M-x report-emacs-bug। কিছু বিকাশকারী কখনও কখনও ডকুমেন্টিং ওভার বিকাশ পছন্দ করে। ;-) এটি গুরুত্বপূর্ণ যে ইম্যাক্স নিজেই নথিভুক্ত করে।
ড্রিউ

2
ম্যানুয়ালটিতে আসলে একটি বিভাগ রয়েছে, দেখুন (তথ্য "(এলিস্প) পুরানো পরামর্শগুলি পোর্টিং") । যদিও যাই হোক না কেন এটি বিশদ সূচীতে তালিকাভুক্ত নয়।
ওয়াসমাস

4
নিবিড়ভাবে সম্পর্কিত:
ইমাস

3
ব্যবহার কয়েকটি উদাহরণ nadviceআমার কনফিগ থেকে: : পর , : ফিল্টার রিটার্ন , : প্রায় , : সামনে-পর্যন্ত
কুশল মোদি

1
@ ওসামাসা আমি ভয় করি যে বিভাগটি সম্পূর্ণরূপে দূরে। আমার কাছে কয়েকটি পরামর্শ রয়েছে (সম্ভবত কেবলমাত্র একটি, আমরা দেখতে পাবো) যা আরও জটিল। আমি কি এখানে প্রত্যেকের জন্য একটি প্রশ্ন করা উচিত?
পাইথননট

উত্তর:


22

আপনার প্রয়োজনীয় সমস্ত তথ্য অন্তর্ভুক্ত করা হয়েছে C-h f add-functionযার অন্তর্নিহিত প্রক্রিয়াটি বর্ণনা করে advice-add

নতুন পরামর্শ ব্যবস্থাটি মূলত সারণিতে বর্ণিত ফাংশন দ্বারা কোনও ক্রিয়নের বর্তমান সংজ্ঞাটি পরিবর্তনের মতো কাজ করে যা C-h f add-functionআপনার WHERE যুক্তির পছন্দ অনুসারে , কোন উত্স ফাইলটিতে কী আচরণকে সংজ্ঞায়িত করা হয়েছে তা অনুসরণ করার জন্য কেবল ক্লিনার।

:aroundবিকল্প সহ একটি উদাহরণ

সর্বাধিক সাধারণ কেসটি :aroundবিকল্প, তাই আমি তার জন্য একটি উদাহরণ দিই। ( WHEREসম্ভব হলে ডেডিকেটেড প্যারামিটারগুলি ব্যবহার করা আরও ভাল তবে আপনি প্রতিটি অন্যকে একটি সমতুল্য :aroundফাংশন দ্বারা প্রতিস্থাপন করতে পারেন )।

একটি উদাহরণ হিসাবে, আসুন আমরা আপনাকে কিছু ব্যবহার ডিবাগ করতে চাই find-file এবং printপ্রতিটি বার যখন এটি বলা হয় তখন এর যুক্তি তালিকার তালিকায় যেতে চাই । আপনি লিখতে পারে

(defun my-find-file-advice-print-arguments (old-function &rest arguments)
  "Print the argument list every time the advised function is called."
  (print arguments)
  (apply old-function arguments))

(advice-add #'find-file :around #'my-find-file-advice-print-arguments)

এই নতুন বাস্তবায়নের সাথে, পরামর্শের প্রয়োজনীয় সমস্ত কিছুই আর্গুমেন্ট হিসাবে পাস করা হবে। ad-get-argsঅযৌক্তিক হয়ে ওঠে, কারণ আর্গুমেন্টগুলি সাধারণ ফাংশন আর্গুমেন্ট হিসাবে যুক্ত ফাংশনটিতে পৌঁছে দেওয়া হয় ( WHEREযুক্তিগুলির জন্য যার অর্থ এটি বোঝায়)। পরামর্শ তত্ক্ষণাত ফাংশন এবং আর্গুমেন্ট ad-do-itহিসাবে অকারণে পরিণত হয় :around, তাই (ad-do-it)ফর্ম দ্বারা প্রতিস্থাপিত হয়

(apply old-function arguments)

অথবা আপনি যখন যুক্তিগুলির নাম দিয়েছেন

(funcall old-function first-arg second-arg)

জড়িত কোনও যাদু ফর্ম না থাকায় এটি পরিষ্কার। আর্গুমেন্টগুলি সংশোধন করা সহজভাবে পরিবর্তিত মানগুলিতে পাস করার মাধ্যমে ঘটে OLD-FUNCTION

অন্যান্য WHEREমান

এর ডক্ট্রিংয়ে add-functionসমস্ত পরামর্শের জায়গাগুলির (বা " সংযুক্তকারী ") এর একটি সারণী রয়েছে এবং সেগুলির সমতুল্য এবং পরামর্শযুক্ত ফাংশনের lambdaসমতুল্য আচরণের ক্ষেত্রে কার্যকারিতা ব্যাখ্যা করে :

`:before'       (lambda (&rest r) (apply FUNCTION r) (apply OLDFUN r))
`:after'        (lambda (&rest r) (prog1 (apply OLDFUN r) (apply FUNCTION r)))
`:around'       (lambda (&rest r) (apply FUNCTION OLDFUN r))
`:override'     (lambda (&rest r) (apply FUNCTION r))
`:before-while' (lambda (&rest r) (and (apply FUNCTION r) (apply OLDFUN r)))
`:before-until' (lambda (&rest r) (or  (apply FUNCTION r) (apply OLDFUN r)))
`:after-while'  (lambda (&rest r) (and (apply OLDFUN r) (apply FUNCTION r)))
`:after-until'  (lambda (&rest r) (or  (apply OLDFUN r) (apply FUNCTION r)))
`:filter-args'  (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
`:filter-return'(lambda (&rest r) (funcall FUNCTION (apply OLDFUN r)))

(cited from `C-h f add-function')

যেখানে FUNCTION হ'ল পরামর্শ ফাংশন এবং পরামর্শ যুক্ত করা ফাংশন ওল্ডফুন। এগুলি একবারে বোঝার চেষ্টা করবেন না, কেবল এমন একটি WHEREপ্রতীক নির্বাচন করুন যা উপযুক্ত মনে হয় এবং সেটিকে বোঝার চেষ্টা করুন।

বা শুধু ব্যবহার :around। যতদূর আমি সমস্ত কিছুর জন্য বিশেষায়িত WHEREগুলি ব্যবহারের একমাত্র সুবিধাটি বলতে পারি :aroundযে আপনি C-h f ADVISED-FUNCTION পরামর্শের ডক্ট্রাস্টিং পড়ার আগে সন্ধান করা থেকে কিছুটা আরও তথ্য পাবেন। আপনি যদি পরামর্শটি সহ কোডটি প্রকাশের পরিকল্পনা না করেন তবে সম্ভবত এটি কোনও বিষয় নয়।

নামকরণ পরামর্শ ফাংশন

আমি নামযুক্ত ফাংশনগুলি পরামর্শ হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি কারণ এটি অনেকগুলি সুবিধা দেয় (এর মধ্যে কয়েকটি হুকের জন্য নামযুক্ত ফাংশনগুলি ব্যবহারের ক্ষেত্রেও প্রয়োগ করা হয়):

  • এটি C-h f find-fileহিসাবে প্রদর্শিত হয়

    :around advice: `my-find-file-advice-print-arguments'
    

    পরামর্শ ফাংশনটির সংজ্ঞাটির সাথে লিঙ্ক করা, এতে যথারীতি ফাইলটির লিঙ্ক থাকে যেখানে এটি সংজ্ঞায়িত হয়েছিল। যদি পরামর্শটি কোনও lambdaফর্ম হিসাবে সরাসরি ফর্ম হিসাবে সংজ্ঞায়িত করা advice-add হত তবে ডকস্ট্রিংকে ইনলাইন (দীর্ঘ ডক্টাস্টিংগুলির জন্য একটি জগাখিচুড়ি?) প্রদর্শিত হবে এবং এটি সংজ্ঞায়িত হয়েছিল এমন কিছুই ইঙ্গিত দেয় না।

  • আপনি পরামর্শটি সরাতে পারেন

    (advice-remove #'find-file #'my-find-file-advice-print-arguments)
    
  • আপনি advice-addপুরাতন সংস্করণটিকে সক্রিয় রাখতে পুনরায় পরিচালনা বা ঝুঁকি না নিয়ে পরামর্শের সংজ্ঞাটি আপডেট করতে পারেন ( advice-addপরিবর্তিতের সাথে চালানো lambdaনতুন পরামর্শ হিসাবে স্বীকৃত হবে, পুরানোটির আপডেট হিসাবে নয়)।

সাইড মন্তব্য#'function স্বরলিপি মূলত সমতূল্য 'functionছাড়া এটি (যেমন টাইপস কারণে) সাহায্য বাইট কম্পাইলার ফাংশন নাম হিসেবে শনাক্ত প্রতীক এবং এইভাবে অনুপস্থিত ফাংশন চিহ্নিত করতে।


অনুযায়ী আলোচনা আমি হ্যাশ-কোট সব আর্গুমেন্ট এখানে ব্যবহার করা উচিত নয় স্টিফেন Monnier সঙ্গে ছিল .. এটি হওয়া উচিত (advice-add 'find-file :around #'my-find-file-advice-print-arguments)এবং একইভাবে (advice-remove 'find-file #'my-find-file-advice-print-arguments)
कौशल মোদী

আমি অনুমান advice-addএকটি সীমানা ক্ষেত্রে দেখা যায়। ব্যক্তিগতভাবে আমি ' ↔ #'পার্থক্যটি বেশিরভাগ ক্ষেত্রে ফাংশন নামগুলিতে টাইপগুলি সনাক্ত করতে সহায়তা হিসাবে বিবেচনা করি , সুতরাং এখানে সম্ভবত এটি যুক্ত করা হবে যে পরামর্শটি যুক্ত হওয়ার সময় দ্বারা কোনওটি ফাংশনটি সংজ্ঞায়িত করা আশা করে কিনা।
কেডিবি

@kdb আমি অবশেষে নিজেকে জন্য এই খুঁজে পাওয়া যায় (আমি এর জন্য দস্তাবেজ গাড়ীতে আঘাত add-function)। আমি চাই যে ডক্সগুলি আরও পরিষ্কার করে দেওয়া। আমি এটির জন্য একটি প্যাচ তৈরির দিকে তাকিয়ে থাকতে পারি।
পাইথননট

@ কেডিবি আপনার অর্থ কি "এটি এতে দেখা যাচ্ছে C-h f find-file, না C-x?
পিজা

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