วิธีการจัดรูปแบบรหัสสวย (แทรกขึ้นบรรทัดใหม่เยื้อง ฯลฯ โดยอัตโนมัติ?


24

ฉันใช้spacemacsแต่น่าจะเป็นความรู้ emacs ที่ต้องการที่นี่

ฉันมีไฟล์ JSON ที่มีบรรทัดยาวหนึ่งบรรทัดสมมุติว่า JSON นี้จาก json.org/example:

{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"}]}}}

ฉันอยากให้ emacs กลับมารวมตัวกันอีกครั้งซึ่งหมายความว่าฉันจะไม่เปลี่ยนตัวละครซ้ายสุดไปสู่ระดับการเยื้องที่เหมาะสม แต่แยกบรรทัดออกเป็นหลายบรรทัด

ถ้าฉันใช้spacemacs/indent-region-or-buffer( SPC j =) แล้วข้อความจะไม่เปลี่ยนแปลงเลย

ฉันจะขอให้ emacs แบ่งสายยาว ๆ นี้ได้อย่างไรและ reindent เพื่อให้ได้สิ่งนี้:

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

ฉันไม่สนใจคำตอบเฉพาะของ JSON เช่นฉันเชื่อว่า intelliJ ทำเช่นนั้นสำหรับภาษาใดก็ได้ที่รองรับ (java, json ... ) ฉันคิดว่ามันเป็นไปได้สำหรับทุกภาษา emacs มีโหมดสำคัญสำหรับหรือสมมติว่าคนที่นิยมมากที่สุด

แก้ไขฉันค้นพบM-x json-reformat-regionว่าspacemacsมาพร้อมกับและใช้งานได้ แต่ใช่ฉันต้องการสิ่งนั้นสำหรับภาษาใด ๆ และใช้ทางลัดเดียวกันเสมอตามโหมดหลัก ...

EDIT2 เอาล่ะข้อสรุปของฉันคือมันถูกนำไปใช้กับภาษาต่าง ๆ อย่างน้อย JSON & lisp อย่างน้อยน่าจะเป็นคนอื่นและมันจะง่ายกว่านี้อีก (XML / XHTML ไปซึ่งมี go-fmt และใช้เสียงดังกราว) อย่างไรก็ตามไม่มีชื่อฟังก์ชั่นทั่วไปที่จะใช้กับทุกภาษา มีพื้นที่สำหรับการนำไปใช้งานในspacemacsเลเยอร์สำหรับภาษาต่างๆ ... ฉันไม่พบการใช้งาน X / HTML ซึ่งทำให้ฉันประหลาดใจเล็กน้อย


3
เพื่อใช้ HTML / JS / web-beautiful.elCSS: นี่คือสิ่งที่ดีที่สุดที่ฉันเคยพบ แต่มันขึ้นอยู่กับ node.js
พี่เลี้ยง

คำตอบ:


10

ดูเหมือนว่าคุณต้องการfill-regionฟังก์ชั่นมากกว่าการเยื้อง

  • M-x fill-regionเลือกบรรทัดที่และทำ
  • M-x indent-regionเลือกเหมือนกันตอนนี้แยกในหลายเส้นและทำ

แม้ว่าจะไม่แทรกบรรทัดใหม่ที่จุดตรงตามที่แสดงในตัวอย่างของคุณ มันจะทำให้เส้นพอดีในคอลัมน์เติม


1
นั่นคือสิ่งที่ บางทีสิ่งที่ฉันต้องการก็ไม่สามารถทำได้ บางทีฉันอาจจะรออีกสักครู่ในกรณีที่ใครบางคนมีวิธีแก้ปัญหาที่ยอดเยี่ยมสำหรับการเยื้องเชิงรุกอย่างชาญฉลาด ... หากไม่มีอะไรเกิดขึ้นฉันจะทำเครื่องหมายคำตอบนี้เป็นคำตอบ
Emmanuel Touzery

@EmmanuelTouzery สิ่งที่คุณต้องการสามารถทำได้ด้วย elisp เพียงเล็กน้อยตราบใดที่กฎสำหรับการแทรกบรรทัดใหม่นั้นสอดคล้องกัน ในตัวอย่างของผลการจัดรูปแบบผมเห็นว่าคุณไม่ได้มีการขึ้นบรรทัดใหม่หลังจากที่{ใน{"menu":แต่คุณจะมีหนึ่งหลังจากที่ใน{ {"id":ฉันไม่รู้จัก JSON ดังนั้นคำตอบที่จัดรูปแบบของคุณอาจมีรูปแบบที่ฉันขาดหายไป แต่ถ้าคุณสามารถอัปเดตคำถามของคุณด้วยชุดของกฎสำหรับการแทรกบรรทัดใหม่นั้นมีใครบางคนสามารถหาคำตอบที่คุณต้องการ
Kaushal Modi

ฉันคิดว่าจะมีอยู่สำหรับภาษาใด ๆ รวมถึงกฎเฉพาะภาษา ตัวอย่างเช่น {บนบรรทัดแรกสำหรับ java ในบรรทัดถัดไปสำหรับ C # สมมติว่าและอื่น ๆ
Emmanuel Touzery

(ในคำอื่น ๆ บางอย่างที่เหมือนgofmtแต่สำหรับภาษาใด ๆ ) - gofmt.com
Emmanuel Touzery

19

json.eljson-pretty-print-bufferแพคเกจให้ นี่คือสิ่งที่ผลิตสำหรับตัวอย่างของคุณ:

{
  "menu": {
    "popup": {
      "menuitem": [
        {
          "onclick": "CreateNewDoc()",
          "value": "New"
        },
        {
          "onclick": "OpenDoc()",
          "value": "Open"
        },
        {
          "onclick": "CloseDoc()",
          "value": "Close"
        }
      ]
    },
    "value": "File",
    "id": "file"
  }
}

ดูเหมือนว่าสวยดีสำหรับฉัน


2
ใช่ในความเป็นจริงฉันเห็นในgithub.com/gongo/json-reformatว่า "จาก emacs 24.4 json-pretty-printและjson-pretty-print-buffer(มีข้อกำหนดที่คล้ายกันjson-reformat-region) รวมอยู่ด้วย" แต่ฉันคิดว่า emacs อาจมีฟังก์ชั่นที่ใช้งานได้กับทุกภาษา (โดยเฉพาะสำหรับภาษาของโหมดหลักที่เป็นที่นิยม) ซึ่งมันจะเปิดใช้งานไม่ได้
Emmanuel Touzery

นี่คือคำตอบที่ถูกต้อง
Joe Heyming

6

ตามคำแนะนำที่นี่คุณสามารถใช้คำสั่งภายนอกเพื่อจัดรูปแบบภูมิภาคในไฟล์ Json ของคุณ:

(defun json-format ()
  (interactive)
  (save-excursion
    (shell-command-on-region (region-beginning)
                             (region-end)
                             "python -m json.tool"
                             (buffer-name)
                             t)))

คุณสามารถขยายมันเพื่อจัดรูปแบบบัฟเฟอร์ทั้งหมดได้อย่างง่ายดาย:

(defun json-format ()
  (interactive)
  (save-excursion
    (shell-command-on-region (point-min)
                             (point-max)
                             "python -m json.tool"
                             (buffer-name) t))) 

Emacs ไม่มีเครื่องมือการจัดรูปแบบสำหรับการเขียนโปรแกรมภาษา ( ยกเว้น LISP ) เพียงคำสั่งการเยื้อง


1
ฉันค้นพบM-x json-reformat-regionว่าspacemacsมาพร้อมกับและใช้งานได้ แต่ใช่ฉันต้องการที่สำหรับภาษาใด ๆ และมีทางลัดเดียวกันเสมอตามโหมดหลัก ... ดูเหมือนว่านี่ไม่ได้รับการสนับสนุนเลวร้ายเกินไป ...
Emmanuel Touzery

1
หากต้องการจัดรูปแบบภาษาอย่างถูกต้องคุณต้องใช้โปรแกรมแยกวิเคราะห์ภาษาจริง Emacs มีตัวแยกวิเคราะห์ภาษาในตัวสำหรับบางภาษา แต่มีเพียงตัวแยกวิเคราะห์ Lisp ในตัวเท่านั้นที่ใช้สำหรับการฟอร์แมตโค้ดใหม่ซึ่งเป็นลิงก์ไปยังตัวอย่างข้างต้น ถ้าจัดรูปแบบภายนอกที่มีอยู่มันเป็นเรื่องง่ายที่จะบูรณาการกับ Emacs clang-formatคือ
Tu Do


1

BTW สำหรับโหมดหลักที่ใช้ SMIE เป็นเอ็นจิ้นการเยื้องของมันมีบางส่วนของสิ่งที่คุณต้องการในรูปแบบของการauto-fill-modeสนับสนุน ฉันคิดว่าfill-paragraphหรือfill-regionจะไม่ทำงานได้ดี แต่ถ้าคุณใส่รหัสของคุณลงในบรรทัดเดียวจากนั้นไปที่จุดสิ้นสุดของบรรทัดนั้นและทำM-: (smie-auto-fill)มันควรให้ผลลัพธ์ที่มีสติ

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