programing

VIM에서 저장 시 JSON을 자동 포맷하는 방법

lastmoon 2023. 3. 23. 23:02
반응형

VIM에서 저장 시 JSON을 자동 포맷하는 방법

말하면 ★★★★★★★★★★★★★★★★★★★★★.go나를 망쳤다.와 함께go저는 제 편집자(vim)가 강요하는 엄격한 포맷 기준에 익숙해져 팀원들과 전 세계 모든 사람들에게 거의 받아들여지고 있습니다.

저장 시 JSON 파일을 포맷하고 싶었습니다.

질문:.vim에 저장할 때 json 파일을 자동 포맷/인텐트/lint하는 방법.

1개의 명령어로 다음과 같이 시험합니다.

execute '%!python -m json.tool' | w  

그런 다음 자체 키 바인딩을 추가하여 키 입력을 단순화할 수 있습니다.물론 이것이 작동하려면 Python이 컴퓨터에 설치되어 있어야 합니다.

을 가지고 을 하고 , json을 을 추천합니다.jq:

https://stedolan.github.io/jq/

다음 '실행'을 할 수 있습니다.:%!jq .현재 버퍼를 jq 출력으로 대체합니다.

%!python -m json.tool

또는

%!python -c "import json, sys, collections; print json.dumps(json.load(sys.stdin, object_pairs_hook=collections.OrderedDict), ensure_ascii=False, indent=4)"

vimrc에 추가할 수 있습니다.

com! FormatJSON %!python -m json.tool

할 수 있는 보다 더 많이:FormatJson filesjson 파일 형식

mMontu와 Jose B 덕분에 저는 이렇게 되었습니다.

경고 버퍼를 덮어씁니다.따라서 구문 오류가 이미 있는 json 파일을 열면 파일 전체가 손실되거나 손실될 수 있습니다.

도 이 을 이을 때 같이 쓰세요.~/.vimrc

" Ali: to indent json files on save
autocmd FileType json autocmd BufWritePre <buffer> %!python -m json.tool

물론 기계에 비단뱀이 있어야 합니다.

편집: json에 오류가 있는 경우 다음 버퍼는 덮어쓰지 않습니다.정답은 맞지만, 저는 Vim 스크립트나 쉘에 대해 잘 모르기 때문에 운이 좋다면 시험 삼아 제시합니다.껍질에 따라서도 다를 수 있습니다.경고합니다.

" Ali: to indent json files on save
autocmd FileType json autocmd BufWritePre <buffer> %!python -m json.tool 2>/dev/null || echo <buffer>

vim.org에서 JSON 플러그인을 검색한 결과 다음과 같이 반환되었습니다.

jdaddy.vim : JSON 조작과 예쁜 인쇄

설명은 다음과 같습니다.

gqaj커서 아래에 JSON이 구성하는 "예쁜 인쇄"(글씨/입력/키 정렬/그 외의 경우 정리)

이 되어 는, 「 」를할 수 있습니다.autocmd BufWritePre포맷할 수 있습니다.

제 해결책은 이렇습니다.「저장중」의 질문 부분에 대해서는 정확하게 설명되고 있지 않습니다만, 보존전에 이 조작을 실행하면 에러가 출력됩니다.그 후, 보존전에 수정할 수 있습니다.

하나의 도구에 합니다.-외부 도구에 의존합니다.jq쉘 JSON 툴의 UNIX JSON은 JSON을 사용합니다., 이미 인스톨 있을 이 있습니다( 및 만, how in idk.

기본적으로는,

ggVG!jq '.'

그러면 JSON 문서 전체가 강조 표시된 후 실행됩니다.jq그러면 올바르게 해석하고 다시 포맷(인텐트 수정 등)한 후 출력을 Vim 편집기에 다시 뱉을 수 있습니다.

문서의 일부만 구문 분석하려면 를 눌러 해당 부분을 수동으로 강조 표시할 수 있습니다.v또는V그리고 나서 달려라

!jq '.'

여기서의 이점은 문서의 하위 섹션을 다음과 같이 수정할 수 있다는 것입니다.

Vim 자동 포맷

https://github.com/Chiel92/vim-autoformat

이 Vim 플러그인은 여러 자동 포맷 및 들여쓰기 방식을 지원하며 파일 유형별로 커스텀 포맷터를 사용하여 확장합니다.

https://github.com/Chiel92/vim-autoformat#default-formatprograms

주의:

필요한 것은, 다음과 같습니다.nodejs그리고.js-beautify로서 인스톨 된.vim-autoformat는 이러한 도구를 기본 외부 도구로 사용합니다.

npm install -g js-beautify

또 다른 해결책은 coc-format-json을 사용하는 것입니다.

정리도 좀 하고 (그 중 일부는 vim과 무관하지만) 직접 neovim에 대본을 쓰기도 했어요!

솔루션 1: neovim

1-1: 스크립트를 직접 작성

Neovim은 python 파일 또는 패키지를 배치하여 Python3 플러그인을 정의할 수 있도록 합니다.rplugin/python3/에 있어서runtimepath폴더)

