ইন্ডিডেন্ট ব্লকের আগে কোড যুক্ত করার সময় বা সরানোর সময় এলিস্প কোডটি স্বয়ংক্রিয়ভাবে পুনরায় প্রবেশকরণ


18

বলুন আমার কাছে একটি এলিস্প কোড রয়েছে:

(+ 2 3▮(+ 3
          4))

আমি যখন চিহ্নগুলি যুক্ত করব বা সরিয়ে ফেলব তখন কার্সারের পরে সেক্সপটি স্বয়ংক্রিয়ভাবে পুনরায় প্রবেশের কোনও উপায় আছে?

তাই চাপ দেওয়ার পরে SPC 4 SPCআমি স্বয়ংক্রিয়ভাবে পেতাম:

(+ 2 3 4 ▮(+ 3
             4))

আমি mark-sexpঅনুসরণ করে কল করে এই ম্যানুয়ালটি করতে পারি indent-region। এটি করার আরও ভাল উপায় আছে?


আমি মনে করি না কোনও সুবিধাজনক ডিফল্ট কী-বাইন্ডিং রয়েছে তবে আপনি সহজেই নিজেকে তৈরি করতে পারেন।
shosti

আমি জানি কিন্তু আমি বিশেষভাবে ভাবছি যে এটি করার আরও ভাল কোনও উপায় আছে । উদাহরণ হিসেবে বলা যায় কিভাবে electric-indent-modeঅনেক ম্যাপিং বেশী ভালো <return>করতেnewline-and-indent
Maciej Goszczycki

উত্তর:


14

mark-sexp+ এর পরিবর্তে indent-region, আপনি টিপতে পারেন C-M-q। এই কল করবে indent-pp-sexp। স্বয়ংক্রিয় নয়, তবে দুটি কমান্ড চাওয়ার চেয়ে কিছুটা ভাল।

অথবা আপনি যদি ব্যবহার করেন তবে paredit-modeটিপুন M-q। এটি আপনার সম্পূর্ণ ফাংশন সংজ্ঞাটিকে পুনরায় প্রেরণ করবে।


1
(add-hook 'post-self-insert-hook 'indent-pp-sexp)বিস্ময়কর ভাল কাজ করে।
ম্যাকিয়েজ গোসকিজিকি

ভাল লাগছে। এটি কিছু মোডে ব্যয়বহুল হতে পারে তবে এটি তবুও একটি দুর্দান্ত পদ্ধতির।
দিমিত্রি

স্মার্টপ্যারেন ব্যবহারকারীদের জন্য আপনি বর্তমান ডিফুনকে পুনরায় উপহার দিতে পারেন M-x sp-indent-defun। আমি এটি আবদ্ধ C-M-q
র‌্যাডন রোসবারো

15

আগ্রাসী ইনডেন্ট মোড

যেহেতু কিছু লোক এটি চেয়েছিল, আমি এই উত্তরটিকে একটি প্যাকেজে পরিণত করেছি ।

আপনার যদি মেলপা কনফিগার করা থাকে তবে আপনি এটি দিয়ে ইনস্টল করতে পারেন

M-x package-install RET aggressive-indent

সমস্ত বিকল্পের জন্য রেডমি দেখুন , তবে এটি চালু করার সহজতম উপায় হ'ল:

(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)

ওল্ড উত্তর

নিম্নলিখিতগুলি কেবলমাত্র এলিস্প বাফারগুলিতে স্বয়ংক্রিয়-ইন্ডেন্টেশন করে। আপনি জিনিসগুলি মুছতে বা ইয়াঙ্ক করার সময় (কেবলমাত্র টাইপের পরিবর্তে) কাজ করার সুবিধা রয়েছে। এটি অন্যান্য মোডেও যুক্ত করা সহজ।

এই বিন্দুটি বর্তমানে বিন্দুটির ভিতরে যা-ই-এক্সপ্রেশন রয়েছে তা যুক্ত করে দেবে। আপনি চাইলে এটি একটি কীতে বাঁধতে পারেন তবে প্রথমে নীচে দেখুন।

(require 'cl-lib)

(defun endless/indent-defun ()
  "Indent current defun.
Do nothing if mark is active (to avoid deactivating it), or if
buffer is not modified (to avoid creating accidental
modifications)."
  (interactive)
  (ignore-errors
    (unless (or (region-active-p)
                buffer-read-only
                (null (buffer-modified-p)))
      (let ((l (save-excursion (beginning-of-defun 1) (point)))
            (r (save-excursion (end-of-defun 1) (point))))
        (cl-letf (((symbol-function 'message) #'ignore))
          (indent-region l r))))))

এই হুকটি এটি তৈরি করবে যাতে আপনি যে কোনও কিছু টাইপ করার পরে এই ফাংশনটি চালানো হবে তবে কেবল এলিজ্প বাফারে। এটি সবকিছু সর্বদা অভিযুক্ত রাখা উচিত।

(add-hook
 'emacs-lisp-mode-hook
 (lambda ()
   (add-hook 'post-command-hook
             #'endless/indent-defun nil 'local)))

চেষ্টা করে দেখুন! এটি লক্ষণীয়ভাবে ভাল কাজ করে।

এছাড়াও, মন্তব্যে @ হোলোক্রোনউইভারের পরামর্শ অনুসরণ করে, আপনি সি-জাতীয় ভাষার জন্য নীচের মতো কিছু ব্যবহার করতে পারেন:

(define-key c++-mode-map ";"
  (lambda () (interactive)
    (insert ";")
    (endless/indent-defun)))

এই নীরব অটো-ইনডেন্ট বার্তাগুলি এবং সেমিকোলনগুলির সাথে শেষ হওয়া লাইনগুলিকে আরও ভালভাবে পরিচালনা করা ভাষাগুলি যদি দুর্দান্ত হয়।
হোলোক্রোনউইভার

@ হোলোক্রোনউইভার অবশ্যই, আমি এটি চেষ্টা করতে পারি। কোন প্রধান মোডে ইনডেন্ট বার্তা রয়েছে? আর সেমি কলোন নিয়ে সমস্যা কী?
মালবারবা

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

@ হোলোক্রোনউইভার ম্যাসেজগুলি সাইলেন্স করেছেন। এটা ইশারা জন্য ধন্যবাদ।
মালবারবা

ঠিক করার জন্য ধন্যবাদ! সেমিকোলন সমস্যার একটি সমাধান হ'ল সেমিকোলন টাইপ করা হলে কেবল সি-মোড ভাষায় ইনডেন্ট করা।
হলোক্রনউইভার

3

আমি পূর্ব-বিদ্যমান সমাধান সম্পর্কে জানিনা, তবে আপনি post-self-insert-hookনিজে এটি সম্পাদন করতে ব্যবহার করতে পারেন :

(defun my-indent-next-sexp ()
  (interactive)
  (mark-sexp)
  (indent-region))

(add-hook 'post-self-insert-hook 'my-indent-next-sexp)

আমি সম্ভাব্য পারফরম্যান্স সমস্যা সম্পর্কে যদিও উদ্বিগ্ন হবে।


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