Як правильно ввести формат коду (автоматично вставити нові рядки, відступ тощо)?


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 насправді перервати цю довгу лінію і нагадати, щоб отримати щось подібне:

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

Мене не цікавить відповідь JSON, наприклад, я вважаю, що intelliJ робить це для будь-якої мови, яку вона підтримує (java, json ...). Я думаю, що це досяжно для будь-якої мови emacs має головний режим для, або скажімо, найбільш популярних.

EDIT Я виявив, M-x json-reformat-regionщо spacemacsпрацює і працює, але так, я хотів би це для будь-якої мови та з завжди однаковим ярликом, заснованим на головному режимі ...

EDIT2 Добре, тому мій висновок полягає в тому, що він реалізований для різних мов, принаймні JSON & lisp, імовірно, інших, і це було б легко ще більше (XML / XHTML, go, який має go-fmt, а також використовуючи clang). Однак немає загальної назви функції, яка б робила це для всіх мов. Тут є простір для його реалізації в spacemacsшарах для різних мов ... Я не знайшов реалізації X / HTML, що мене трохи дивує.


3
Для HTML / JS / CSS: web-beautiful.el. Це найкраще, що я знайшов, але це залежить від node.js.
няня

Відповіді:


10

Схоже, вам потрібна fill-regionфункція більше, ніж відступ.

  • Виберіть цей рядок і зробіть M-x fill-region.
  • Виберіть те саме, тепер розділіть на кілька рядків, і зробіть M-x indent-region.

Це, однак, не буде вставляти нові рядки в точних точках, як показано у вашому прикладі. Це просто зробить рядок поміщеним у стовпці заливки.


1
ну це щось. Можливо, те, чого я хотів, все одно не було досягнутим. Можливо, я зачекаю трохи більше, якщо хтось матиме магічне рішення для розумнішого агресивного відступу ... Якщо нічого іншого не вийде, я позначу це як відповідь.
Еммануель Тузері

@EmmanuelTouzery Те, що ви хочете, можна досягти за допомогою невеликого пробігу до тих пір, поки правила вставки нового рядка будуть послідовними. У вашому прикладі форматований результат, я бачу , що у вас немає нового рядка після {в {"menu":але ви повинні один за {в {"id":. Я не знаю JSON, і тому ваша форматована відповідь, ймовірно, має шаблон, який я пропускаю. Але якщо ви можете оновити своє запитання набором правил для вставки цього нового рядка, то хтось може придумати потрібну відповідь.
Каушал Моді

Я думав, що це існувало б для будь-якої мови, включаючи правила, що стосуються мови. Наприклад, {на першому рядку для Java, у наступному рядку для C #, скажімо, тощо.
Еммануель Тузері

(іншими словами, щось на зразок, gofmtале для будь-якої мови) - gofmt.com
Emmanuel Touzery

19

json.elпакет надає json-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 може мати функцію, яка буде працювати для всіх мов (специфічних для кожної популярної мови основного режиму), чого вона, як виявляється, не має.
Еммануель Тузері

це правильна відповідь
Джо Хеймінг

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працює і працює, але так, я хотів би це зробити для будь-якої мови та з завжди однаковим ярликом, заснованим на основному режимі ... Здається, це не підтримується, занадто погано ...
Еммануель Тузері

1
Для правильного форматування мови потрібен фактичний аналізатор мови. Emacs має вбудовані мовні аналізатори для деяких мов, але останнім часом лише вбудований аналізатор Lisp використовується для переформатування коду як посилання на демонстраційну версію. Якщо існують зовнішні формати, їх легко інтегрувати з Emacs, тобто clang-format.
Ту роблять

2

Для цього специфічний сценарій json-pretty-printбуде доречним виділеним грудкою json.


1

BTW, для основних режимів, що використовують SMIE як двигун відступу, є частина того, що вам потрібно для цього у вигляді auto-fill-modeпідтримки. Я думаю, що fill-paragraphабо fill-regionне вдасться зробити гарну роботу, але якщо ви поставите свій код на один рядок, то перейдіть до кінця цього рядка і зробіть M-: (smie-auto-fill)це, щоб дати чіткі результати (мабуть, не ідеально довгим розтяжкою, тхо).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.