Estoy usando, spacemacs
pero presumiblemente es el conocimiento de emacs que se requiere aquí.
Tengo un archivo JSON con una sola línea larga, digamos este JSON de json.org/example:
{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"}]}}}
Me gustaría que emacs reindenté esto, lo que significa que no cambiaré el carácter más a la izquierda de la línea al nivel de sangría adecuado, sino que la dividiré en varias líneas.
Si uso spacemacs/indent-region-or-buffer
( SPC j =
), el texto no cambia en absoluto.
¿Cómo podría pedirle a emacs que rompa realmente esta larga línea y reindent para obtener algo como esto:
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
No estoy interesado en una respuesta específica de JSON, por ejemplo, creo que intelliJ hace eso para cualquier idioma que admita (java, json ...). Creo que es posible para cualquier idioma en el que emacs tenga un modo principal, o digamos los más populares.
EDITAR Descubrí M-x json-reformat-region
que spacemacs
viene con y funciona, pero sí, me gustaría eso para cualquier idioma y con siempre el mismo acceso directo, basado en el modo principal ...
EDIT2 Ok, entonces mi conclusión es que está implementado para varios idiomas, JSON y lisp al menos, presumiblemente otros, y sería fácil para aún más (XML / XHTML, vaya que tiene go-fmt y también usa clang). Sin embargo, no hay un nombre de función genérico que lo haga para todos los idiomas. Aquí hay espacio para implementarlo en spacemacs
capas para los distintos idiomas ... Sin embargo, no encontré una implementación X / HTML, lo que me sorprende un poco.
fuente
web-beautiful.el
. Este es el mejor que he encontrado, pero depende de node.js.Respuestas:
Parece que necesita la
fill-region
función más que la sangría.M-x fill-region
.M-x indent-region
.Sin embargo, eso no insertará nuevas líneas en los puntos exactos como se muestra en su ejemplo. Simplemente hará que la línea encaje en las columnas de relleno.
fuente
{
de{"menu":
Pero usted tiene una después{
de{"id":
. No conozco JSON, por lo que su respuesta formateada probablemente tenga un patrón que me falta. Pero si puede actualizar su pregunta con un conjunto de reglas para insertar esa nueva línea, entonces alguien puede encontrar la respuesta que desea.gofmt
para cualquier idioma) - gofmt.comjson.el
El paquete proporcionajson-pretty-print-buffer
. Esto es lo que produce para su ejemplo:Me parece bastante decente.
fuente
json-pretty-print
yjson-pretty-print-buffer
(especificaciones similares ajson-reformat-region
) se incluyeron". Pero pensé que emacs podría tener una función que funcionaría para todos los idiomas (específicos para cada lenguaje de modo principal popular), que, como resulta, no lo hace.De acuerdo con el consejo aquí , puede usar un comando externo para formatear una región en su archivo Json:
Puede extenderlo fácilmente para formatear todo el búfer:
Emacs no tiene una herramienta de formateo para lenguajes de programación ( excepto Lisp ), solo comandos de sangría.
fuente
M-x json-reformat-region
quespacemacs
viene con y funciona, pero sí, me gustaría eso para cualquier idioma y siempre con el mismo acceso directo, basado en el modo principal ... Parece que esto no es compatible, muy mal ...clang-format
.Para este escenario específico,
json-pretty-print
se embellecerá la masa resaltada de json.fuente
Por cierto, para los modos principales que usan SMIE como su motor de sangría, hay algo de lo que necesita para eso en forma de
auto-fill-mode
soporte. Creofill-paragraph
ofill-region
no haré un buen trabajo, pero si pones tu código en una sola línea, ve al final de esa línea y hazloM-: (smie-auto-fill)
, debería dar buenos resultados (probablemente no sea perfecto por un largo tramo, aunque).fuente