كيف يمكنك التعليق على كل أو جزء من Lisp S-Exp باستخدام Paredit؟
سؤال
عند تحرير رمز LISP ، من المفيد أحيانًا التعليق تمامًا على تعريف المستوى الأعلى ، مثل هذا:
;(defun some-fn-which-is-broken (x)
; ...)
... أو التعليق فقط جزء من التعبير S ، مثل هذا:
(foo x
; y
z)
... ثم إعادة ترجمة الملف واختبار شيء ما في Repl ، إلخ.
مع تمكين بوديت وضع ، هذا لا يعمل. إليك ما يحدث ، إذا كانت النقطة مباشرة قبل Paren الأولى أدناه:
(defun some-fn (x)
...)
وتكتب فاصلة فاصلة ، ما تم إدخاله هو فاصلة منقوطة وخط جديد:
;
(defun some-fn (x)
...)
نفس الشيء مع التعليق على جزء من التعبير S:
(foo x
;
y
z)
أعتقد أنه إذا كان التعريف كله على سطر واحد ، فهذا يعمل:
;(defparameter *foo* 10)
... لكن على خلاف ذلك ، لا يمكنني معرفة كيفية القيام بذلك. باريت رائع ، أود حقًا الاستمرار في استخدامه. هل هناك أي lispers الذين يعرفون طريقة للتغلب على هذا ، أو emacs-wizards التي يمكن أن تثير القليل من emacs lisp لربط شيء مثل paredit-comment-out-s-expr
?
إذا كانت هناك طريقة أكثر إزعاجًا أو emacsy لإنجاز نفس الشيء ، فتعليق على أجزاء من المصدر لإعادة الترجمة ، من فضلك ، لا تتردد في اقتراحهم!
المحلول
ضع النقطة على الشخصية الأولى من SEXP بأكمل سم الفضاء, والمسألة م- ؛ للقيام بالتعليق. إذا كان من الضروري القيام بذلك ، فسيتم إعادة تنسيق رمز المصدر الخاص بك أيضًا بحيث يكون SexP فقط الذي حددته ، ولا يوجد شيء على نفس الخط ، في تعليق.
يمكنك بسهولة جعل الأمر بسيطًا أو حتى ماكرو للقيام بذلك:
(defun comment-sexp () "Comment out the sexp at point." (interactive) (save-excursion (mark-sexp) (paredit-comment-dwim)))
نصائح أخرى
مجرد ملاحظة جانبية:
ال #+
و #-
وحدات الماكرو للقارئ لطيفة جدا للتعليق على sexps. يسمحون بتجاهل sexp التالي ، إذا لم يتم العثور على الرمز المعطى في *FEATURES*
. فقط اختر رمزًا ليس في *FEATURES*
, ، واستخدامه مع #+
مثله:
#+nil
(defun foo ()
...)
الآن ، سيتم تجاهل تعريف الوظيفة (ما لم NIL
في داخل *FEATURES*
, ، وهو ليس من المحتمل جدًا).
كقياس stopGap ، يمكنك استخدام CQ (quoted-insert
) لإدراج شخصية تعسفية دون تشغيل أي سحر متعلق بالوضع. على سبيل المثال ، في وضع Java ، يكتب قوسين يكررون الخط الحالي ، وهو ليس دائمًا ما أريده ؛ في مثل هذه الحالات ، سأدخل قوسين CQ للحفاظ على المسافة البادئة. (أو في كثير من الأحيان ، سأكتب قوسين ، وألاحظ تغيير المسافة البادئة ، واللعنة ، والتراجع ، وإعادة الدخول مع CQ.)
للتعليق بشكل عام ، ربما يكون من الأسهل استخدامه م- ؛ (comment-dwim
) بدلا من كتابة المنقصين يدويا.
يمكنك استخدام C-M-SPC M-;
للاحتفال بالتعبير S (C-M-SPC
إلى عن على mark-sexp
) ثم التعليق عليه (M-;
إلى عن على comment-dwim
).
في Paredit 23 ، مجرد الكتابة ;
لن تدفع أي شيء لا يجب أن يكون خارج الخط. لذلك سيفعل الشيء الصحيح لمثالك الثاني. وإذا أردت التعليق z
بدلاً من y
من شأنه أن يدفع فقط المحدد الختامي إلى خط آخر.