প্রথম বন্ধনী হারিয়ে না গিয়ে কীভাবে এলিজপ সম্পাদনা করবেন


13

আমি লিনুম.এল থেকে কিছু এলিস্প কোডটি পরিবর্তন করছি:

(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

আমি একটি বাগ ঠিক করতে সক্ষম হয়েছি যেখানে সংশোধন (count-lines (point-min) (point-max))করে একের পর এক ইনডেন্টেশন ছিল (+ (count-lines (point-min) (point-max)) 1)। এটা সহজ.

তবে এখন আমি এটি সংশোধন করতে চাই যাতে একটি শর্তসাপেক্ষ যোগ করে সর্বনিম্ন প্রস্থটি 2 হয় যেখানে (concat " %" (number-to-string w) "2d ")লাইন নম্বর গণনা <10 হয়।

এটি সহজ হতে হবে! একটি শর্তযুক্ত যোগ করুন এবং কঙ্কটটি অনুলিপি / আটকান। কেকের টুকরো, তাই না? আমি বলতে চাচ্ছি, আমি জানি আমি কি করছি অনুমিত না কিন্তু আমি খুব কমই elisp স্পর্শ করুন এবং আমি সবসময় ক্যাপ্টেনকে করছি যখন আমি প্রথম বন্ধনী প্রচুর সঙ্গে কিছু পরিবর্তন করতে হবে।

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

আমি যখন এলিস্পে এমন কিছু নিয়ে কাজ করি যা খুব গভীর হয়ে যায় তখন আমাকে আমার দরজাটি বন্ধ করতে হবে, ব্লাইন্ডগুলি টানতে হবে, এবং বন্ধুত্বের কে & আর-স্টাইলের অবস্থান শুরু করতে হবে যাতে আমি কেবল পড়তে পারি না তবে বিন্যাস ছাড়াই ডার্ন জিনিসটি পরিবর্তন করতে পারি।

অবশ্যই আমি এই সব ভুল করছি। আমি কীভাবে নির্ভয়ে এইভাবে ছুঁতে পারি?

দয়া করে মনে রাখবেন যে আমার প্রশ্নটি কীভাবে এলিজাপে নেভিগেট এবং সম্পাদনা করতে হবে তা শৈলীতে প্রশ্ন হিসাবে নয়। আমি নীচে ইতিমধ্যে একটি স্টাইল গাইড হিসাবে ব্যবহার করছি: https://github.com/bbatsov/emacs-lisp-style-guide

আপডেট:

Emacs.stackexchange এ নিজেকে এমপ্রেস করার আগে কীভাবে এলিসপকে সঠিকভাবে ফর্ম্যাট করবেন:

আপনার elisp চিহ্নিত করুন এবং সঞ্চালন M-x indent-region

সমস্যার সমাধান:

নূন্যতম দুই প্রস্থের সাথে লিনামের জন্য কীভাবে ন্যায়সঙ্গত আচরণ করতে হয় তা জানতে আগ্রহীদের জন্য, সমাধানটি এখানে দেওয়া হল:

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (if (> w 1)
                           (concat " %" (number-to-string w) "d ")
                         " %2d ")))
    ad-do-it))

1
সি থেকে আসা লিসপ পড়ার সাথে প্রত্যেকেই সংগ্রাম করে এটি সময় নেয় তবে শেষ পর্যন্ত এটি অত্যন্ত প্রাকৃতিক হয়ে যায়। এছাড়াও আপনি সম্ভবত লিনিয়াম-ফর্ম্যাটটিকে "% 2d" এর মতো ফর্ম্যাট স্ট্রিংয়ে পরিবর্তন করে আপনার সমস্যার সমাধান করতে পারেন।
জর্ডন বিওনদো

আমি কেবল ব্যবহার করতে পারছি না %2dকারণ একবার প্রস্থটি 3 বা ততোধিক অক্ষরগুলিতে গড়িয়ে পরে এটি ডান-ন্যায়সঙ্গত থেকে বাম-ন্যায়সঙ্গত থেকে নিয়ে আসে।
Zhro

কয়েকটি লাইব্রেরি রয়েছে যা ম্যাচিং করা প্রথম বন্ধনীগুলি হাইলাইট করে যেগুলি অমূল্য (আমার মতে), যেমন highlight-parentheses,; rainbow-delimiters; ইত্যাদি Here এখানে আমার নিজস্ব সরলিকৃত সংস্করণ highlight-parenthesesযা শেষ বর্ণের রঙিন বন্ধনীগুলি সরিয়ে ছাড়াই স্ক্রোলিংয়ের অনুমতি দেয়: stackoverflow.com/a/23998965/2112489 ভবিষ্যতে, গ্রাহক / থ্রেডের প্রতি এটি একটি প্রশ্ন।
আইনজীবি

