Używam, spacemacs
ale prawdopodobnie jest to wiedza wymagająca tutaj.
Mam plik JSON z jedną długą linią, powiedzmy ten JSON z json.org/example:
{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"}]}}}
Chciałbym, aby emacs to powtórzył, co dla mnie oznacza, że nie zmieniam znaku po lewej stronie na odpowiedni poziom wcięcia, ale przerywam linię w kilku wierszach.
Jeśli użyję spacemacs/indent-region-or-buffer
( SPC j =
), tekst w ogóle się nie zmieni.
Jak mogłem poprosić emacsa, aby rzeczywiście przełamał tę długą linię i był gotowy na coś takiego:
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
Nie interesuje mnie odpowiedź specyficzna dla JSON, na przykład uważam, że intelliJ robi to dla dowolnego obsługiwanego języka (java, json ...). Sądzę, że jest to osiągalne dla każdego emacsa językowego, który ma tryb główny lub, powiedzmy, najpopularniejsze.
EDYCJA Odkryłem, M-x json-reformat-region
że jest spacemacs
dostarczany z i działa, ale tak, chciałbym to dla każdego języka i zawsze z tym samym skrótem, w oparciu o tryb główny ...
EDIT2 Ok, więc doszedłem do wniosku, że jest on zaimplementowany dla różnych języków, przynajmniej JSON i lisp, prawdopodobnie innych, i byłoby jeszcze łatwiej (XML / XHTML, go, który ma go-fmt, a także używa clang). Jednak nie ma ogólnej nazwy funkcji, która by to zrobiła dla wszystkich języków. Jest tu miejsce na implementację go w spacemacs
warstwach dla różnych języków ... Nie znalazłem jednak implementacji X / HTML, co mnie trochę zaskakuje.
źródło
web-beautiful.el
. To jest najlepsze, jakie znalazłem, ale zależy to od node.js.Odpowiedzi:
Wygląda na to, że potrzebujesz
fill-region
funkcji bardziej niż wcięcia.M-x fill-region
.M-x indent-region
.Nie spowoduje to jednak wstawienia nowych wierszy w dokładnie takich punktach, jak pokazano w przykładzie. Po prostu dopasuje linię do kolumn wypełnienia.
źródło
{
za,{"menu":
ale masz go po{
za{"id":
. Nie znam JSON, więc twoja sformatowana odpowiedź prawdopodobnie ma wzór, którego mi brakuje. Ale jeśli możesz zaktualizować swoje pytanie za pomocą zestawu zasad wstawiania tej nowej linii, wtedy ktoś może znaleźć odpowiedź, którą chcesz.gofmt
niż język) - gofmt.comjson.el
pakiet zapewniajson-pretty-print-buffer
. Oto, co tworzy dla twojego przykładu:Wydaje mi się całkiem przyzwoity.
źródło
json-pretty-print
ijson-pretty-print-buffer
(podobnych specyfikacji jakjson-reformat-region
) zostało dołączone”. Ale myślałem, że emacs może mieć funkcję, która będzie działać dla wszystkich języków (specyficznych dla każdego popularnego języka trybu głównego), czego, jak się okazuje, nie ma.Zgodnie z wskazówką tutaj możesz użyć zewnętrznego polecenia, aby sformatować region w pliku Json:
Możesz go łatwo rozszerzyć, aby sformatować cały bufor:
Emacs nie ma narzędzia do formatowania języków programowania ( z wyjątkiem Lisp ), tylko polecenia wcięcia.
źródło
M-x json-reformat-region
że jestspacemacs
dostarczany z i działa, ale tak, chciałbym to dla każdego języka i zawsze z tym samym skrótem, opartym na trybie głównym ... Wygląda na to, że nie jest to obsługiwane, szkoda ...clang-format
.W tym konkretnym scenariuszu
json-pretty-print
uwidoczni wyróżnioną bryłę jsona.źródło
BTW, w przypadku głównych trybów wykorzystujących SMIE jako silnik wcięcia, jest część tego, czego potrzebujesz w postaci
auto-fill-mode
wsparcia. Myślę,fill-paragraph
czyfill-region
nie zrobi dobrą robotę, ale jeśli umieścić swój kod na jednej linii, a następnie przejść do końca tej linii i zrobićM-: (smie-auto-fill)
to powinna dać rozsądnych wyników (prawdopodobnie nie doskonalić przez długi odcinek, tho).źródło