EditorConfig 생성기

.editorconfig

리포지토리에 있는 생태계를 고르세요. 하나를 고를 때마다 그 생태계에 필요한 규칙이 담긴 섹션이 추가됩니다.

다음

리포지토리 루트에 둔 .editorconfig는 최신 IDE 모두에게 이 프로젝트가 파일을 어떻게 포맷하는지 알려 주며, 탭이냐 스페이스냐 하는 논쟁을 파일 단위로 끝냅니다. 어려운 쪽은 전역 블록이 아니라 언어별 섹션입니다. YAML은 탭으로 들여쓰는 것 자체가 불가능하고, make는 스페이스로 시작하는 레시피 줄을 거부하며, CRLF로 저장한 셸 스크립트는 실행되지 않습니다. 리포지토리에 있는 언어를 고르면 이 생성기가 각 언어에 필요한 섹션을 써 주고, 그 섹션이 왜 있는지 설명하는 메모를 옆에 붙여 줍니다.

.editorconfig 만드는 방법

  1. 1

    리포지토리에 있는 언어를 고르세요

    JavaScript, JSON, HTML과 CSS, YAML, Python, PHP, Go, Rust, Ruby, Java, Markdown, Makefile, 셸 스크립트, Windows 배치 파일. 하나를 체크할 때마다 섹션이 하나씩 추가됩니다.

  2. 2

    모든 파일이 물려받을 규칙을 정하세요

    들여쓰기 스타일과 크기, 줄 끝, 문자 인코딩, 마지막 줄 개행, 줄 끝 공백, 줄 길이 제한. 이 값들은 맨 위 `[*]` 블록에 들어가고, 아래의 각 섹션은 해당 언어가 실제로 필요로 하는 것만 재정의합니다.

  3. 3

    각 섹션이 왜 있는지 확인하세요

    파일 옆의 표가 생성된 모든 섹션을 설명하므로, 커밋하기 전에 팀에 필요 없는 섹션을 덜어낼 수 있습니다.

  4. 4

    리포지토리 루트에 복사하세요

    `.gitignore` 옆에 `.editorconfig`라는 이름으로 저장하세요. 편집기는 다음에 여는 파일부터 이 파일을 인식합니다. 빌드 단계도, 플러그인 설정도 필요 없습니다.

.editorconfig가 하는 일

프로젝트 루트에 둔 .editorconfig라는 파일은 형식 규약을 선언합니다. EditorConfig를 지원하는 편집기(모든 주요 IDE와 대부분의 최신 텍스트 편집기)는 파일을 열 때 그 규칙을 적용합니다. 탐색은 편집 중인 파일에서 디렉터리 트리를 위로 거슬러 올라가다가 root = true라고 적힌 첫 파일에서 멈춥니다.

출력 예시

기본 설정(스페이스, 들여쓰기 크기 4, LF, utf-8)과 미리 체크돼 있는 두 섹션을 쓰면 생성기는 다음을 출력합니다:

root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 120

[*.{md,markdown}]
trim_trailing_whitespace = false

[{Makefile,makefile,GNUmakefile,*.mk}]
indent_style = tab

Python이나 Go, YAML을 체크하면 해당 섹션이 아래에 나타나며, 그 생태계의 포매터가 강제하는 관례를 이미 담고 있습니다.

주요 디렉티브

디렉티브 허용 값 참고
root true 탐색이 여기서 멈추도록 프로젝트 루트에 지정합니다
charset latin1, utf-8, utf-8-bom, utf-16be, utf-16le 보통은 utf-8을 씁니다. 명세는 바이트 순서 표식을 권장하지 않으며, utf-16 두 가지는 프로젝트의 모든 파일에 적용돼 대부분의 빌드 도구가 읽지 못합니다
end_of_line lf, crlf, cr 여러 운영체제를 오가는 작업에는 lf, Windows 전용 리포지토리에만 crlf
indent_style space, tab
indent_size 정수, 또는 tab indent_style = tab일 때도 무시되지 않습니다. tab_width가 이 값을 이어받아 탭이 몇 칸 너비로 보일지를 정합니다
tab_width 정수 기본값이 indent_size와 같아서 따로 쓸 일은 드뭅니다
insert_final_newline true, false 파일을 POSIX 규격에 맞게 유지하고 diff를 깔끔하게 만듭니다
trim_trailing_whitespace true, false 줄 끝 공백이 줄바꿈을 뜻하는 Markdown에서는 꺼 두세요
max_line_length 양의 정수, 또는 unset 핵심 명세에는 없고 속성 위키에 실려 있습니다. 제한을 두지 않으려면 0을 쓰지 말고 줄 자체를 빼세요

