코드를 예쁜 형식으로 만드는 방법 (자동 줄 바꿈, 들여 쓰기 등)?


24

나는 사용하고 spacemacs있지만 아마도 여기에 필요한 이맥스 지식입니다.

하나의 긴 줄이있는 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 =) 다음 텍스트가 전혀 변경되지 않습니다.

어떻게 이맥스에서 실제로이 긴 줄을 끊고 다음과 같은 것을 얻기 위해 다시 화를 내라고 요청할 수 있습니까?

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

JSON 특정 답변에 관심이 없습니다. 예를 들어 intelliJ는 지원하는 모든 언어 (java, json ...)에 대해 그렇게한다고 생각합니다. 나는 모든 언어 이멕스가 주요 모드를 가지고 있거나 가장 인기있는 언어를 가지고 있다고 생각할 수 있다고 생각합니다.

편집 내가 발견 하고 작동 M-x json-reformat-region한다는 것을 발견 spacemacs했지만, 주요 모드를 기반으로 모든 언어에 대해 항상 동일한 바로 가기를 사용하고 싶습니다 ...

EDIT2 Ok 그래서 제 결론은 다양한 언어, JSON 및 lisp에 대해 적어도 아마도 다른 언어로 구현되었으며 아직 더 쉬울 것입니다 (XML / XHTML, go-fmt가 있고 clang 사용). 그러나 모든 언어에 적용되는 일반적인 함수 이름은 없습니다. 여기에 spacemacs다양한 언어에 대한 레이어 로 구현할 공간이 있습니다 ...하지만 X / HTML 구현을 찾지 못했습니다.


3
HTML / JS / CSS의 경우 : web-beautiful.el. 이것이 내가 찾은 최고이지만 node.js에 달려 있습니다.
nanny

답변:


10

fill-region들여 쓰기보다 기능이 더 필요한 것 같습니다 .

  • 해당 라인을 선택하고 수행하십시오 M-x fill-region.
  • 동일한 것을 선택하고 이제 여러 줄로 나눈 다음을 수행하십시오 M-x indent-region.

그러나 예제와 같이 정확한 지점에 새 줄을 삽입하지는 않습니다. 선을 채우기 열에 맞추기 만하면됩니다.


1
글쎄, 그건 뭔가입니다. 어쨌든 내가 원했던 것은 달성 할 수 없었습니다. 어쩌면 누군가가 더 똑똑한 들여 쓰기를위한 마법의 솔루션을 가지고있는 경우를 대비하여 조금 더 기다릴 것입니다.
Emmanuel Touzery

@EmmanuelTouzery 줄 바꿈을 삽입하는 규칙이 일관된 한 적은 생략만으로 원하는 것을 얻을 수 있습니다. 포맷 된 결과의 당신의 예에서, 당신이 후 줄 바꿈이없는 볼 {{"menu":있지만 하나씩해야합니까 {에서가 {"id":. JSON을 모르므로 서식이 지정된 답변에 누락 된 패턴이있을 수 있습니다. 그러나 새로운 줄을 삽입하는 규칙 세트로 질문을 업데이트 할 수 있다면 누군가가 원하는 대답을 얻을 수 있습니다.
Kaushal Modi

언어 별 규칙을 포함하여 모든 언어에 존재한다고 생각했습니다. 예를 들어, java의 첫 번째 행에 {, C #의 다음 행에 있다고 가정하십시오.
Emmanuel Touzery

(즉, 다른 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
예에 사실 I 톱에 github.com/gongo/json-reformat "이맥스 24.4,에서 해당 json-pretty-printjson-pretty-print-buffer(와 유사한 사양 json-reformat-region) 번들로했다.". 그러나 emacs는 모든 언어 (각 인기있는 주요 모드 언어에 따라 다름)에서 작동하는 기능을 가질 수 있다고 생각했지만 그렇지 않았습니다.
Emmanuel Touzery

이것이 정답입니다
Joe Heyming

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있습니다.
Tu Do

2

이 특정 시나리오 json-pretty-print에서는 강조 표시된 json 덩어리를 확인합니다.


1

BTW, SMIE를 들여 쓰기 엔진으로 사용하는 주요 모드의 경우 auto-fill-mode지원 형식으로 필요한 부분이 있습니다 . 나는 좋은 일을 생각 fill-paragraph하거나 fill-region하지 않을 것이지만 코드를 한 줄에 넣으면 그 줄의 끝으로 가서 M-: (smie-auto-fill)정상적인 결과를 제공해야합니다 (아마도 긴 스트레칭으로 완벽하지는 않습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.