আমি এখনও প্রগ-মোড থেকে উত্তরাধিকারী হব, যদিও এখনও পুরানো ইম্যাসেনকে সমর্থন করি?


10

আমি একটি প্রোগ্রামিং ভাষার জন্য একটি প্রধান মোড লিখছি, তবে আমি পুরানো ইমাস সংস্করণগুলিকে সমর্থন করতে চাই। prog-modeতুলনামূলকভাবে নতুন। prog-modeএটি সংজ্ঞায়িত করা থেকে উত্তরাধিকারী হতে চাই , তবে এখনও অন্যথায় বুদ্ধিমান কিছু করব।

সেরা পদ্ধতির কি? আমার কি defalias prog-modeবয়স্ক ইমাসেনের উচিত, বা যদি তারা একই জিনিস করে তবে অন্য মোডগুলিতে হস্তক্ষেপ করবে?


আমি কেবল ইমাসের জন্য সমর্থন ছেড়ে দেওয়ার পরামর্শ দিচ্ছি <24. আমার মতে এটি আর চেষ্টা করার মতো নয়, এবং এর চেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলি আপনাকে ছাড় দিতে হবে prog-mode। উল্লেখযোগ্যভাবে, আপনি লেক্সিকাল বাইন্ডিংয়ের অভাব থেকে ভুগবেন।
লুনারিওর

আমি জুলিয়া-মোডে অবদান রাখছি, এবং মূল দলের কেউ কেউ বয়স্ক ইমাসেন ব্যবহার করেন এবং পছন্দ করি আমরা এটি সমর্থন করি।
উইলফ্রেড হিউজেস

1
@ লুনারিওর্ন ইম্যাক্স 24 এখনও নতুন। ইমাস্যাক্স 23 অনেকগুলি ওএসের বর্তমান সংস্করণ। ইমাস 22 এখনও কয়েকটিতে বর্তমান। সকলেই পাগলের মতো তাদের সফ্টওয়্যার আপগ্রেড করে না। ইমাস্যাক্স 23 এর জন্য সমর্থন বাদ দেওয়া আপনাকে কয়েকজন ব্যবহারকারীদের মধ্যে সীমাবদ্ধ করবে যারা রক্তপাতের প্রান্তকে তাকাচ্ছেন।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
পুরানো ইমাস সংস্করণগুলি ব্যবহার করার অনেক কারণ রয়েছে। উদাহরণস্বরূপ, উইন্ডোজ এ, ইমাসস 23 সত্যিই স্বচ্ছ হয়ে উঠেছে, তাই আমি সেখানে ইমাস 22 টিতে থাকা পছন্দ করেছি।
লিন্ডাইড্যান্সার

@ গিলস আমি সন্দেহ করি যে এটি কেবল "কয়েকজন ব্যবহারকারী"। ফ্লাইচেক কখনই প্রথম স্থানে ইমাসকে 23 সমর্থন করে নি, এবং তা সত্ত্বেও মেলপা সবচেয়ে জনপ্রিয় প্যাকেজগুলির মধ্যে পরিণত হয়েছে…
চন্দ্রচীন

উত্তর:


11

অতিরিক্ত শীর্ষ-স্তরের চিহ্নের বাইন্ডিংয়ের ব্যয়ে, খুব ঝরঝরে সমাধান রয়েছে যা define-derived-modeফর্মটি পুনরাবৃত্তি করা এড়িয়ে চলে :