스타일 가이드가 아니라 빌드를 깨뜨리는 세 가지 규칙

대부분의 .editorconfig 항목은 취향의 문제입니다. 다음 세 가지는 그렇지 않으며, 언어별 섹션을 둘 가치가 있는 이유가 바로 이것입니다:

  • YAML은 들여쓰기에 탭 문자를 허용하지 않습니다. 린트 경고가 아니라 파싱 오류입니다. 프로젝트를 탭으로 들여쓰면서 GitHub Actions 워크플로나 Docker Compose 파일, Kubernetes 매니페스트를 두고 있다면, YAML 섹션이 스페이스를 다시 강제해야 합니다.
  • make는 모든 레시피 줄 맨 앞에 진짜 탭 문자를 요구합니다. 스페이스를 쓰면 missing separator. Stop.이 출력되면서 빌드가 멈춥니다. [{Makefile,makefile,GNUmakefile,*.mk}]이 여러 철자를 나열하는 이유가 이것입니다. EditorConfig는 파일 이름을 대소문자를 구분해 매칭하는데, 리포지토리에는 Makefile과 makefile이 둘 다 있기 때문입니다.
  • CRLF로 저장한 셸 스크립트는 실행되지 않습니다. 커널이 캐리지 리턴을 인터프리터 경로의 일부로 읽어 /bin/bash^M: bad interpreter: No such file or directory 같은 메시지를 냅니다. Windows 배치 파일에는 정반대의 문제가 있습니다. cmd.exe는 goto와 call :label을 바이트 오프셋으로 찾아가기 때문에, LF만 쓴 .bat 파일은 엉뚱한 줄로 점프하거나 아무 오류 없이 중간에 멈출 수 있습니다.

이 중 둘은 전역 블록이 고쳐 주는 문제가 아니라 오히려 전역 블록이 일으킬 수 있는 문제라서, 이 생성기가 그 상황을 지켜봅니다. 탭을 고르고 YAML 섹션을 넣지 않거나 CRLF를 고르고 셸 섹션을 넣지 않으면, 생성된 파일에 그 파일들이 한 번도 언급되지 않았더라도 결국 그 파일들을 깨뜨립니다. 생성기는 파이프라인이 실패한 뒤에야 알게 두지 않고 출력 위에서 그 사실을 알려 줍니다. utf-16 문자 인코딩도 마찬가지입니다. 프로젝트의 모든 파일에 적용되는데 make와 셸 인터프리터, Python은 그렇게 저장한 소스를 읽지 못합니다.

이 생성기가 써 주는 언어별 관례

언어 또는 파일 섹션 설정 내용과 이유
JavaScript, TypeScript *.{js,jsx,mjs,cjs,ts,tsx} 스페이스 2개, Prettier의 기본값
JSON *.{json,jsonc} 스페이스 2개, npm이 package.json에 쓰는 너비
HTML, CSS, 템플릿 *.{html,htm,css,scss,sass,less,vue,svelte} 스페이스 2개, 들여쓰기 기반 Sass 문법은 이 값이라야 파싱됩니다
YAML *.{yml,yaml} 스페이스 2개, 프로젝트가 탭을 써도 스페이스
Python *.{py,pyi} 스페이스 4개, PEP 8과 Black
PHP *.php 스페이스 4개, PSR-12. WordPress는 탭, Drupal은 2개
Go {*.go,go.mod} 탭, gofmt가 탭으로 들여쓰기 때문
Rust *.rs 스페이스 4개, rustfmt의 기본값
Ruby {*.rb,*.rake,Gemfile,Rakefile} 스페이스 2개, RuboCop의 기본값
Java *.java 스페이스 4개, Oracle의 규약. Google의 Java 스타일은 2개
Markdown *.{md,markdown} 줄 끝 공백 유지, Markdown이 줄바꿈을 적는 방식
Makefile {Makefile,makefile,GNUmakefile,*.mk} 탭, make가 요구하는 값
셸 스크립트 *.{sh,bash,zsh} LF, 프로젝트의 나머지가 무엇을 쓰든
Windows 배치 *.{bat,cmd} CRLF, cmd.exe가 레이블을 바이트 오프셋으로 찾기 때문