1
এটি অনেকটা মনে হচ্ছে আপনার সমস্যাটি সত্যিই পড়ছে , এলিস্প কোড সম্পাদনা করছে না। আপনার মনে হচ্ছে লিস্পের কাঠামো বুঝতে সমস্যা হয়েছে এবং এটি আপনার সম্পাদনকে ব্যাহত করে।
পাইথননট

1
আপনার প্রতিরক্ষা হিসাবে, এটি একটি খুব খারাপভাবে ইনডেন্ট কোডের টুকরা। আমি এটিকে প্রথম 3 বার ভুল করে পড়েছি কারণ এটি। এছাড়াও, পারদিত
মালাবারবা

উত্তর:


12

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

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

  • C-M-f/ C-M-bsexp দ্বারা এগিয়ে / পিছনে সরাতে
  • C-M-n/ C-M-pতালিকা অনুসারে এগিয়ে / পিছিয়ে যেতে
  • C-M-u/ C-M-dএক স্তর উপরে / নিচে সরানো
  • C-M-t পয়েন্টের চারপাশে দুটি সেক্সকে অদলবদল করতে
  • C-M-k একটি sexp হত্যা করতে
  • C-M-SPC একটি যৌনতা চিহ্নিত করা
  • C-M-q একটি সেক্সপ পুনরায় প্রবেশ করতে

