বৈদ্যুতিক-জুড়ি-মোডের জন্য অতিরিক্ত মোড-নির্দিষ্ট জুটি কীভাবে সংজ্ঞায়িত করবেন


13

electric-pair-modeবর্তমান মেজর মোডের উপর ভিত্তি করে ডিলিমিটারগুলির (প্রথম বন্ধনী, স্কোয়ার ব্র্যাকেটস ইত্যাদি) মিলিয়ে জোড়া লাগানোর জন্য একটি বিল্ট ইন মোড a

আমি জানি যে আমি অতিরিক্ত জোড়া (যা বৈশ্বিক হবে ) এর মতো সংজ্ঞা দিতে পারি :

(push '(?\' . ?\') electric-pair-pairs)      ; Automatically pair single-quotes
(push '(?\' . ?\') electric-pair-text-pairs) ; ... in comments

আমার প্রশ্ন হল , আমি মোড-নির্দিষ্ট জুটি (উদাহরণস্বরূপ //, এর ==জন্য org-mode) কীভাবে সংজ্ঞায়িত করতে পারি ?

উত্তর:


7

এটি করার একটি সহজ উপায় হ'ল প্রাসঙ্গিক মোডগুলির জন্য হুকগুলিতে তৈরি electric-pair-pairsএবং electric-pair-text-pairsবাফার-স্থানীয় করা এবং তাদের কাস্টমাইজ করা।

উদাহরণস্বরূপ ওয়ার্কিং জন্য org-mode:

(defvar org-electric-pairs '((?/ . ?/) (?= . ?=)) "Electric pairs for org-mode.")

(defun org-add-electric-pairs ()
  (setq-local electric-pair-pairs (append electric-pair-pairs org-electric-pairs))
  (setq-local electric-pair-text-pairs electric-pair-pairs))

(add-hook 'org-mode-hook 'org-add-electric-pairs)

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


অতিরিক্ত তথ্য: setq-local

থেকে তৈরি এবং একবার মুছে বাফার-স্থানীয় বাইন্ডিং বিভাগে Elisp ম্যানুয়াল :

ম্যাক্রো: setq-local variable value

এই ম্যাক্রো বর্তমান বাফারের জন্য একটি বাফার-স্থানীয় বাঁধাই তৈরি করে VARIABLEএবং এটিকে বাফার-স্থানীয় মান দেয় VALUE। এটি make-local-variableঅনুসরণ করার পরে কল করার সমতুল্য setqVARIABLEএকটি অনাবৃত প্রতীক হওয়া উচিত।


7

সঠিক উপায়ে: আপনার প্রকল্পের সঠিক চ্যানেল, যেমন মাধ্যমে একটি বাগ রিপোর্ট পূরণ org-submit-bug-reportবা report-emacs-bugএবং তর্ক কেন আপনার প্রিয় চরিত্রের সিনট্যাক্স বর্গ পরিবর্তন করা উচিত নয়।

বিকল্পভাবে, আপনি সঠিক সিনট্যাক্স-টেবিলটি (info "(elisp) Syntax Tables")আপনার মধ্যে পরিবর্তন করতে পারেন init.el

অর্গ চেষ্টা করি:

(with-eval-after-load 'org
  (modify-syntax-entry ?/ "(/" org-mode-syntax-table)
  (modify-syntax-entry ?= "(=" org-mode-syntax-table)
  (add-hook 'org-mode-hook 'electric-pair-mode))

বিকল্পভাবে, আপনি ফলব্যাক ভেরিয়েবলগুলি ব্যবহার করতে পারেন। এখানে একটি ডিফুন রয়েছে যা কাজ করা উচিত, তবে আপনি সম্ভবত সুন্দর করতে চান:

(defun rasmus/electric-pairs-with-local-pairs (pairs)
  "Start electric pair with buffer-local PAIRS.

  PAIRS is a list of strings and/or cons of strings."
  (require 'elec-pair)
  (let ((ec-lists '(electric-pair-pairs electric-pair-text-pairs)))
    (mapc 'make-local-variable ec-lists)        
    (mapc (lambda (L)
            (mapc (lambda (elm) (add-to-list L elm))
                  (mapcar (lambda (x)
                            (if (consp x)
                                (cons (string-to-char (car x))
                                      (string-to-char (cdr x)))
                              (cons (string-to-char x)
                                    (string-to-char x))))
                          pairs)))
          ec-lists))
  (electric-pair-mode t))

(with-eval-after-load 'org
  (add-hook 'org-mode-hook
            (lambda ()
              (rasmus/electric-pairs-with-local-pairs
               '("/" "=" ("`" . "'"))))))

একটি উত্তর পোস্ট করার জন্য ধন্যবাদ যা সিনট্যাক্স টেবিলটি কীভাবে পরিবর্তন করতে পারে তা দেখায়। আপনার উত্তরের দুটি পরামর্শের মধ্যে, এটিই আমি পছন্দ করব। ডাব্লু / আর / টি ফ্যালব্যাক ভেরিয়েবলগুলি ব্যবহার করে, আমি আরও একটি সমাধান নিয়ে এসেছি যা defunআপনার উত্তরের চেয়ে কিছুটা খাটো ।
itjeyd

2

এই উত্তরটি কীভাবে কনফিগার করতে হয় সে সম্পর্কে আপনার প্রশ্নের উত্তর দেয় না electric-pair-mode। তবে এটি আপনাকে পছন্দসই ফলাফলের দিকে নিয়ে যেতে পারে।

wrap-regionপ্যাকেজ Melpa, উপলব্ধ আপনার সমস্যা উত্তর হতে পারে। এখানে এর গিথুব থেকে সংক্ষিপ্ত বিবরণ দেওয়া হল:

মোড়ক অঞ্চল ইমাক্সের জন্য একটি ছোটখাটো মোড যা অঞ্চলগুলিকে বিরামচিহ্ন সহ মোড়ানো করে। এইচটিএমএল এবং এক্সএমএলের মতো "ট্যাগযুক্ত" মার্কআপ মোডগুলির জন্য, এটি ট্যাগ দিয়ে মোড়ানো।

আমি এখানে আমার নির্বাচিত মোডগুলিতে কাজ করতে সেট করেছি। স্নিপেট আপনার প্রশ্নে উত্থাপিত পয়েন্টগুলিও কভার করে; org-modeফন্ট সম্পত্তি চিহ্নিতকারী সম্পর্কে ।

(require 'wrap-region)

;; Enable wrap-region in the following major modes
(dolist (hook '(emacs-lisp-mode-hook
                org-mode-hook))
  (add-hook hook 'wrap-region-mode))

(wrap-region-add-wrapper "`" "'") ; select region, hit ` then region -> `region'

(wrap-region-add-wrapper "=" "=" nil 'org-mode) ; select region, hit = then region -> =region= in org-mode
(wrap-region-add-wrapper "*" "*" nil 'org-mode) ; select region, hit * then region -> *region* in org-mode
(wrap-region-add-wrapper "/" "/" nil 'org-mode) ; select region, hit / then region -> /region/ in org-mode
(wrap-region-add-wrapper "_" "_" nil 'org-mode) ; select region, hit _ then region -> _region_ in org-mode
(wrap-region-add-wrapper "+" "+" nil 'org-mode))) ; select region, hit + then region -> +region+ in org-mode

আমি যুক্ত করতে চাই যে এই প্যাকেজটি expand-regionপ্যাকেজটির সাথে সত্যিই বেশ ভাল কাজ করে (মেলপাতেও উপলভ্য)।

এই 2 টি প্যাকেজ সহ, আমি যখন আছি org-mode, করছেন: MY-EXPAND-REGION-BINDING *একটি শব্দতে এটি সাহসী করবে make


আপনার উত্তরের জন্য ধন্যবাদ. আমি wrap-regionপ্যাকেজ সম্পর্কে সচেতন ছিল ; এটি বেশ কার্যকর আমি বর্তমানে আমার উপর নির্ভরশীল তৃতীয় পক্ষের প্যাকেজগুলির সংখ্যা হ্রাস করার চেষ্টা করছি, সুতরাং আমি এই সমাধানটি ব্যবহার করব না, তবে এটি অবশ্যই এখানে উল্লেখের যোগ্য! :)
जेড

2

এর জাজের উত্তরের ভিত্তিতে:

(defmacro spw/add-mode-pairs (hook pairs)
  `(add-hook ,hook
             (lambda ()
               (setq-local electric-pair-pairs (append electric-pair-pairs ,pairs))
               (setq-local electric-pair-text-pairs electric-pair-pairs))))

(spw/add-mode-pairs 'emacs-lisp-mode-hook '((?` . ?')))

এটিকে কাজ করার জন্য আমাকে চরিত্রগুলি থেকে বাঁচতে হয়েছিল(?\= . ?\=)
21-25 এ ফক্সড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.