(defalias 'my-fancy-parent-mode
  (if (fboundp 'prog-mode) 'prog-mode 'fundamental-mode))

(define-derived-mode my-fancy-mode my-fancy-parent-mode
   ...)

যে কোনও ইমাসে> = 23 এ দুর্দান্ত কাজ করে। আমি haml-modeকয়েক বছর আগে আইআইআরসি-র সাথে এটি নিয়ে এসেছি এবং মনে হয় এটি সেখান থেকে অন্য কয়েকটি বড় মোডে ছড়িয়ে পড়েছে। define-derived-modeম্যাক্রো প্যারেন্ট মোড প্রতীকটির সাথে প্রধান জিনিসটি কোড উত্পন্ন হয় যা তার ফাংশনটিকে কল করে: এই অর্থে, defaliasনতুন পরিবর্তনশীলটিকে এলিয়াসড ফাংশনের ঠিক সমান করে তোলে।

একটি সতর্কতাই হ'ল এটি বিভ্রান্ত করতে পারে derived-mode-p, সুতরাং আপনার মোডটি উত্পন্ন হয়েছে কিনা তা যাচাই করে তা কোডটি পরীক্ষা করে যা prog-modeসঠিকভাবে কাজ করে না। অনুশীলনে আমি কোনও সমস্যার মুখোমুখি হইনি: এ জাতীয় কোডটি intoোকানো আরও স্বাভাবিক prog-mode-hook, যা এখনও চালিত হয়।

(জর্জেন মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, প্যারেন্ট মোড প্রতীক থেকেও সম্পত্তিটি define-derived-modeব্যবহার করেন mode-classএবং defaliasএটি অনুলিপি করেন না writing লেখার সময়, এই সম্পত্তিটি কেবলমাত্র এর জন্য ব্যবহৃত হয়েছিল বলে মনে হয়special-mode ))

আপডেট: পুরানো সংস্করণগুলি দীর্ঘ অপ্রচলিত হওয়ায় আজকাল আমি কেবল কমপক্ষে ইমাস 24 প্রয়োজন বলে পরামর্শ দেব iring


2
চমৎকার সমাধান! কেবল একটি সতর্কতামূলক: এটি কাজ করে prog-modeতবে প্রতিটি মোডের জন্য কাজ করবে না। প্রতীক সম্পত্তিটি শিশু মোডে define-derived-modeঅনুলিপি করে mode-classdefaliasহবে না এই সম্পত্তি স্থানান্তর। যদি mode-classআপনার ব্যবহারের ক্ষেত্রে প্রাসঙ্গিক হয় তবে আপনাকে এটি ম্যানুয়ালি অনুলিপি / সেট করতে হবে।
জর্জেন শ্যাফার

এটি ধরার জন্য ধন্যবাদ, জর্জেন - আমাকে প্রায় খনন করতে হবে এবং mode-classসম্পত্তি কীটি বোঝায় সে সম্পর্কে আরও জানতে হবে ।
সানটিইঙ্ক

3

tl; dr: ব্যবহার করুন ifএবং আপনার নিজস্ব init ফাংশন:

(if (fboundp 'prog-mode)
    (define-derived-mode your-cool-mode prog-mode "Cool"
      "Docstring"
      (your-cool--init))
  (define-derived-mode your-cool-mode nil "Cool"
    "Docstring"
    (your-cool--init)))

তারপরে সমস্ত মোডের সূচনাটি ইন-ইন করুন your-cool-init

দীর্ঘতর ব্যাখ্যা:

সমস্যাটি হ'ল একটি উত্পন্ন প্রধান মোডে লেখার আনুষ্ঠানিক উপায় হ'ল define-derived-modeম্যাক্রো ব্যবহার করা :

(define-derived-mode your-cool-mode prog-mode ...)

পুরানো ইমাসসেনে (প্রাক-24), যখন এটি ভেঙে যায় prog-mode। এবং আপনি (if (fboundp 'prog-mode) ...)সেখানে ব্যবহার করতে পারবেন না কারণ ম্যাক্রো একটি আক্ষরিক প্রতীক প্রত্যাশা করে, এবং এটি আপনার প্রসারণে উদ্ধৃত করবে।

define-derived-modeপিতামাতাকে বিভিন্ন উপায়ে ব্যবহার করে। এগুলি ব্যবহারের জন্য আপনার নিজের মোড সংজ্ঞায়িত সমস্তকে অনুলিপি করা দরকার এবং এটি ক্লান্তিকর এবং ত্রুটি-প্রবণ উভয়ই।

সুতরাং একমাত্র উপায় হ'ল দু'টি পৃথক define-derived-modeবিবৃতি ব্যবহার করা , prog-modeবিদ্যমান বা না থাকা নির্ভর করে । এটি আপনাকে আপনার আরম্ভের কোডটি দুবার লেখার সমস্যায় ফেলে দেয়। যা অবশ্যই খারাপ, সুতরাং আপনি এটি তার নিজস্ব ফাংশন থেকে উত্তোলন করুন, উপরে বর্ণিত হিসাবে।

(সবচেয়ে ভাল সমাধান অবশ্যই 23.x এর জন্য সমর্থন বাদ দেওয়া এবং লেজিকাল স্কোপিং ব্যবহার করা। তবে আমার ধারণা আপনি ইতিমধ্যে সেই বিকল্পটি বিবেচনা করেছেন এবং ফেলে দিয়েছেন dropped :-))


prog-modeবয়স্ক ইমাসসেনের নিকটতম সমতুল্য কোনটি? তা থেকে আহরণ করা হবে বুদ্ধিমানের text-modeবা fundamental-modeযদি prog-modeপাওয়া যাচ্ছে না?
উইলফ্রেড হিউজেস

@ জর্জেন বা আমরা fboundpকেবলমাত্র define-derived-modeবিবৃতি দিয়ে প্রথমে একটি মধ্যবর্তী মোড অর্জন করতে পারি ? তাহলে পুরো সংজ্ঞা সহ প্রকৃত মোডটি কি সেই মধ্যবর্তী মোড থেকে উদ্ভূত হতে পারে? এইভাবে পুরো মোডটি দু'বার সংজ্ঞায়িত করতে হবে না।
দক্ষ মোদী

1
@ উইলফ্রেড হিউজেস, সেখানে কিছুই নেই। থেকে fundamental-modeপ্রাপ্ত তথ্য হ'ল nil(এবং প্রকৃতপক্ষে এর সাথে define-derived-modeপ্রতিস্থাপন fundamental-modeকরা nil) থেকে প্রাপ্ত সমান , যদিও text-modeপ্রোগ্রামের কোডটি পাঠ্য নয়। বেশিরভাগ ডিফল্ট সেটিংস text-modeমন্তব্যগুলির বাইরে প্রোগ্রামিং মোডগুলিকে বোঝায় না। এ কারণেই prog-mode
ইমাস

@ কৈশালমোদি, আপনি একটি মধ্যবর্তী মোড অর্জন করতে পারেন, তবে এর জন্য এখনও define-derived-modeএকটি ifরূপে দুটি সংজ্ঞা প্রয়োজন , কেবলমাত্র চূড়ান্ত মোডের পরিবর্তে মধ্যবর্তী মোডের জন্য। আপনি আর defunডি ফাংশনটির define-derived-modeজন্য চূড়ান্ত মোডের সাথে প্রতিস্থাপন করবেন । আমি মনে করি না এটি বিশেষভাবে পছন্দনীয়। prog-modeমূল প্রশ্নটি হিসাবে আপনি নিজের একটি সংজ্ঞা দিতে পারেন, তবে এটি সহজেই অন্যান্য মোডগুলিকে বিভ্রান্ত করতে পারে যারা এই মোডের fboundpউপস্থিতি যাচাই করতে নির্ভর করে ।
জর্জেন শ্যাফার

আমি বিশ্বাস করি না যে দুটি ভিন্ন define-derived-modeবক্তব্য প্রয়োজনীয়। কয়েক বছর আগে আমি একটি পৃথক উত্তর হিসাবে পোস্ট করেছি এমন সমাধান নিয়ে এসেছি এবং এটি Emacs 23 এবং 24 উভয় ক্ষেত্রেই দুর্দান্ত কাজ করছে বলে মনে হচ্ছে Code এটির মতো কোড বেশ কয়েকটি জনপ্রিয় প্রধান মোডে ব্যবহৃত হয়।
সানিটইনিক


0

আপনি define-derived-modeতার জন্য যুক্তিগুলির মূল্যায়ন করার জন্য একটি মোড়ক ম্যাক্রো সংজ্ঞায়িত করতে পারেন ।

(defmacro define-derived-mode* (child parent name &optional docstring &rest body)
  (macroexpand `(define-derived-mode ,(eval child) ,(eval parent) ,(eval name)
                                     ,(eval docstring) . ,body)))
(define-derived-mode* 'toy-mode
  (if (fboundp 'prog-mode) 'prog-mode 'fundamental-mode)
  "Toy"
  "Major mode for my favorite toy language"
  (toy-mode-setup))

(সতর্কতা: কেবলমাত্র সর্বনিম্ন পরীক্ষা করা হয়েছে))

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