আপনি প্রদত্ত উদাহরণ কোডটি স্পষ্ট হতে পারে যদি আপনি ইন্ডেন্টেশনটি ঠিক করেন: শুরুতে পয়েন্ট করুন (defadvice...এবং C-M-qপুরো এক্সপ্রেশনটি পুনরায় ইনডেন্ট করুন hit (concat...আমি প্রতিস্থাপন করতে আমি সেই সেক্সপের শুরুতে পয়েন্ট স্থাপন করে এবং C-M-oইন্ডেন্টেশন সংরক্ষণের সময় লাইনটি বিভক্ত করতে হিট করব । তারপরে আপনার যুক্ত করুন (if...এবং উপরের কমান্ডগুলি ব্যবহার করে তালিকার শেষে গিয়ে অন্য ক্লোজিং পেরেন যুক্ত করতে পুনরায় ইনডেন্ট করা শুরু করতে পারেন ইত্যাদি

আপনি এটি চালু করতেও পারেন show-paren-mode, যা তালিকার শুরুতে বা শেষে যখন পয়েন্টটি সম্পর্কিত প্যারেনটি হাইলাইট করবে। আপনি ম্যাচের প্যারেনের চেয়ে পুরো ভাবটি হাইলাইট করতে পছন্দ করতে পারেন, তাই কাস্টমাইজ করার চেষ্টা করুন show-paren-style

@ টাইলার যেমন অন্য উত্তরে মন্তব্যে উল্লেখ করেছেন, এই এবং সম্পর্কিত আদেশগুলি সম্পর্কে আরও জানতে আপনার ম্যানুয়ালটি একবার দেখে নেওয়া উচিত at


নোটটি যে মুহূর্তে অভিব্যক্তিটি সুন্দর-মুদ্রণের জন্য C-M-qএকটি উপসর্গ যুক্তি ( C-u C-M-q) দিয়ে কল করা যেতে পারে । এটি পৃথক রেখাগুলি এবং ইনডেন্টে সবকিছু ভেঙে দেবে যাতে বাসা বাঁধার খুব স্পষ্ট। আপনি সাধারণত চান না যে আপনার লিস্প কোডটি সেটির মতো দেখতে পাবে, তবে ম্যানুয়ালি এতে সম্পূর্ণ কে ওআর না রেখে কিছুটা কোড বোঝা সহায়ক হতে পারে। (এবং আপনি সর্বদা C-x uপূর্বাবস্থায় ফিরে যেতে পারেন )।
গ্লুকাস

6

এলআইএসপি সম্পাদনা করার একটি ভাল উপায় হ'ল পৃথক অক্ষর বা রেখার পরিবর্তে এএসটি চালিয়ে যাওয়া। আমি 2 বছর আগে আমার প্যাকেজ লিসিটি দিয়ে শুরু করেছি। আমি মনে করি যে এটি কীভাবে ভাল করতে হয় তা শিখতে আসলে এটি বেশ খানিকটা অনুশীলন নিতে পারে তবে কেবলমাত্র বেসিকগুলি ব্যবহার করা আপনাকে ইতিমধ্যে সহায়তা করা উচিত।

আমি কীভাবে এই পরিবর্তন করতে যাব তা আমি ব্যাখ্যা করতে পারি:

ধাপ 1

প্রারম্ভিক অবস্থানটি সাধারণত শীর্ষ স্তরের সেক্সপ এর আগে পয়েন্ট থাকে। এখানে, |পয়েন্ট।

|(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

আপনি কোডটি সঠিকভাবে ইন্টেন্ট করতে চাইবেন, তাই iএকবার চাপুন । এটি সুন্দরভাবে এটি পুনরায় প্রবেশ করবে।

ধাপ ২

আপনি "d "কোনও অঞ্চলের সাথে চিহ্নিত করতে চাইবেন , যেহেতু কারসাজি-সক্ষম বস্তুটি lispyহ'ল একটি তালিকা, যা চিহ্নিত করার দরকার নেই, বা চিহ্নগুলির একটি ক্রম বা / এবং একটি অঞ্চল যা চিহ্নিত করতে হবে তার তালিকা।

এটি করতে টিপুন ataকমান্ড পিতা বা মাতা তালিকা মধ্যে যে কোনো একক প্রতীক চিহ্নিত করার অনুমতি দেয়, এবং tএই বিশেষ প্রতীকের সূচি।

ধাপ 3

  1. বর্তমান অঞ্চলটি মোড়াতে ()টিপুন (
  2. C-fএকটি চর এগিয়ে sertোকাতে টিপুন if
  3. Pressোকাতে (আবার টিপুন ()
  4. .োকান > w 10
  5. C-f C-m একটি নতুন লাইনে স্ট্রিং সরানো।

পদক্ষেপ 4

স্ট্রিং ক্লোন করতে:

  1. চিহ্নটি-বা-স্ট্রিং-এ-পয়েন্টটি দিয়ে চিহ্নিত করুন M-m
  2. টিপুন c

আপনি যদি অঞ্চলটিকে অভিনব উপায়ে নিষ্ক্রিয় করতে চান এবং স্ট্রিংয়ের একেবারে শুরুতে পয়েন্টটি রাখতে চান তবে আপনি টিপতে পারেন idm:

  1. i স্ট্রিংয়ের অভ্যন্তরীণ সামগ্রী নির্বাচন করবে।
  2. d পয়েন্ট এবং চিহ্ন অদলবদল করবে।
  3. m অঞ্চলটি নিষ্ক্রিয় করবে

অথবা আপনি m C-b C-b C-bএই ক্ষেত্রে করতে পারেন , বা C-g C-b C-b C-b। আমি মনে করি idmএটি আরও ভাল, যেহেতু স্ট্রিংয়ের দৈর্ঘ্য নির্বিশেষে এটি একই। আমি মনে করি C-x C-x C-f C-g স্ট্রিং দৈর্ঘ্য নির্বিশেষেও কাজ করবে।

শেষ অবধি, 2শেষ কোডটি সন্নিবেশ করান :

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) (if (> w 10)
                                                             "2|d "
                                                           "d "))))
    ad-do-it))

সারসংক্ষেপ