나 같은 경우에는

- init.vim
- rplugin/python3/[your_py_file_set].py
- rplugin/python3/fmt_file.py

fmt_file.py다음과 같이

# rplugin/python3/fmt_file.py

import pynvim
import json


@pynvim.plugin
class Plugin:
    __slots__ = ('vim',)

    def __init__(self, vim):
        self.vim = vim

    @pynvim.command('FormatJson', nargs='*', range='')
    def format_json(self, args, rg):
        """
        USAGE::

            :FormatJson
        """
        try:
            buf = self.vim.current.buffer
            json_content: str = '\n'.join(buf[:])
            dict_content: dict = json.loads(json_content)
            new_content: str = json.dumps(dict_content, indent=4, sort_keys=True)
            buf[:] = new_content.split('\n')
        except Exception as e:
            self.vim.current.line = str(e)

실행 후::UpdateRemotePlugins내부에서Nvim플러그인을 사용할 수 있도록 하기 위해 필요한 Vimscript를 생성합니다.(neovim을 재시작하는 것이 좋습니다)

그런 다음 포맷할 JSON 파일을 열고 다음과 같이 입력합니다.:FormatJson명령어로 지정합니다.다 했어요.


잊지 말고 vim에게 너의 비단뱀이 어디 있는지 알려줘

" init.vim

let g:python3_host_prog = '...\python.exe''

그리고.pip install pynvim

1-2: 도구를 사용합니다.화이

어디에tool.py에 있습니다.Lib/json/tool.py

:%!python -m json.tool

솔루션 2: 명령줄

python을 이미 설치하고 명령줄을 열 수 있는 경우:

python -m json.tool "test.json" >> "output.json"

솔루션 3: python

나는 그런 것들을 위한 간단한 대본을 쓴다.

"""
USAGE::

    python fmt_file.py fmt-json "C:\test\test.json"
    python fmt_file.py fmt-json "C:\test\test.json"  --out_path="abc.json"
    python fmt_file.py fmt-json "test.json"  --out_path="abc.json"
"""

import click  # pip install click
from click.types import File
import json
from pathlib import Path


@click.group('json')
def gj():
    ...


@gj.command('fmt-json')
@click.argument('file_obj', type=click.File('r', encoding='utf-8'))
@click.option('--out_path', default=None, type=Path, help='output path')
def format_json(file_obj: File, out_path: Path):
    new_content = ''
    with file_obj as f:
        buf_list = [_ for _ in f]
        if buf_list:
            json_content: str = '\n'.join(buf_list)
            dict_content: dict = json.loads(json_content)
            new_content: str = json.dumps(dict_content, indent=4, sort_keys=True)

    if new_content:
        with open(out_path if out_path else Path('./temp.temp_temp.json'),
                  'w', encoding='utf-8') as f:
            f.write(new_content)


def main():
    for register_group in (gj,):
        register_group()


if __name__ == '__main__':
    main()

vim-json-line-format' 플러그인을 검색할 수 있습니다.Normal mode, 커서를 json 행으로 이동하여<leader>pj인쇄하여 정형화된 json을 표시하려면 , 를 사용합니다.<leader>wj텍스트가 포맷된 json으로 변경될 수 있습니다.잘못된 json은 포맷할 수 없습니다!

저장 시 ALE을 사용하여 자동 포맷

JSON 형식을 지정하도록 ALE 구성

.vim/vimfiles/after/ftplugin/json.vim에 다음을 추가합니다.

let b:ale_fix_on_save = 1 " Fix files when they are saved.

언급URL : https://stackoverflow.com/questions/26214156/how-to-auto-format-json-on-save-in-vim

반응형