কাস্টম.এল এর পরিবর্তে সেটেকের সাথে ভেরিয়েবলগুলি সেট করার সুবিধা?


69

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

(setq foo 'bar)

এই পরামিতিগুলি প্রায়শই সংজ্ঞায়িত করা হয় defcustom, এগুলি মাধ্যমে কাস্টমাইজেশনের জন্য উপলব্ধ করা হয় custom.el

আমি সাধারণত custom.elসেগুলি সেট করতে ব্যবহার করি। setqপরিবর্তে ব্যবহার করে কি কোনও সুবিধা হবে বা দুটি পদ্ধতি মোটামুটি সমান?

উত্তর:


85

কিছু লোক এটি ব্যবহার করা সহজ বলে মনে করতে পারে setq। কিছু লোক মনে করে এটি আরও হাসিখুশি। বাস্তবে, এটি সাধারণ ক্ষেত্রে নিষ্পাপ।

এটি সত্য যে কিছু ব্যবহারকারীর বিকল্পের জন্য এটি কোনও বিষয় নয়। তবে অন্যদের জন্য এটি গুরুত্বপূর্ণ, এবং setqএই বিকল্পগুলির জন্য ভুল পদ্ধতি। একটি সাধারণ নিয়ম হিসাবে, setqভুল পদ্ধতির হয়।

আপনি যদি ব্যবহার করেন custom-set-variablesবা customize-set-variableপরিবর্তে setq, বা আপনি যদি কাস্টমাইজ ব্যবহারকারী ইন্টারফেস (উদাহরণস্বরূপ M-x customize-option) ব্যবহার করেন , তবে আপনি নিশ্চিত যে বিকল্প মানের জন্য প্রয়োজনীয় যে কোনও উদ্দিষ্ট সূচনা বা আপডেট কোডটি স্বয়ংক্রিয়ভাবে ট্রিগার হবে এবং প্রয়োজন অনুযায়ী চালানো হবে। আপনি যদি ব্যবহার করেন তবে setqএটি করা হবে না।

এখন, এটা এছাড়াও ক্ষেত্রে যে সবচেয়ে ব্যবহারকারী বিকল্প, তাদের বিশেষ করে 3 য় পক্ষের লাইব্রেরির জন্য লিখিত, ব্যবহার করতে না defcustomকীওয়ার্ড :setএবং :initialize, এবং ব্যবহার setqতাদের জন্য কোন ব্যাপার না। তবে প্রচুর ভ্যানিলা ইমাক্স বিকল্পগুলি এই জাতীয় কীওয়ার্ড ব্যবহার করে এবং যা করে তাদের setqপক্ষে এটি সঠিক জিনিস নয়। সুতরাং আপনি যদি লিস্প কোডটি ব্যবহার করতে চান এবং আপনার বিকল্পগুলি সেট করার জন্য কাস্টমাইজ ইউআই না করে থাকেন তবে আপনি ব্যবহার custom-set-variablesবা customize-set-variableতার পরিবর্তে ভাল setq। এটি কখনও ব্যথা করে না এবং এটি কখনও কখনও সহায়তা করে (প্রচুর)।

তবে আমি যা প্রস্তাব করি তা হ'ল এই দুটি জিনিসই করা:

  • এর জন্য লিস্প কোড লেখার পরিবর্তে কাস্টমাইজ ইউআই ব্যবহার করুন

  • ভেরিয়েবল সংজ্ঞায়িত করুনcustom-file , যাতে কাস্টমাইজ সেই ফাইলটিতে কাস্টমাইজেশন লিখতে পারে এবং আপনার init ফাইলে নয় ( ~/.emacs)। আইওউ, আপনার হাতে লেখা লিখিত সূচনা কোডটি কাস্টমাইজ দ্বারা লিখিত স্বয়ংক্রিয় কোড থেকে আলাদা রাখুন।


5
আমি মনে করি এটি উল্লেখ করার মতো: এমনকি সেট এবং: পরামিতিগুলির সূচনা করার পরেও, প্যাকেজটি লোড হওয়ার আগে সেটাকে পড়া হয়ে গেলে এখনও কাজ করে।
মালবারবা

2
@ উইলিফ্রোগ আপনি এটি উন্নত করতে পারেন!
জেন শেলবি

17
যে ড্র সম্পর্কে সম্পর্কে নিশ্চিত না। পুরো কাস্টমাইজ জিনিসটি বরং জটিল। এটি ছাড়া ইম্যাক্স সিস্টেমটি অনেক সহজ। কাস্টমাইজ হ'ল একটি স্তর যা এলিস্পের সাথে ঠিক জাল করে না doesn't একটি জিনিস জন্য, এটি বর্ণমালা দ্বারা সমস্ত vars অর্ডার। এছাড়াও, অনেকগুলি কাস্টমাইজেশন ভেরিয়েবলগুলি সম্পর্কে নয় (যেমন হুকস, কী) তাই কাস্টমাইজটি ব্যবহার করতে পারে না। সুতরাং যাইহোক আপনার ম্যানুয়াল এলিস্প কোডের একটি পরিস্থিতি রয়েছে।
জাঃ লি

4
@XahLee। ঠিক আছে, আমি নিশ্চিত। ;-) তবে হ্যাঁ, কাস্টমাইজ হ'ল এটি। কীগুলি, হুকস, ফন্ট-লক কীওয়ার্ডগুলি, প্রদর্শনের টেবিল ইত্যাদির জন্য এটি সেরা জিনিস নয় তবে এটি কী করে (বিকল্পগুলি এবং মুখগুলি), এটি বেশ ভাল করে। এমন নয় যে UI 'তে বিস্ময়কর, কিন্তু ট্রিগার টাইপ-পরীক্ষণ, ইত্যাদি হ্যান্ডলিং সহায়ক। আমি এমনকি ইচ্ছুক প্রোগ্রামারদের পারেনি (ঐচ্ছিকভাবে) ভীষণ পছন্দ ব্যবহার :typeসঙ্গে defvar- আমি মনে করি না এটি ব্যবহারকারীর অপশন অবশ্যই সীমিত হতে হবে না। দুর্ভাগ্যক্রমে, অনেক প্রোগ্রামার তাদের ব্যবহারে অলস :type, এবং ফলাফল খুব সহায়ক নয় (এটি কাস্টমাইজ করার দোষ নয়)।
ড্র