পূর্ণ ক্রম ছিল: at( C-f, if, (, > w 10, C-f C-m M-m cidm, 2

মনে রাখবেন যে আপনি কোড সন্নিবেশ গণনা করলে, এএসটি ম্যানিপুলেশন সম্পর্কিত নয় কেবলমাত্র কীগুলি দুটি C-fএবং একটি ছিল C-m


3
লিস্পি আকর্ষণীয় শোনায়! ওপিতে: আপনি পেরেডিট: emacsrocks.com/e14.html এবং প্রসারিত অঞ্চল: github.com/magnars/expand-region.el , বা বিল্ট-ইন বন্ধনী ম্যাচিং কমান্ডের সাথে চারপাশে খেলা: gnu
টাইলার

আমি নিশ্চিত আপনি যখন আমার জন্য সমস্যার সমাধান করার জন্য বেঁধেছিলেন তখন আপনি অনুমান করেছিলেন; চেষ্টা করার জন্য আপনাকে ধন্যবাদ। উদাহরণস্বরূপ আপনার কোডটি ব্যবহার করে আমি এটির মাধ্যমে আমার পথে বিশৃঙ্খলা চালিয়েছি। সঠিক সমাধানের জন্য আমার আপডেট দেখুন।
Zhro

6

আপনি সময়ের সাথে এটি অভ্যস্ত হয়ে উঠবেন, তবে অবশ্যই এটির গতি বাড়ানোর জন্য আপনারা অনেক কিছুই করতে পারেন:

খাঁজ

এই উন্মাদনার একটি পদ্ধতি আছে। লিস্পে আপনি এটি করতে পারেন:

(a-fun (another-fun (magic-macro 1)))

মনে করুন এটি 1সত্যই একটি বৃহত প্রকাশ, এবং আপনি এটিকে তার নিজস্ব লাইনে যুক্ত করতে চান।

(a-fun (another-fun (magic-macro 
  1)))

এটি বিভ্রান্তিকর। 1এটি কেবলমাত্র একটি স্লট ইনডেন্টেড, যদিও এটি বাসা বাঁধার পুরো তিনটি স্তর! এটি এর পিতামাতার দ্বারা ভাল করা।

(a-fun (another-fun (magic-macro 
                      1)))

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

(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                      (+ (count-lines (point-min) (point-max)) 1))))       
          (linum-format 
            (concat " %" (number-to-string w) "d ")))
     ad-do-it))

ইন্ডেন্টেশন এবং বাসা বাঁধার মাত্রার মধ্যে দৃ corre় সম্পর্কটি নোট করুন। বৃহত্তর স্তরের নেস্টিংয়ের রেখাগুলি সর্বদা কম সহ লাইনের চেয়ে বেশি ইনডেন্ট করা হয়।

এটি একা অনেক সাহায্য করবে। আপনি কোডের "আকৃতি" সহজেই দেখতে পাবেন এবং বেশিরভাগ অন্যান্য ভাষা আপনাকে ব্লক এবং ব্লকগুলির সাথে কিছু বাসা বাঁধার (স্পষ্ট বা আবদ্ধ) দ্বারা ইনডেন্টেশন সংযুক্ত করতে প্রশিক্ষণ দিয়েছে।

অনুশীলন হিসাবে, আমি কোড থেকে অযৌক্তিক বন্ধনীগুলি সরিয়েছি। আপনার কোড দুটি পড়তে এবং হারিয়ে যাওয়া বন্ধনী সরবরাহ করতে সক্ষম হবেন, এলিস্পের প্রাথমিক জ্ঞান (যথা, জিনিসগুলি কী কী এবং মূল্যবোধগুলি এবং এর কাঠামো let*))

custom-set-variables '(linum-format 'dynamic)
defadvice linum-update-window (around linum-dynamic activate)
  let* w length number-to-string
                  + 
                    count-lines (point-min) (point-max) 
                    1       
         linum-format 
           concat " %" (number-to-string w) "d "
     ad-do-it

1
নোট করুন যে ইমাক্সে, হিটিং ট্যাবটি প্রায়শই এখানে বর্ণিত হিসাবে সঠিকভাবে ইনডেন্টেশনটি সেট করবে - আপনার হাতে স্পেস যোগ করে কখনও এটি করা উচিত নয়!
টাইলার

newline-and-indentইমাস-লিস্প-মোডের জন্য "সেন্টিমিটার" বেঁধে এবং লিস্প-ইন্টারেক্টিশন-মোড আপনার প্রথম উদাহরণটি পাইথননটকে সমাধান করে। আর টিএবি বাকি সময় কাজটি করবে।
কিউবরিক

5

আমি এটি একটি পৃথক উত্তর হিসাবে অন্তর্ভুক্ত করছি।

কখনও কখনও, ইন্ডেন্টেশন আপনাকে ব্যর্থ করবে। আপনার সাহস তখন, এরকম কিছু ব্যবহার করা rainbow-delimiters:

এখানে চিত্র বর্ণনা লিখুন

এটি কোনও পেরেনের নেস্টিং স্তরকে স্পষ্ট এবং সহজে স্ক্যান করে।

যদিও একটি খুব বড় সমস্যা রয়েছে: প্যারেনগুলি হাস্যকরভাবে বিভ্রান্ত করছে। এখানে জোরের ভারসাম্য রয়েছে। আপনার বাকী কোডটি ব্যয় করে প্যারেনগুলিতে rainbow-delimitersসাধারণত প্রচুর জোর দেওয়া যায়! তবে আপনি যদি রংধনুটির মুখটি স্বরূপ করেন তবে এগুলি স্ক্যান করা ক্রমশ শক্ত হয়ে যায়।

