[Quick Fix] WSL Powerline9k Theme 깨짐/이상하게 보이는 오류 해결법 :: Overflowing rPrompt on WSL
WSL에서 Powerline9k나 Powerline10k 테마로 이쁘게 꾸며서 사용하려고 했다. 하지만 다음과 같이 창이 넘쳐흐르는 에러가 발생했고 그냥 나두기에는 너무 거슬렸다.
이 오류 말고도 아이콘 잘림 또는 깨짐, 오버플로우, 등이 있을 수 있다. 이 오류들은 전부 Double-Width Glyph
때문에 발생하는 문제들이다.
원인 - Double-Width Glyph
Double-Width Glyph
: Monospace 폰트와 달리 두 개의 공간을 차지하는 문자
Ex) , ,... (아마 폰트에서 지원되지 않아서 안보일 수도 있다. 사진으로 바로 아래에 올렸으니 어떤 문자인지 확인해보자.)
문제를 일으키는 2칸 문자들의 예
Mac(iterm2)이나 다른 OS의 터미널 에뮬레이터에서는 잘 동작하는데 왜 Window의 터미널에서만 모양이 이상하게 깨지는 걸까?
그것은 대부분의 Window 터미널 에뮬레이터가 monospace
폰트만 지원하기 때문이다. monospace
는 글자 크기가 한 칸이라는 뜻이다. monospace
가 아닌 Double-Width Glyph
는 보통 지원되지 않기 때문에 그 문자가 명령창에 포함되어 있으면 문제가 발생하게 된다.
대부분의 윈도우용 터미널 에뮬레이터들은 그려야 할 글자의 길이를 monospace
라고 가정한다. 글자가 1
의 공간을 차지한다고 가정하는 것이다. 그렇게 계산하고 출력하는 터미널 에뮬레이터에게 Double-Width Glyph
가 포함된 문자를 출력해보라고 하면 아래처럼 튀어나오거나 아이콘이 반으로 잘리거나 하는 현상이 발생한다.
만약에 모두 1칸짜리 monospace
문자를 때 출력했을 문자열의 길이를 n
이라고 가정해보자.
윈도우의 터미널 에뮬레이터는 Double-Width Glyph
가 포함된 문자열도 당연히 n
칸이라고 가정하고 UI를 그렸을 것이다. 하지만 2칸을 차지하는 문자가 7개가 있어서 실제로는 n + 7
만큼이나 그려져서 7칸이나 초과해버려서 저렇게 명령창의 아랫줄까지 문자가 튀어나오는 오버플로우 현상이 발생했다.
또 다른 경우, 2칸을 차지하는 문자를 강제로 한 칸 안에 들어가게 그려서 아이콘이 반으로 잘릴 수도 있다.
해결법
여러 가지 해결법이 존재한다. 가장 마음에 드는 해결법을 사용하면 된다.
1. Double-Width Glyph
를 지원하는 터미널 에뮬레이터로 바꾼다
(다른 에뮬레이터를 쓰기 싫다면 바로 해결법 2.로 이동해라)
저 문제들의 원인은 에뮬레이터 프로그램들이 Double-Width
인 문자를 이상하게 렌더링해서 발생한 문제다. 애초에 그 문자들을 지원해주는 에뮬레이터를 쓰면 걱정할 필요도 없는 문제이다. 내가 여러 터미널들로 실험해봤는데 Windeow의 터미널 에뮬레이터들은 대부분 non-monospace font들을 지원하지 않았다.
하지만 지원하는 프로그램도 하나 찾을 수 있었다.
잘 작동하는 터미널 에뮬레이터
- Fluent Terminal: https://github.com/felixse/FluentTerminal
felixse/FluentTerminal
A Terminal Emulator based on UWP and web technologies. - felixse/FluentTerminal
github.com
Fluent Terminal은 잘 작동했다 ㅠㅠㅠ. 겨우 찾았다. GitHub Readme를 참고해서 설치하고 Fluent Terminal 설정창에 들어가서 기본 터미널을 WSL로 설정한 후 거기서 폰트(예를 들어서, nerd font 또는 powerline font)까지 잘 설정해주면 정상적으로 작동한다.
참고로 Fluent Terminal은 Chocolatey를 사용해서 설치하는 것을 추천한다. 제일 간편하고 깔끔하다. GitHub Readme에 상세하게 적혀있니 참고해라!
매뉴얼대로 해도 계속 설치가 실패하면 "설정 > 업데이트 및 보안 > 개발자용"에서 "개발자 모드"를 활성화하고 재시도해라. 이렇게 하면 해결될 수도 있다.
2칸 문자들이 깨지는 터미널 에뮬레이터들
다음과 같은 터미널은 이상하게 렌더링 된다. 이러한 것들은 zsh안의 환경을 바꿔줘야 한다. 아래 2.에서 상세하게 알려주겠다.
* Hyper 터미널 에뮬레이터의 경우 컴퓨터에 따라서 잘 작동되는 경우도 있었다. 알 수가 없다. 한번 시도를 해보라.
Hyper의 GitHub Issue를 찾아보니깐 Double-Width 문자에 대한 패치를 한적이 있었다.
* Terminus의 경우는 Double-Width Character를 포함한 유니코드를 지원한다고 적혀져 있다. 그런데 저렇게 오류가 났다. Window10 Build 18309 이상부터 ConPTY API를 추천한다고 한다. 그래서 Window 최신 버전으로 업데이트한 다른 컴퓨터에서 Terminus를 깔고 Shell 설정에 들어가서 ConPTY를 사용해봤다. 잘작동했었다!!
Window10을 최신 버전으로 업데이트하고 ConPTY API를 활성화하면 된다. 아래의 캡처 이미지를 참고해라.
2. 오른쪽에 출력되는 줄(rprompt)에 여백을 둔다
zsh는 5.0.5 release 이후부터ZLE_RPROMPT_INDENT
라는 환경 변수의 값만큼 오른쪽에 여백을 둡니다.
이 변수를 건드리지 않으면 기본값으로 항상 1이 설정됩니다.
위에서 2칸을 차지하는 문자가 7개 있어서 7칸이 추가로 튀어나왔다고 했다. ( 좀 더 정확히 말하자면, ZLE_RPROMPT_INDENT
의 기본값이 1이어서 6칸이 튀어나온 상태이다. ) 그러면 우측에 여백을 7칸 삽입을 해놓으면 7칸이 추가로 튀어나와서 내 여백의 자리에 그려지게 되고 결과적으로 내 창과 정확하게 맞아떨어지게 된다. 사람마다 설정해줘야 할 ZLE_RPROMPT_INDENT
의 값은 다르다. 나는 2칸짜리 문자가 7개가 있어서 7로 설정할 때 창에 일치했다.
ZLE_RPROMPT_INDENT=7
하지만 사용하다 보면 명령어와 상황에 따라서 Double-Width Glyph
가 7개가 아니라 더 쓰일 수도 있다. 그런 상황들까지 생각해서 여백을 정확하게 넣지 말고 충분하게 넣어줘야 한다. 조금 어색해 보일 수도 있지만 모든 상황에서 창이 안 깨지도록 여백을 14개 정도 넣어주자.
ZLE_RPROMPT_INDENT=14
이렇게 변경한 변수는 일시적으로만 저장된다. 만약 zsh를 종료하고 다시 실행하면 ZLE_RPROMPT_INDENT
값은 다시 기본값인 1로 되돌아온다. 이것을 영구적으로 적용하려면 .zshrc
마지막 줄에 입력해야 한다.
그러면 에뮬레이터를 껐다 켜도 항상 우측 여백이 14칸 적용되어서 모양이 깨지지 않고 잘 출력되는 것을 확인할 수 있다.
이 방법은 완벽한 방법이 아니다. ZLE_RPROMPT_INDENT
로 오버플로우 할 공간을 미리 확보해서 그쪽으로 글자의 오버플로우 하게 만들어서 자연스럽게 보이게 하는 편법이다. 여백을 너무 크게 사용하면 우측의 글자들을 위한 충분한 공간이 마련되지 못해서 잘릴 수 있으므로 주의하자.
아이콘이 반쪽으로 잘리는 경우 이 방법으론 해결이 불가능하다. 그 다른 방법으로 해결해야 한다.
3. Double-Width Glyph
를 쓰지 않는 테마를 사용한다
마지막 해결법은 문제의 원흉인 Double-Width Glyph
를 사용하지 않는 것이다.
2칸을 차지하는 아이콘들을 1칸짜리 아이콘으로 powerline config파일에서 다 수정하는 극한의 노가다를 해서 고치는 방법 또한 하나의 방법이다.
또는 monospace
폰트만 쓰는 테마를 찾아 써도 해결된다.
예를 들어서, Pure 테마가 있다. 여백을 없애도 아무런 문제가 없다!
댓글
이 글 공유하기
다른 글
-
[WSL1/WSL2] 홈 디렉터리 위치 :: WSL 홈으로 Windows 파일 옮기기
[WSL1/WSL2] 홈 디렉터리 위치 :: WSL 홈으로 Windows 파일 옮기기
2020.05.16 -
[리눅스] apt, apt-get의 사용법 비교
[리눅스] apt, apt-get의 사용법 비교
2020.05.01 -
[리눅스] scp 기본 사용법
[리눅스] scp 기본 사용법
2020.04.15 -
[리눅스] 간단한 리눅스 명령어들 정리
[리눅스] 간단한 리눅스 명령어들 정리
2020.03.08