1
ডেটা পয়েন্ট: এক বছরের ভাল অংশে আমার 3500 লাইন ইমা্যাকস থিম কোডটি বিকশিত হয়েছে setq, customize-set-variableঠিক একবার ব্যবহার করার পরিবর্তে আমাকে কামড়েছে । (সেই সময়টি ছিল auto-revert-interval, এবং আমি পরে বুঝতে পেরেছি যে লোড করার setq আগে ব্যবহার autorevertকরা আসলে ব্যবহারের চেয়ে অনেক দ্রুত ছিল customize-set-variable))
রেডন রোজবারো ২

37

আমি পছন্দ setqউপর customizeবিভিন্ন কারণে:

  1. প্রথম এবং সর্বাগ্রে, এটি ভেরিয়েবলগুলিকে অগ্রগতি হিসাবে সেট করতে দেয় (যেমন হিসাবে, (setq foo (calculate-foo)))। জিনিসগুলিকে DRY রাখতে আমি আমার কনফিগারেশনে এই শক্তিটি সর্বদা ব্যবহার করি। আমার জন্য, ইম্যাকস ব্যবহারের পুরো পয়েন্টটি প্রোগ্রামযোগ্যতা, এবং customizeইন্টারফেসটি উপায় ছাড়া কিছুই করে না।
  2. setqসংস্করণ নিয়ন্ত্রণ এবং কোড সংস্থায় নিজেকে আরও ভাল ধার দেয়। আমি আমার সূচনাটি কয়েক ডজন ফাইলের মধ্যে বিভক্ত করেছি; যদি সমস্ত কিছু একটি বিশাল custom.elফাইলে থাকে তবে সেটিংসটি দ্রুত সন্ধান করা এবং সম্পাদনা করা আরও কঠিন be
  3. এটি বিষয়গত, তবে আমার কাছে পুরো customizeইন্টারফেসটি 90 এর দশকের সবচেয়ে খারাপ UI গুলি থেকে একটি ভয়াবহ অবশেষের মতো অনুভব করে। আমি যে কোনও দিন ইমাসের শক্তির সাথে পাঠ্য সম্পাদনা করতে পছন্দ করব।