যদি আপনি এমন কোনও মুখের সন্ধান করতে পারেন যা এটি ভালভাবে ভারসাম্যপূর্ণ করে, তবে যেকোন উপায়ে এটি ব্যবহার করুন।

এটি বলেছিল, একটি সমাধান (যেটি আমাকে আনন্দিত করে তোলে), তার দুটি সেট মুখ এবং উড়ে যাওয়ার মধ্যে তাদের মধ্যে স্যুইচ করা। আপনি যখন অন্য জিনিসগুলি করছেন, তখন মুখগুলি পাতলা হয়ে যায় এবং পটভূমিতে বিবর্ণ হয়ে যায়:

এখানে চিত্র বর্ণনা লিখুন

তবে আপনি যখন কোনও প্যারেনের উপরে বক্তব্য রাখেন এটি প্যারেন্সকে খোঁচা দেয় যাতে আপনি নীড়ের স্তরগুলি দেখতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

এবং এটি করার কোডটি এখানে:

(defvar rainbow-delimiters-switch nil
  "t if rainbow-delimiters are currently punched")
(defvar rainbow-delimiters-face-cookies nil
  "a list of face-remap-add-relative cookies to reset")

(make-variable-buffer-local 'rainbow-delimiters-switch)
(make-variable-buffer-local 'rainbow-delimiters-face-cookies)

(add-hook 'prog-mode-hook #'rainbow-delimiters-mode)
(add-hook 'text-mode-hook #'rainbow-delimiters-mode)

(with-eval-after-load 'rainbow-delimiters
  (set-face-foreground 'rainbow-delimiters-depth-1-face "#889899")
  (set-face-foreground 'rainbow-delimiters-depth-2-face "#9b7b6b")
  (set-face-foreground 'rainbow-delimiters-depth-3-face "#7b88a5")
  (set-face-foreground 'rainbow-delimiters-depth-4-face "#889899")
  (set-face-foreground 'rainbow-delimiters-depth-5-face "#839564")
  (set-face-foreground 'rainbow-delimiters-depth-6-face "#6391aa")
  (set-face-foreground 'rainbow-delimiters-depth-7-face "#9d748f")
  (set-face-foreground 'rainbow-delimiters-depth-8-face "#7b88a5")
  (set-face-foreground 'rainbow-delimiters-depth-9-face "#659896")

  (defun rainbow-delimiters-focus-on ()
    "Punch the rainbow-delimiters"
    (setq rainbow-delimiters-face-cookies
      (list
        (face-remap-add-relative 'rainbow-delimiters-depth-1-face
          '((:foreground "#3B9399") rainbow-delimiters-depth-1-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-2-face
          '((:foreground "#9B471D") rainbow-delimiters-depth-2-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-3-face
          '((:foreground "#284FA5") rainbow-delimiters-depth-3-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-4-face
          '((:foreground "#3B9399") rainbow-delimiters-depth-4-face))
            (face-remap-add-relative 'rainbow-delimiters-depth-5-face
          '((:foreground "#679519") rainbow-delimiters-depth-5-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-6-face
          '((:foreground "#0E73AA") rainbow-delimiters-depth-6-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-7-face
          '((:foreground "#9D2574") rainbow-delimiters-depth-7-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-8-face
          '((:foreground "#284FA5") rainbow-delimiters-depth-8-face))
        (face-remap-add-relative 'rainbow-delimiters-depth-9-face
          '((:foreground "#199893") rainbow-delimiters-depth-9-face)))
      rainbow-delimiters-switch t))

  (defun rainbow-delimiters-focus-off ()
    "Reset the rainbow-delimiters faces"
    (mapc #'face-remap-remove-relative rainbow-delimiters-face-cookies)
    (setq rainbow-delimiters-switch nil))

  (defun rainbow-delimiters-focus-on-maybe ()
    "Punch the rainbow-delimiters if the point is on a paren"
    (when (looking-at "[][(){}]")
      (unless (or rainbow-delimiters-switch (minibufferp))
        (rainbow-delimiters-focus-on))))

  (defun rainbow-delimiters-focus-off-maybe ()
    "Reset the rainbow-delimiters if the point is not on a paren"
    (unless (looking-at "[][(){}]")
      (when rainbow-delimiters-switch
        (rainbow-delimiters-focus-off))))

  (run-with-idle-timer 0.6 t 'rainbow-delimiters-focus-on-maybe)
  (run-with-idle-timer 0.1 t 'rainbow-delimiters-focus-off-maybe))

এই দুর্দান্ত! হাইলাইট-প্রথম বন্ধনীর উপর দিয়ে আপনি রংধনু-সীমানা বাছাইকারী কোনও কারণ দিয়ে শুরু করেছেন?
টাইলার

@ টাইলারের কোনও বিশেষ কারণ নেই, যদিও আমি এখনও রামধনু ডিলিমিটারগুলির সাথে রয়েছি (তবে এটি কেবল কারণ এটির আমি অভ্যস্ত)। খুব সহজেই আমি হাইলাইট-প্রথম বন্ধনী সম্পর্কে শুনিনি।
পাইথননট

4

আপনি যদি আপনার কোডটি ইন্ডেন্ট করেন তবে আপনার অবশ্যই এটি সঠিকভাবে ইনডেন্ট করা দরকার। লিস্প বিকাশকারীদের প্রত্যাশা থাকে সঠিকভাবে ইনডেন্ট করা কেমন হবে। এর অর্থ এই নয় যে কোডটি সমস্ত একই দেখাচ্ছে। কোড ফর্ম্যাট করার বিভিন্ন উপায় এখনও রয়েছে।

  • একটি লাইন কত দীর্ঘ হওয়া উচিত?
  • লাইনের মাধ্যমে কোনও ফাংশন / ম্যাক্রো কল বিতরণ করবেন কীভাবে?
  • ইন্ডেন্টেশনের কত স্পেস থাকতে হবে?
(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
            ad-do-it))

আমি প্রত্যাশা করব যে ইনডেন্টেশন কোনও উপায়ে কন্টেন্ট দেখায়। তবে আপনার কোডে নেই।

ডিফল্টরূপে আপনার কোডটি এভাবে ইন্টেন্ট করা হতে পারে। অন্যান্য উত্তরগুলি ইম্যাক্সের সাহায্যে আপনি কীভাবে এটি করতে পারেন তা বর্ণিত:

(defadvice linum-update-window (around linum-dynamic activate)
  (let* ((w (length (number-to-string
                     (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")))
    ad-do-it))

আমি আশা করব যে letবাউন্ড ভেরিয়েবলগুলি একই উল্লম্ব কলামে শুরু হবে। আমিও আশা যে শরীর এর letকম ইন্ডেন্টযুক্ত করা হয়। আমরা শিখি কীভাবে একটি letইন্টেন্ট করা উচিত। একবার আপনি কিছুটা প্রশিক্ষণ নিলে এটি চাক্ষুষ বিন্যাস যা সহজেই স্বীকৃত।

কোডের মূল ভিজ্যুয়াল বিল্ডিং ব্লকগুলি হ'ল defadvice, let*এবং ফাংশন কলগুলির একটি গুচ্ছ। defনামে আমাকে বলে যে এটি একটি সংজ্ঞা একটি নাম, একটি আর্গুমেন্ট তালিকা এবং একটি শরীরের দ্বারা অনুসরণ।

এইভাবে আমি দেখতে পছন্দ করি

defadvice name arglist
  body

let*হবে: let*, বাইন্ডিং এবং একটি শরীরের একটি তালিকা।

এইভাবে আমি দেখতে পছন্দ করি:

let*  list of bindings
  body

আরো বিস্তারিত:

let*   binding1
       binding2
       binding3
  body

একটি ফাংশন কলের জন্য আমি দেখতে চাই:

FUNCTIONNAME ARG1 ARG2 ARG3

অথবা

FUNCTIONNAME ARG1
             ARG2
             ARG3

অথবা

FUNCTIONNAME
  ARG1
  ARG2
  ARG3

কোনটি ব্যবহৃত হয় তা নির্ভর করে আর্গুমেন্টগুলি কত দিন। আমরা লাইনগুলি খুব বেশি দীর্ঘ করতে চাই না এবং প্রতিটি লাইনের নিজস্ব লাইনে আমাদের আরও কাঠামো তৈরি করতে দেয়।

সুতরাং আপনাকে সেই কোডগুলি ব্যবহার করে আপনার কোড লিখতে হবে এবং আপনাকে নিশ্চিত করতে হবে যে পাঠক সহজেই আপনার কোডগুলিতে সেই নিদর্শনগুলি সনাক্ত করতে পারে।

অভিভাবকদের সরাসরি তাদের নির্মাণগুলি আবদ্ধ করা উচিত।

(sin 10)

(sin
  10)

সাদা স্থান উদাহরণ এড়িয়ে চলুন:

(  sin 10  )

অথবা

(
   sin
)

অথবা

(sin 10
)

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

আপনাকে এক্সপ্রেশন সীমানা সন্ধান করতে সমর্থন করার জন্য বন্ধনী ব্যবহার করুন। এগুলি আপনাকে তালিকা থেকে তালিকায় যেতে, তালিকাগুলি সম্পাদনা করতে, তালিকাগুলি কাট & অনুলিপি করতে, তালিকাগুলি প্রতিস্থাপন করতে, ইনডেন্ট / ফর্ম্যাট তালিকায়, তালিকা নির্বাচন করতে, ...


2

ইন্ডেন্টেশন সম্পর্কিত প্রাথমিক সহায়তার জন্য, টিএবি এবং "সিএমকিউ" ( indent-pp-sexp) ব্যবহার করুন; "Cm" বাঁধাই newline-and-indentআপনাকে একটি নতুন লাইনের পরে TAB টিপতে হবে save

আপনি "সিএম-বাম / ডান / উপরে / ডাউন / বাড়ি / শেষ" দিয়ে sexp এ নেভিগেট করতে পারেন, যা খুব দরকারী।

যদি আপনি প্রথম বন্ধনী ভারসাম্য বজায় রাখার বিষয়ে উদ্বিগ্ন হন তবে স্মার্টপ্যারেনের মতো কিছু ব্যবহার করুন (এটি পেরেডিট কিছুটা ক্ষমা করার মতো , যা প্রাথমিকভাবে স্ট্রেইট জ্যাকেট পরা মনে হতে পারে)। এটি সেক্সপ স্তরে নেভিগেট এবং সম্পাদনার জন্য প্রচুর বাইন্ডিং সহ আসে।

শেষ অবধি, প্যারেন্সকে হাইলাইট করার জন্য, বিকল্পটি চালু করে (বিকল্প মেনু-> হাইলাইটের সাথে ম্যাচিং করা প্রথম বন্ধনী, বা show-paren-mode।) আপনি তার মন্তব্যে আইনজীবিদের দ্বারা উল্লিখিত একটি প্যাকেজও ব্যবহার করতে পারেন, যেমন "হাইলাইট-প্রথম বন্ধনী" বা "রংধনু-সীমান্তকারক" "।


1

উত্তর হিসাবে অন্যেরা যা দিয়েছে তার সংযোজন হিসাবে, আমার 2 সেন্ট এখানে রয়েছে:

  • সরবরাহ করা স্বয়ংক্রিয় ইন্ডেন্টেশন emacs-lisp-modeপ্রয়োজনীয়।
  • blink-matching-parennilডিফল্টরূপে (অ- ) চালু রয়েছে। ছেড়ে দাও।
  • আমি show-paren-modeকার্সারের আগে ডান পেরেনের সাথে সম্পর্কিত বাম পেরেনটি হাইলাইট করতে ব্যবহার করি ।
  • আমি সাময়িকভাবে কার্সারের আগে ডান প্যারেনটি মুছতে এবং পুনরায় টাইপ করি, যদি আমি মিলে যাওয়া বাম প্যারেনটি কোথায় থাকে তা আরও ভাল দেখতে চাই।

আমি বৈদ্যুতিক জুড়ি বা রংধনু কিছুই বা এই জাতীয় কোনও "সহায়তা" ব্যবহার করি না । আমার কাছে এগুলি বিরক্তিকর, সাহায্য নয়।

বিশেষত, electric-pair-modeআমার কাছে এটি একটি অসুবিধাগ্রস্থ বিরক্তিকর। তবে কিছু লোক এটি পছন্দ করে। এবং আমি কল্পনা করি যে এটি লিস্প প্রথম বন্ধনী ছাড়াও কিছু অন্যান্য জুটিবদ্ধ প্রসঙ্গে সহায়ক হতে পারে (আমি এটি কল্পনা করি তবে আমিও এরকম ব্যবহারের ক্ষেত্রে বিশ্বাস করি না)।

আপনার জন্য সবচেয়ে কার্যকর কী হবে তা আপনি খুঁজে পাবেন। আমি বলতে চাই প্রধান জিনিসগুলি: (1) স্বয়ংক্রিয় ইন্ডেন্টেশন আপনার বন্ধু, যেমন পয়েন্টের আগে ডান প্যারেনের সাথে মেলে এমন বাম পেরেনটি চিহ্নিত করার কিছু উপায়।

বিশেষত, স্বয়ংক্রিয় ইন্ডেন্টেশন আপনার জন্য কী করে তা অবিলম্বে আপনাকে শিখিয়ে দেয় যে আপনি আর কখনও সঠিক প্যারেনগুলি নিজেরাই লাইনে রাখতে চান না। কোডিংয়ের সেই স্টাইলটি, যা অন্যান্য ভাষায় সর্বব্যাপী, কেবল শোরগোল।

স্বয়ংক্রিয় খাঁজ এছাড়া আপনার সাথে পেতে RETএবং TABব্যবহার আরামদায়ক পেতে C-M-q। (ব্যবহারের C-h kমধ্যে emacs-lisp-modeখুঁজে বের করতে কি এই কী না।)


1

আমি লক্ষ্য করেছি যে কিছু লোক ইতিমধ্যে রেইনবো-ডিলিমেটারগুলি উল্লেখ করেছে, লিস্প কোড সম্পাদনা করার সময় এটি আমার প্রিয় মোডও।

আসলে আমি প্রথম বন্ধনীগুলি পছন্দ করি, লিস্প সম্পর্কে সবচেয়ে ভাল বিষয় হ'ল সেই বন্ধনীগুলি, আপনি কীভাবে জানেন তা যদি তাদের সাথে আচরণ করা মজাদার হয়:

  • অবিশ্বাস্য-মোড এবং এর প্লাগইনটি অশুভ-চারপাশে ইনস্টল করুন, যাতে আপনি সহজেই প্রথম বন্ধনী সম্পাদনা করতে পারেন, উদাহরণস্বরূপ, টিপলে ci(অভ্যন্তরীণ সমস্ত কিছুই মুছে ফেলা হবে (), va("()" এবং "()" নিজের দ্বারা মোড়ানো জিনিসটি নির্বাচন করবেন। এবং আপনি %ম্যাচ করা বন্ধনীগুলির মধ্যে লাফ দিতে টিপতে পারেন

  • ফ্লাই চেক বা ফ্লাইমেক ব্যবহার করুন, ম্যাচমিনে প্রথম বন্ধনীগুলি রিয়েল টাইমে আন্ডারলাইন হবে


0

এখানে অসুবিধাটি হ'ল আপনি একটি নির্দিষ্ট আগে এবং পরে কিছু কোড যুক্ত করতে চান sexp। এই পরিস্থিতিতে যৌনতা হয় (concat " %" (number-to-string w) "d ")। আপনি এর আগে যদি আই -স্টেটমেন্ট(if (> w 1) এবং তার পরে অন্য বিবৃতি " %2d ") .োকাতে চান।

অসুবিধার একটি প্রধান অংশ এটি বিচ্ছিন্ন করাsexp , ব্যক্তিগতভাবে আমি এটিকে বিচ্ছিন্ন করার জন্য নীচের কমান্ডটি ব্যবহার করিsexp

(defun isolate-sexp () (interactive)
       (save-excursion (forward-sexp) (if (not (eolp-almost))
               (split-line) nil)))
(defun eolp-almost () (interactive)
(save-excursion (while (equal (char-after) ? ) (forward-char 1))
        (if (eolp) t nil )      ))

শুধু শুরুতে কার্সার করা (concat " %" (number-to-string w) "d "), অর্থাত প্রথমে (, তারপর উপরে প্রয়োগ isolate-sexp। আপনি প্রাপ্ত

(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (concat " %" (number-to-string w) "d ")
                                  ))
            ad-do-it))

তারপরে এবং এর আগে এবং পরে উপযুক্ত কোড যুক্ত করুন sexp, অর্থাত্‍

(defadvice linum-update-window (around linum-dynamic activate)
   (let* ((w (length (number-to-string
      (+ (count-lines (point-min) (point-max)) 1))))
         (linum-format (if (> w 1) (concat " %" (number-to-string w) "d ") " %2d ")
                                  ))
            ad-do-it))

এবং voila। এইভাবে প্রাপ্ত কোডটি সম্ভবত সুন্দর নয় তবে হারিয়ে যাওয়ার সম্ভাবনাও কম।

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