Skip to content

Embedded JSON Editing ko

edgar edited this page Feb 23, 2026 · 1 revision

내장 JSON 편집

JSON 파일에는 이스케이프된 JSON 문자열이 값으로 포함되는 경우가 많습니다 — 설정 블롭, 직렬화된 페이로드, 문자열로 저장된 API 응답 등. jvim은 이러한 중첩된 JSON 구조를 전체 편집기 기능과 함께 자연스럽게 편집할 수 있게 해줍니다.

내장 편집 시작

  1. JSON 문자열 값이 있는 줄에 커서를 위치
  2. Normal 모드에서 ej 입력
  3. 파싱되고 포맷팅된 JSON이 표시된 새 편집기 패널이 열림

파싱 조건

ej 명령은 다음 조건에서만 활성화됩니다:

  • 커서 줄에 JSON 문자열 값이 포함됨 (따옴표로 감싼 문자열 탐지)
  • 문자열 값을 json.loads()로 파싱했을 때 dict 또는 list가 생성됨
  • 따옴표 안의 단순 값(문자열, 숫자, 불리언)은 내장 편집 대상이 아님

문자열이 유효한 JSON으로 파싱되지 않거나 컨테이너 타입이 아닌 것으로 파싱되면 ej는 동작하지 않습니다.

패널 관리

ej가 트리거되면:

  • 메인 에디터가 읽기 전용이 됨 (EJ 패널이 열려 있는 동안 실수로 편집하는 것을 방지)
  • 파싱되고 포맷팅된 JSON (indent=4)이 표시된 사이드 패널이 열림
  • 패널 제목에 표시: Edit Embedded JSON (level N)
  • 메인 에디터의 스크롤 위치가 보존되며 패널이 닫힐 때 복원

중첩 레벨 (스택)

내장 JSON 안의 내장 JSON도 편집할 수 있어 편집 레벨의 스택이 생성됩니다:

메인 문서
  └─ EJ 레벨 1 (내장 JSON 문자열)
       └─ EJ 레벨 2 (내장 JSON 안의 내장 JSON)
            └─ EJ 레벨 3 ...

각 레벨은 다음을 저장하는 내부 스택에서 추적됩니다:

  • 부모 문서에서의 소스 행과 열 범위
  • 부모 문서 내용 (복원용)
  • 원본 내용 (변경 감지용)

저장 및 종료 명령

명령 동작
:w 부모 문서에 저장하고 EJ 패널에서 편집 계속. 부모는 압축된 결과로 업데이트됨.
:wq 부모 문서에 저장하고 현재 EJ 레벨을 닫음 (스택 팝). 더 많은 레벨이 있으면 이전 레벨로 복귀.
:q 저장하지 않은 변경사항이 없으면 닫기. 변경사항이 있으면 경고 표시.
:q! 변경사항을 버리고 현재 EJ 레벨을 무조건 닫기.

저장 흐름

저장 시 (:w 또는 :wq):

  1. EJ 패널 내용이 json.loads()로 파싱됨
  2. 유효하지 않은 JSON이면 오류 표시 후 저장 중단
  3. 파싱된 JSON이 json.dumps()로 압축됨 (compact, ensure_ascii=False)
  4. 압축된 문자열이 재직렬화(이중 인코딩)되어 유효한 JSON 문자열 값이 됨
  5. 부모 문서가 원래 소스 위치에서 업데이트됨

변경 감지

  • 현재 내용이 원본과 다르면 패널 제목에 [+] 표시가 나타남
  • 변경 감지는 현재 에디터 내용을 EJ 패널이 열릴 때 찍은 스냅샷과 비교
  • 표시는 키 입력마다 업데이트

재직렬화 (이중 인코딩)

내장 JSON을 부모에 저장할 때 값은 이중 인코딩을 거칩니다:

  1. 첫 번째 인코딩: 편집된 JSON이 압축 문자열로 직렬화 (예: {"host": "localhost", "port": 8080})
  2. 두 번째 인코딩: 압축 문자열이 json.dumps()로 감싸져 유효한 JSON 문자열 값이 됨 (예: "{\"host\": \"localhost\", \"port\": 8080}")

이렇게 하면 부모 문서가 올바르게 이스케이프된 문자열 값을 가진 유효한 JSON으로 유지됩니다.

예시 워크플로우

다음과 같은 JSON이 있을 때:

{
    "config": "{\"host\": \"localhost\", \"port\": 8080}",
    "data": "{\"users\": [{\"name\": \"Alice\"}]}"
}
  1. config 줄로 커서 이동 → ej 입력
  2. EJ 패널이 열리며 표시:
    {
        "host": "localhost",
        "port": 8080
    }
  3. 포트를 9090으로 편집
  4. :wq 입력하여 저장 및 복귀
  5. 부모 문서가 다음과 같이 표시:
    {
        "config": "{\"host\": \"localhost\", \"port\": 9090}",
        "data": "{\"users\": [{\"name\": \"Alice\"}]}"
    }

중첩 예시

2단계에서 내장 JSON 자체에 JSON이 담긴 문자열이 있다면:

{
    "inner": "{\"key\": \"value\"}"
}

ej를 다시 입력하면 레벨 2 EJ 패널이 열리고, 내부 JSON을 편집한 후 스택을 통해 저장할 수 있습니다.


English |

Clone this wiki locally