@ ড্রু :setএবং এর সাথে কিছু সূক্ষ্মতা সম্পর্কে কিছু ভাল পয়েন্ট দেয় :initialize। আমি কয়েক বছর ধরে ইম্যাক্স ব্যবহার করে আসছি এবং এরকম সমস্যা খুব কমই দেখা গেছে। যখন আমি কি, এটা অদলবদল করা সহজ setqজন্য custom-set-variableনির্দিষ্ট ক্ষেত্রে।


10
1. আপনি কাস্টমাইজ ভেরিয়েবলগুলি প্রগ্রেটিক্যালি সেট করতে পারেন customize-set-variable(s)এবং এটি স্বয়ংক্রিয়ভাবে চালিত ট্রিগারগুলির কারণে এটি আরও ভাল। ২. আপনার সমস্ত সেট এবং / বা সংরক্ষণিত ভেরিয়েবলগুলি বিভিন্ন শ্রেণিবিন্যাসে দেখতে বিভিন্ন কাস্টমাইজ কমান্ড ব্যবহার করতে পারেন, সুতরাং সংস্করণ নিয়ন্ত্রণে পৃথক ফাইল ব্যবহার না করে আপনি স্বয়ংক্রিয়ভাবে বিভিন্ন গোষ্ঠীর সংগঠনটি পান। ৩.এটি অনেক ভাল হয়েছে। আপনি যদি ইউআই পছন্দ না করেন তবে আপনি এখনও কাস্টমাইজটি প্রোগ্রমেটিক্যালি এবং ইন্টারেক্টিভ কমান্ডগুলির মাধ্যমে ব্যবহার করতে পারেন যা কাস্টমাইজ মোডটি এড়াতে কাস্টমাইজ ব্যবহারের অন্যান্য সমস্ত সুবিধা অর্জন করতে পারে।
নিক ম্যাককুরডি

23

setqপরিবর্তে ব্যবহারের একটি সুবিধা customizeহ'ল পাঠযোগ্যতা। আইএমও পঠনযোগ্যতা উন্নত করে যার পছন্দ অনুসারে প্রতিটি স্বনির্ধারণকে টিকিয়ে রাখতে পারে একজন। এক সাথে সম্পর্কিত কাস্টমাইজেশনগুলি একসাথে গোষ্ঠীভুক্ত করা যেতে পারে যা পরিমিতি উন্নত করে। অবশেষে, আমি যুক্তি দিয়ে বলব যে একটি এলিস্প বাফারের মাধ্যমে নেভিগেট করা আরও "সহজ" এর পরে কাস্টমাইজ ইউআই এবং উইজেটগুলি নেভিগেট করা।

অন্যদিকে, কাস্টমাইজটি আপনাকে সহজেই ডিফল্ট মানগুলিতে ফিরে যেতে দেয় যা জিনিসগুলি অচল হয়ে গেলে অমূল্য হতে পারে।

সম্পাদনা: ড্রয়ের উত্তরটি ব্যবহারের একটি দুর্দান্ত কারণ customize-set-variablesপ্রদান করে যা আমি নির্দেশিত সমস্ত সুবিধা সরবরাহ করতে পারে। তবে, কাস্টমাইজ ইউআই কাঁচা এলিস্পের মতো সহজেই সহজেই বিভিন্ন প্ল্যাটফর্মের মধ্যে পোর্টেবল কনফিগারেশনগুলিতে leণ দেয় না। ওএস নির্ভরশীল সেটিংয়ের জন্য যদি আপনার কোনও ভেরিয়েবলের প্রয়োজন হয় তবে আপনাকে অনেক ক্ষেত্রে এলিজপ এ পড়তে হবে। এলিস্প বাফারগুলিতে সহজ নেভিগেশন সম্পর্কে আমার বক্তব্য এখনও দাঁড়িয়ে আছে।


আপনি ডিফল্ট মানটিতেও ফিরে যেতে পারেন setq, কেবল setqলাইনটি দিয়ে মন্তব্য করুন এবং ইমাকগুলি পুনরায় চালু করতে পারেন ।
টি ভেররন

