'E492'에 해당되는 글 1건

  1. 2021.03.24 [Vim] Linux 상에서의 Not an editor command: ^M 문제

현재 한 컴퓨터에서 Ubuntu와 Windows를 같이 사용중이다. 

 

지금까지 3번정도 Ubuntu 사용을 해보려고 시도했었지만 적은 사용량과 한글 문서등의 호환성 이슈 때문에 사용을 포기했었으나 지금은 그래도 꾸준히 사용을 하고 있다. 

 

이전 글에도 올렸지만 주력 text editor로 vim을 사용한지가 꽤 되었는데 아직도 Ubuntu에서는 최신 vimrc 파일을 설치해두지 않았더라. 

 

그래서 그대로 _vimrc 파일을 긁어다가 Ubuntu에 .vimrc로 넣어주었는데 이게 무슨 일! vim을 로딩할때 넘쳐나는 에러의 향연을 볼 수 있다. 

 

한 두개야 vim 버전 문제겠지하고 넘겼을 수 있었겠지만 수십개가 주르륵 나오는 것으로 바로 알아차렸다. 

 

아, 이거 100% 인코딩이나 Line ending 문제다.

 

아니나다를까 Unix-based 시스템과 DOS-based 시스템의 Line ending이 다르단다. 

 

분명 어딘가에서 읽었을 것 같은데 당시에는 Unix-based 시스템을 쓸 일이 없다고 생각했고 앵간한 상용 프로그램들은 이런 문제를 알아서 해결해주기에 'Line ending이란게 있다더라~' 하고 넘어간듯 하다. 

 

다행히 구글에서 비슷한 케이스를 바로 찾을 수 있었는데 별로 반가운 대접을 받지는 못하는 것 같다. 

(그도 그럴게 issue에 bug report 처럼 올렸으니... )

 

github.com/vim/vim/issues/6156

 

E492: Not an editor command: ^M on Linux subsystem · Issue #6156 · vim/vim

I installed Vim on Ubuntu via Linux Subsystem on Windows 10, so I can use it for work. I changed the home directory to the Windows user directory and symlinked the Ubuntu home to it. I use VimPlug ...

github.com

Solution

vim wiki에 가보니 친절한 설명이 되어있다. 

 

vim.fandom.com/wiki/File_format

 

File format

Vim recognizes three file formats (unix, dos, mac) that determine what line ending characters (line terminators) are removed from each line when a file is read, or are added to each line when a file is written. A file format problem can display ^M characte

vim.fandom.com

결국 모든 문제의 근원은 엔터를 칠 때 CR(Carriage Return)과 LF(Line Feed)(New Line이라고 하기도 함)를 자동으로 입력해주는 DOS에서 가져온 텍스트 파일을 LF만 사용해서 새 줄을 표기하는 Unix 시스템이 읽고 "CR이 뭐임?" 하는 상황 때문에 문제가 발생하는 것이다. 

 

참고로 CR은 0x0D 이며 이는 Ctrl-M과 대응된다. 

 

 

CR과 LF의 유래에 대해서는 아래 글에 자세히 나와있다.

더보기

일반적인 text 파일의 경우 해결 방법은 크게 1)CR을 지워주거나 2)CR을 무시하게 하거나 둘 중 하나이지만, vim 시작후 가장 먼저 읽어들이기 시작하는 vimrc 파일의 경우는 1)CR을 지운 버전을 사용하는 방법밖에 없는 것 같다. 

(CR을 무시하게 하는 방법이 있다면 꼭 알려주세요)

 

1. dos2unix 유틸리티 설치 후 CR을 지워주기.

sudo apt-get install dos2unix
dos2unix ~/.vimrc

 

2. vim의 substitute 기능을 사용해 CR을 지워주기.

^M 을 vim 커멘드에 입력하기 위해서는 Ctrl-v를 누른후 Ctrl-m을 눌러야 한다. 

:%s/^M//g

 

 

 

 

Posted by Knowblesse