다짜고짜 LF와 CR에 대해서 알고싶어서(?!) 이를 검색해본 건 아니고
아래와 같은 에러를 만나서 이에 대해 알아보게되었다.
윈도우 환경에서(중요) eslint, prettier를 설정하던 중 코드의 마침부분마다 에러가 표시되고 있었다.
Delete `␍`
"endOfLine": "auto",
{
"semi": true,
"singleQuote": false,
"tabWidth": 2,
"trailingComma": "es5",
"arrowParens": "avoid",
"bracketSameLine": false,
"bracketSpacing": true,
// "endOfLine": "lf", // 삭제
"endOfLine": "auto", // 추가
"printWidth": 120,
"proseWrap": "preserve"
}
LF와 CR이란 용어는 타자기
에서 부터 의미가 시작된다.
타자를 입력할 때마다 종이가 오른쪽에서 왼쪽으로 움직이는데
한 줄을 다 입력해서 오른쪽 끝에 다다르면 다음줄 + 맨 처음으로 이동해야한다.
이때 2가지의 동작이 이뤄진다.
Carriage
란 종이를 고정해주는 롤처럼 생긴 장치다.Carriage Return
은 레버를 당겨서 종이를 맨 왼쪽으로 이동시키기는 것을 뜻한다.Line Feed
는 한줄만큼 종이를 위로 올려서 세로 줄넘김하는 것을 말한다.\n
Carriage Return : 커서를 맨앞으로 이동 (가로)
\r
Line Feed : 커서는 그대로인 상태에서 다음줄로 이동 (세로)
\r\n
Carriage Return Line Feed : 커서 맨앞 이동 + 다음줄 이동
코드 작성할 때 키보드 엔터
키를 누를때마다 개행문자라는 보이지 않는 문자가 삽입된다.
그런데 운영체제마다 기본으로 채택하고 있는 line ending 개행문자(줄바꿈) 처리방식이 다르다.
두가지를 조합한 CRLF \r\n
채택
윈도우에서 LF 개행으로 된 파일을 읽을 때 깨짐 현상 발생
줄바꿈 충돌로 글자가 붙여서 보임
글자끝에 특수문자 ^M 이 출력됨
\n
채택
- 이스케이프 시퀀스란?
프린트할 수 없지만 개념상 있는 문자 (예: 개행\n
, 탭\t
)- 자바스크립트에서 keyCode가 13이면 엔터를 의미하는데 이 아스키코드에서 나온 것이다.
1963~1968년까지 ISO(국제표준화기구)에서는 개행문자로 CR+LF를 채택했다. 밑 사진의 텔레타이프라는 전신타자기에서 주로 사용됐다.
그러다가 1964년 등장한 멀틱스 운영체제에서부터 개행문자를 LF만으로 채택하기 시작했다. 이는 컴퓨터가 막 등장하던 시기여서 메모리 비용이 비쌌기 때문에 바이트가 작은 LF만은 채택한 것이다.
Unix와 리눅스도 멀틱스의 관례를 이어나가게 됐다.
윈도우는 1981년 등장한 DOS 운영체제의 CR+LF 방식의 관례를 따르게 된 것이다.
Git으로 개발자들과 협업하는데 윈도우와 맥을 혼용해서 코드를 올리고 있었다면,
컴퓨터에서는 CRLF와 LF의 각 바이트 값이 다르기 떄문에 다르게 인식한다.
그래서 형상관리 툴에서는 개행방식이 다르면 diff로 인식되어 서로 다른 코드라고 보게 된다.
따라서 git commit할 때 실제 변경하지 않은 파일도 개행방식이 다른 것 때문에 변경된 것으로(CRLF에서 LF로 변환 또는 반대) 잘못 인식하게 된다.
git add .
시 밑과 같은 warning을 만나게 된다.warning: LF will be replaced by CRLF in 파일경로
The file will have its original line endings in your working directory
이는 커밋 내역, 코드 이력관리에 좋지 않으므로 설정이 필요하다.
협업 시 개발자 간 사용중인 OS가 다를 경우 Git에서 예기치 않은 문제가 생길 수 있다.
git config --global core.autocrlf true
git config --global core.autocrlf input