J'utilise spacemacs
mais je suppose que ce sont les connaissances emacs qui sont requises ici.
J'ai un fichier JSON avec une seule longue ligne, disons ce JSON de json.org/example:
{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"}]}}}
J'aimerais qu'emacs réindente cela, ce qui signifie pour moi de ne pas changer le caractère le plus à gauche de la ligne au niveau d'indentation approprié, mais de casser la ligne en plusieurs lignes.
Si j'utilise spacemacs/indent-region-or-buffer
( SPC j =
) alors le texte n'est pas changé du tout.
Comment pourrais-je demander à emacs de briser cette longue file d'attente et de se réindenter pour obtenir quelque chose comme ceci:
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
Je ne suis pas intéressé par une réponse spécifique à JSON, par exemple je crois qu'intelliJ le fait pour n'importe quelle langue qu'il supporte (java, json ...). Je pense que c'est réalisable pour n'importe quel langage emacs a un mode majeur pour, ou disons les plus populaires.
EDIT J'ai découvert M-x json-reformat-region
que spacemacs
livré avec et fonctionne, mais oui, j'aimerais ça pour n'importe quelle langue et avec toujours le même raccourci, basé sur le mode majeur ...
EDIT2 Ok donc ma conclusion est qu'il est implémenté pour différentes langues, JSON & lisp au moins, probablement d'autres, et il serait facile pour encore plus (XML / XHTML, go qui a go-fmt et utilise également clang). Cependant, il n'y a pas de nom de fonction générique qui le ferait pour tous les langages. Il y a de la place ici pour l'implémenter en spacemacs
couches pour les différents langages ... Je n'ai cependant pas trouvé d'implémentation X / HTML, ce qui m'étonne un peu.
la source
web-beautiful.el
. C'est le meilleur que j'ai trouvé, mais cela dépend de node.js.Réponses:
Il semble que vous ayez plus besoin de la
fill-region
fonction que de l'indentation.M-x fill-region
.M-x indent-region
.Cependant, cela n'insérera pas de nouvelles lignes aux points exacts comme indiqué dans votre exemple. Cela rendra simplement la ligne ajustée dans les colonnes de remplissage.
la source
{
dans{"menu":
mais vous n'avez un après{
dans{"id":
. Je ne connais pas JSON et donc votre réponse formatée a probablement un modèle qui me manque. Mais si vous pouvez mettre à jour votre question avec un ensemble de règles pour insérer cette nouvelle ligne, alors quelqu'un peut trouver la réponse que vous voulez.gofmt
mais pour n'importe quelle langue) - gofmt.comjson.el
package fournitjson-pretty-print-buffer
. C'est ce qu'il produit pour votre exemple:Semble assez décent pour moi.
la source
json-pretty-print
etjson-pretty-print-buffer
(spécifications similaires àjson-reformat-region
) était fourni". Mais je pensais qu'emacs pourrait avoir une fonction qui fonctionnerait pour toutes les langues (spécifique à chaque langue en mode majeur populaire), ce qui n'est pas le cas.Selon l'astuce ici , vous pouvez utiliser une commande externe pour formater une région dans votre fichier Json:
Vous pouvez facilement l'étendre pour formater l'ensemble du tampon:
Emacs n'a pas d'outil de formatage pour les langages de programmation ( sauf pour Lisp ), seulement des commandes d'indentation.
la source
M-x json-reformat-region
que çaspacemacs
marche avec et ça marche, mais oui, j'aimerais ça pour n'importe quelle langue et avec toujours le même raccourci, basé sur le mode majeur ... Il semble que ce ne soit pas supporté, dommage ...clang-format
.Pour ce scénario spécifique,
json-pretty-print
cela embellira le morceau de json en surbrillance.la source
BTW, pour les principaux modes utilisant SMIE comme moteur d'indentation, il y a une partie de ce dont vous avez besoin pour cela sous la forme d'un
auto-fill-mode
support. Je pensefill-paragraph
oufill-region
ne ferai pas un bon travail, mais si vous mettez votre code sur une seule ligne, allez à la fin de cette ligne etM-: (smie-auto-fill)
cela devrait donner des résultats sensés (probablement pas parfait par une longue période, cependant).la source