Я использую, 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 имеет основной режим или, скажем, самые популярные.
РЕДАКТИРОВАТЬ Я обнаружил, M-x json-reformat-region
что spacemacs
поставляется с и работает, но да, я хотел бы это для любого языка и с всегда одним и тем же ярлыком, основанным на основном режиме ...
EDIT2 Хорошо, поэтому я пришел к выводу, что он реализован для разных языков, по крайней мере, JSON и lisp, предположительно для других, и это будет легко сделать еще больше (XML / XHTML, go с go-fmt, а также с использованием clang). Однако нет общего имени функции, которое бы делало это для всех языков. Здесь есть место для его реализации в spacemacs
слоях для разных языков ... Однако я не нашел реализации X / HTML, что меня немного удивляет.
источник
web-beautiful.el
. Это лучшее, что я нашел, но это зависит от node.js.Ответы:
Похоже, вам нужна
fill-region
функция больше, чем отступ.M-x fill-region
.M-x indent-region
.Это, однако, не вставит новые строки в точных точках, как показано в вашем примере. Он просто поместит линию в столбцы заливки.
источник
{
in,{"menu":
но у вас есть одна после{
in{"id":
. Я не знаю JSON, и поэтому в вашем отформатированном ответе, вероятно, есть шаблон, который мне не хватает. Но если вы можете обновить свой вопрос с помощью набора правил для вставки этой новой строки, тогда кто-то может придумать ответ, который вы хотите.gofmt
но для любого языка) - gofmt.comjson.el
Пакет обеспечиваетjson-pretty-print-buffer
. Вот что он производит для вашего примера:Кажется довольно приличным для меня.
источник
json-pretty-print
иjson-pretty-print-buffer
(аналогичные спецификации, какjson-reformat-region
) был в комплекте». Но я думал, что в emacs может быть функция, которая будет работать для всех языков (специфичных для каждого популярного языка основного режима), чего, как оказалось, нет.Согласно кончику здесь , вы можете использовать внешнюю команду для форматирования области в файле Json:
Вы можете легко расширить его для форматирования всего буфера:
В Emacs нет инструмента форматирования для языков программирования ( кроме Lisp ), только команды отступа.
источник
M-x json-reformat-region
чтоspacemacs
поставляется с и работает, но да, я хотел бы, чтобы это было для любого языка и с всегда одним и тем же ярлыком, основанным на основном режиме ... Кажется, что это не поддерживается, слишком плохо ...clang-format
.Для этого конкретного сценария
json-pretty-print
будет предварительно выделен выделенный кусок JSON.источник
Кстати, для основных режимов, использующих SMIE в качестве механизма отступа, есть некоторая часть того, что вам нужно для этого в виде
auto-fill-mode
поддержки. Я думаю,fill-paragraph
илиfill-region
не сделаю хорошую работу, но если вы поместите свой код в одну строку, то перейдите в конец этой строки и сделайтеM-: (smie-auto-fill)
это, чтобы получить нормальные результаты (вероятно, не идеальные при длительном отрезке, хотя).источник