3
হ্যাঁ, তবে কাস্টমাইজ করা পেস্কি পুনরায় আরম্ভ না করে ফিরে যেতে পারে। নতুন সেটিংস চেষ্টা করে দেখতে অত্যন্ত দরকারী।
বংশী

2
টীকা সংক্রান্ত, কাস্টমাইজ ইন্টারফেস আপনাকে পরিবর্তিত প্রতিটি পরিবর্তনশীলটিতে একটি মন্তব্য যুক্ত করতে দেয়।
অ্যান্ড্রু সোয়ান 10

custom-set-variables এটি "কাঁচা এলিস্প", এবং আমি এটি প্রতিদিন একাধিক মেশিনে ব্যবহার করি। কাস্টমাইজ করে এটি লেখার জায়গা থেকে কেবল এটি অনুলিপি করুন (যদি আপনি নিজে এটি না লিখে থাকেন)।
ক্রড ল্যাংশন

<kbd> এমএক্স কাস্টমাইজ- * </kbd> ইন্টারফেসের একটি "মন্তব্য" ক্ষেত্র রয়েছে যা একটি ভেরিয়েবলের সাথে একটি মন্তব্য সংরক্ষণ করার অনুমতি দেয়।
কেডিবি

-1

আরেকটি বিকল্প হ'ল জন উইগলির ব্যবহার-প্যাকেজটি ব্যবহার করা । এটি ইম্যাক্স 24+ প্যাকেজ আরম্ভের প্রক্রিয়াটির সাথে দুর্দান্তভাবে প্যাকেজগুলি কনফিগার করার জন্য একটি প্রোগ্রামিক পদ্ধতি সরবরাহ করে। এখানে রিডমি থেকে ব্যবহারের একটি উদাহরণ:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

মুল বক্তব্যটি হ'ল ব্যবহারের প্যাকেজটি একটি ম্যাক্রো এবং তাত্ক্ষণিকভাবে তার যুক্তিগুলি মূল্যায়ন করে না। :initএবং :configপরামিতি আরম্ভের প্রক্রিয়া বিভিন্ন পর্যায়ে মূল্যায়ন করা হয়, এটা সম্ভব একটি স্থানে প্রতিটি প্যাকেজ কনফিগারেশন আছে, কিন্তু প্রতিটি অংশ আরম্ভের যথাযথ পর্যায়ে চালানো আছে আরও সহজ করে।

use-packageকিছু প্যাকেজগুলির মতো কিছু ছাড়াই তাদের প্রারম্ভিককরণের কোডের কিছু (package-initialize)অংশ আগে যেতে হয় এবং অন্য অংশটি পরে যেতে হয়। আপনার যদি এমন অনেক প্যাকগেগা থাকে তবে থায়ার সূচনাটি আন্তঃলিপি করতে হবে।

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

এছাড়াও অতিরিক্ত কীওয়ার্ড আর্গুমেন্ট রয়েছে যা সূচনা প্রক্রিয়াতে আরও নিয়ন্ত্রণের অনুমতি দেয়।

যা যা বলেছিল, কাস্টমাইজ করার একটি বড় সুবিধা হ'ল এটি আপনাকে কোনও প্যাকেজে কনফিগার করার দরকার তা দেখায়। আমি এখনও আমার প্যাকেজগুলির অনেকের জন্য এটি ব্যবহার করার একটি কারণ।


2
এটি আসলে প্রশ্নের উত্তর দেয় না। আপনার খুব উত্তরে, আপনি কোনও কারণ ছাড়াই সেটিক ব্যবহার করেন।
জে ডেভিড স্মিথ

3
আমি মনে করি use-packageনিজেই মডুলারাইজড কনফিগারেশনের সুবিধাগুলি সরবরাহ করে এবং এক জায়গায় প্যাকেজ আমদানি ও কনফিগার করে। তবে হ্যাঁ, উদাহরণটি ব্যবহার করছে setq। এটি কি ঠিক customize-set-variableএখানে ব্যবহার করতে পারত ? আমি নিশ্চিত নই. আমরা কি (বা customize-set-value) এর জন্য অদলবদল করতে পারি setq?
মাইকে

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