คำสั่งที่ฟอร์แมต (prettifies) รหัส Elisp


21

สมมติว่าฉันมีฟังก์ชั่นที่มีลักษณะดังต่อไปนี้ (ตามปกติเมื่อพิมพ์เอลลิสเอาท์พุท)

(defun my-example-function () (let ((a (do-something)) (b (do-something))) (setq someone me) (with-current-buffer b (do-that (or this (and that those))) (format "%s" a))))

ฉันต้องการคำสั่งที่สามารถเปลี่ยนสิ่งนั้นให้เป็นสิ่งที่มนุษย์จะเขียนเช่นดังต่อไปนี้

(defun my-example-function ()
  (let ((a (do-something))
        (b (do-something)))
    (setq someone me)
    (with-current-buffer b
      (do-that (or this (and that those)))
      (format "%s" a))))

ฉันเข้าใจว่ามีมากกว่าหนึ่งวิธีในการจัดรูปแบบโค้ด elispและมนุษย์ต่างคนทำสิ่งนั้นแตกต่างกัน นอกจากนี้ฉันเข้าใจว่ามันค่อนข้างเป็นอัตนัย แต่มันควรจะค่อนข้างง่ายที่จะเกิดขึ้นกับชุดของกฎที่ส่งผลให้รหัสที่อย่างน้อยดี

จริง ๆ แล้วฉันเคยคิดที่จะทำสิ่งนี้ด้วยตัวเองเมื่อไม่นานมานี้ แต่ฉันคิดว่ามันเป็นการดีกว่าที่จะถามก่อนที่ฉันจะประดิษฐ์ล้อ

หมายเหตุฉันรู้เกี่ยวกับฟังก์ชั่นppแต่ไม่ได้ไปที่นั่น:

(defun my-example-function nil
  (let
      ((a
        (do-something))
       (b
        (do-something)))
    (setq someone me)
    (with-current-buffer b
      (do-that
       (or this
           (and that those)))
      (format "%s" a))))

4
สิ่งนี้ช่วยได้ไหม? การจัดรูปแบบ Elisp
ลุค

การจัดรูปแบบจำเป็นต้องเป็นเรื่องส่วนตัว ppผมไม่แน่ใจว่าคุณสามารถทำอะไรได้ดีกว่ารุ่นที่ดีกว่าเล็กน้อย
shosti

@King ขอบคุณมันมีความเกี่ยวข้องอย่างแน่นอน
Malabarba

คำตอบ:


10

นี่เป็นวิธีการจัดรูปแบบlispyอีกครั้งสำหรับฉัน (โดยการกดMที่ส่วนท้ายของนิพจน์):

(defun my-example-function ()
  (let ((a (do-something))
        (b (do-something)))
    (setq someone me)
    (with-current-buffer b (do-that (or this (and that those)))
                         (format "%s" a))))

qk C-m [จะได้รับจากการจัดรูปแบบนี้เพื่อที่คุณระบุไว้กด


(local-set-key (kbd "s-8") #'lispy-multiline) (local-set-key (kbd "s-*") #'lispy-oneline)
grettke

8

ตามที่คนอื่น ๆ แนะนำไว้ในความคิดเห็น "การจัดรูปแบบ" อาจหมายถึงสิ่งที่แตกต่างกัน

สำหรับการเยื้องที่ค่อนข้างธรรมดาลองใช้C-M-q(คำสั่งindent-pp-sexpในโหมดเสียงกระเพื่อม) กับเคอร์เซอร์ที่ไหนสักแห่งใน sexp ระดับบนสุดที่คุณต้องการเยื้องเยื้อง (เช่นdefunsexp)

ไม่นี่ไม่ใช่การเยื้อง "อัตโนมัติ" แต่อาจกลายเป็นนิสัยที่จะใช้ ;-)

สำหรับสิ่งอื่นนอกเหนือจากการเยื้องคุณจะต้องทำด้วยตนเองหรือหมุนคำสั่ง "การจัดรูปแบบ" ของคุณเองหรือค้นหาบางอย่างที่มีอยู่

เห็นแล้วยัง Emacs คู่มือโหนดหลายสายเยื้องและ Elisp Mode-Specific Indentคู่มือโหนด


3
ขอบคุณฉันมีความสุขมากกับการเยาะเย้ย elisp ฉันกำลังมองหาบางสิ่งบางอย่างที่รู้ว่าเมื่อใดที่จะทำลายเส้น :-) และใช่ฉันเข้าใจว่าเป็นอัตนัย :-(
Malabarba

M-q( fill-paragraph) บางครั้งอาจมีประโยชน์สำหรับการแบ่งบรรทัดในโหมด Emacs-Lisp ขึ้นอยู่กับบริบท แต่คุณอาจมองสำหรับการจัดตำแหน่งเช่นกัน ...
ดึง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.