سؤال

عند استخدام Paredit في أوضاع البرمجة مثل C، سيتم كتابة المساحة (سيتم إدراج مساحة قبل أن أحاول استدعاء وظيفة، تاركيني مع:

foo ()

هل هناك طريقة لتعطيل إدراج الفضاء دون تغيير مصدر البارديكت؟

هل كانت مفيدة؟

المحلول

حسنا، يبدو أن الطريقة الباراديت تعمل هي أنه يتحقق من جداول بناء الجملة لمعرفة ما إذا كنت تقوم بإدراج زوج مباشرة بعد كلمة / رمز / إلخ.، وفي هذه الحالة تقوم بإدراج مساحة لإدراجها. تحتاج إلى تجاوز تلك الوظيفة - التي يمكن القيام بعدد من الطرق المختلفة: المشورة، وإعادة تعريف الوظيفة تحديد المساحة، وتغيير جدول بناء الجملة، إلخ.

سأحاول مباشرة إلى الأمام:

(defun paredit-space-for-delimiter-p (endp delimiter)
  (and (not (if endp (eobp) (bobp)))
       (memq (char-syntax (if endp (char-after) (char-before)))
             (list ?\"  ;; REMOVED ?w ?_
                   (let ((matching (matching-paren delimiter)))
                     (and matching (char-syntax matching)))))))

من الواضح أن هذا ستنطبق على جميع الأماكن التي تستخدمها paredit. وبعد إذا كنت تريد شيئا أكثر تحديدا، فيمكنك إضافة بعض الشروط إلى ذلك and بيان (على سبيل المثال (and ... (memq major-mode '(c-mode lisp-mode)))).

لذلك ... أعتقد أنني قمت بتغيير "المصدر"، لكن يمكنك أن تفعل الشيء نفسه مع قطعة من defadvice ... كل شيء Elisp، لذلك الفرق هو الحد الأدنى. لا يبدو أن هناك إعداد للتحكم في هذا النوع من السلوك.

نصائح أخرى

يرى paredit-space-for-delimiter-predicates

نحن سوف، الباراديت مثالي لتحرير اللغات التي بنيت من تعبيرات S. إذا كنت ترغب فقط بكيفية إدراج تحظير إغلاق تلقائيا، فاستخدم ميزة هيكل عظمي زوج.

(setq skeleton-pair t)
(global-set-key "(" 'skeleton-pair-insert-maybe)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top