그 표에 없는 것을 눈여겨보세요. 줄 길이입니다. PEP 8은 79자, Black은 88자, PSR-12는 권고 수준의 120자, rustfmt는 100자를 말합니다. 그중 어느 값이든 언어 섹션에 써 넣으면 프로젝트 전체에 대해 고른 제한을 조용히 덮어써 버립니다. 그래서 생성기는 max_line_length를 [*] 블록에만 남기고, 그 숫자들은 직접 판단해 적용할 수 있도록 여기에 적어 둡니다.

내 편집기가 지원하나요?

기본 지원: VS Code, JetBrains의 IntelliJ 계열, Visual Studio, Sublime Text, Xcode, Notepad++. Vim과 Emacs, Neovim을 비롯한 몇몇은 작은 플러그인이 필요합니다. 파일 형식이 평범한 INI라서 린터와 포매터도 읽을 수 있고, Prettier와 일부 랭귀지 서버가 이 파일과 보조를 맞추는 것도 그 덕분입니다.

자주 묻는 질문

맨 위에 root = true를 적어 프로젝트 루트에 둡니다. 특정 경로를 재정의하려면 하위 디렉터리에 .editorconfig 파일을 더 둘 수 있습니다. 탐색은 편집 중인 파일에서 트리를 위로 거슬러 올라가다가 처음 만나는 root = true에서 멈춥니다.

입력란을 0으로 두면 생성기가 max_line_length를 파일에서 빼 둡니다. 이 속성에 문서화된 값은 양수, 그리고 상위 파일에서 물려받은 값을 취소하려고 존재하는 명세 전역 키워드 unset입니다. 지금 만드는 것은 최상위 파일이라 취소할 값이 없고, 줄이 없는 것이 곧 같은 뜻입니다. 쓰지 말아야 할 것은 이 도구가 예전에 쓰던 max_line_length = 0입니다. 명세는 지원하지 않는 값을 플러그인이 무시하라고 하므로, 0이라는 제한은 제한이 아니라 조용히 아무 일도 하지 않는 줄일 뿐입니다.

아니요. EditorConfig는 모든 편집기에서 공백과 줄 끝을 다룹니다. 내가 쓰지 않고 동료들만 쓰는 편집기까지 포함해서요. Prettier와 언어별 린터는 따옴표, 세미콜론, 끝 쉼표처럼 더 깊은 스타일 규칙을 맡습니다. 둘은 서로를 보완하며, Prettier는 기본적인 항목을 .editorconfig에서 읽어 옵니다.

YAML이 들여쓰기에 탭 문자를 아예 허용하지 않기 때문입니다. 탭으로 들여쓴 워크플로나 compose 파일은 어떤 도구가 보기도 전에 파싱에 실패합니다. 생성기는 나머지 곳에서는 탭을 그대로 두고 YAML 섹션만 재정의하며, 그렇게 할 때는 파일 위에 그 사실을 알려 줍니다.

리포지토리의 Windows 도구가 실제로 필요로 한다면 end_of_line = crlf로 설정하세요. 대개 더 나은 선택은 여기서는 lf를 쓰고 .gitattributes에 * text=auto를 두는 것입니다. 그러면 git이 커밋할 때 줄 끝을 정규화하고, 체크아웃할 때는 운영체제에 맞는 줄 끝이 유지됩니다.

선택한 값은 파일을 만드는 데 쓰이고, 단계를 옮길 때 페이지 링크에 함께 실려 이동하므로 설정을 공유하거나 즐겨찾기에 저장할 수 있습니다. 페이지가 생성된 뒤에는 저희 서버에 아무것도 저장되지 않습니다.

관련 도구

이 도구는 다른 언어로도 제공됩니다