nnn: LC_COLLATE=ko_KR.UTF-8 문제.

TL;DR

둘 중 하나 택일. (그러나 alias 쪽에 한 표를 던진다.)

  • .zshrcexport LC_COLLATE="C" 추가.
  • alias n3='LC_COLLATE=C nnn'

macOS 고유 프로그램(GUI)이라든가, CLI 용 프로그램을 써도 오픈소스가 아닌, 역시나 Apple 만들어 제공하는 프로그램들이라면, Locale 에 따른 문제가 발생하지는 않는 듯 하다. 또, 다른 글에서도 언급했지만, 오픈소스라고 해서 다 이런 문제가 생긴다고 볼 수도 없다. 아마도 어떤 라이브러리를 사용하느냐에 따라 조금은 이상한 현상이 생길 수도 있는 모양이다.
이 내용은, 지금까지 찾아낸 바에 따르면, nnn 에서만 발생하며, macOS/Linux 모두에서 조금씩 문제가 있다.

그럼, 어떤 문제가 있나? 먼저 macOS 쪽부터.

macOS 와 nnn

macOS 에서 한국어를 선택하면, 기본 로캘은 다음과 같다.

$ locale
LANG="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_CTYPE="ko_KR.UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_ALL=


그런데, 이 상태로는, 특정 프로그램에서 정렬에 문제가 생긴다. 그게 nnn 이었다.
이걸 해결하려면, LC_COLLATE 만 ‘C’ 로 바꿔준다. 이거 저거 실험해봤는데, C 만 의미가 있었다.
즉, 이런 상태가 돼야 정렬에 문제가 없다.

$ locale
LANG="ko_KR.UTF-8"
LC_COLLATE="C"
LC_CTYPE="ko_KR.UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_ALL=

이를 위해서, .zshrc 에 저 항목을 export 로 넣어주거나, 아니면 nnn 을 스크립트, 또는 alias 화하여 사용하는 방법도 있겠다.

# .zshrc
export LC_COLLATE="C"

# alias
alias n3='LC_COLLATE=C nnn'

어느 쪽이 더 ‘현명한’ 선택인지는 모르겠다. (그냥 똑같지 않을까?)
locale 이 정렬에 영향을 미치는 프로그램은 nnn 이 유일하다. 이런 저런 프로그램들(mc, ranger, vifm, gnu-ls, exa, lf, Double Commander(GUI))을 기본 로캘(ko_KR.utf8) 하에서 시험해봤지만, 아예 정렬 기능에 뭔가 문제가 있어보이는 vifm 을 빼고는 모두 다 정상 작동했다.
저 프로그램들 모두 LC_COLLATE=”C” 상태에서도 잘 작동했으니, 설정을 바꿔줘도 문제가 되지는 않으리라 생각한다.

또 하나, 정렬 말고도 이상한 점이 있다.
macOS 기본 터미널과 iTerm 모두, 화면을 좀 키우고(205×58 정도 크기), 한글이 포함된 디렉토리를 이동하다보면, 이상한 공백이 들어가 있기도 하고, 글자가 겹쳐지는 현상이 보이기도 한다.

macOS 기본 터미널. 화면 첫 행에 디렉토리 표시에 공백이 들어가 있다.

화면 맨 위, 디렉토리 표시 행에, ~/Shared_Resilio/정렬연습-macOS /연습용2 라고 돼 있는데, 공백이 없어야 맞다. 터미널 창을 작게 설정해놓으면 이런 현상이 없는데, 어느 정도 커지면 이런게 보인다. 물론, 정렬은 엉망이다.

이런 식으로 글자가 겹쳐지는 현상도 있다.

역시 맨 윗줄, 연습용2/연습용2 로 글자가 중복돼 있다. 아마도, 디렉토리 이동시 화면을 다시 그리는(Refresh?) 작업이 제대로 이뤄지지 않는 듯 한데..

저 상황까지 회피할 방법은 찾지 못했다. 게다가 저 현상은 늘 나타나질 않기도 해서, 그냥 그러려니 하는 수밖에 없을 듯. (왜 맥은 이 모양일까??)

그런데, 이런 현상, macOS 용 CLI 에선 비일비재하다. mc 는 한글이 있으면 세로 줄이 제대로 정렬되지 않는 현상이 있고, ranger 도 비슷하다. vifm 도 비슷한 상황이니, 그나마 nnn 이 가장 쓸만한 편이라고 할 수 있겠다.


이걸 어떻게 알아냈을까?

macOS 설정 – 일반 – 언어 및 지역 – 응용 프로그램 에서, 프로그램별 언어 설정을 해줄 수 있다. 여기서 터미널을 English 로 정해주고,

터미널을 실행한 뒤 locale 을 확인하면 다음과 같다.

$ locale
LANG=""
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

흠..?? 좀 요상한 설정으로 바뀌었는데, 아무튼 저기서 정렬에 관련될 듯한 내용은 COLLATE 뿐이라, 그것만 바꿔봤더니 nnn 에서 정렬이 제대로 작동했다. 이 내용은 nnn 에 보고를 하다가 알게 됐다. 만약 LC_CTYPE 마저 C 가 돼버리면, 영문자외엔 표시가 되지 않는다.

또 한가지 재미있는 증상(?).
Double Commander 는, 그냥 일반 실행(Spotlight 나 직접 실행 등등)을 하면 정렬에 문제가 없지만, 터미널에서 open . -a 'double commander' 로 돌리면 LC_COLLATE=ko_KR.UTF-8 을 적용받아 nnn 처럼 제멋대로인 상황을 보여준다.

nnn 제작진 중 한 명인 N-R-K 는, 도대체 왜 이런 현상이 발생하는지 갈피를 잡지 못하겠다고 했는데.. 그 친구들이 모르는데 내가 어찌 알까.


마지막 한가지. nfc/nfd

애플의 큰 문제인 nfd. 왜 굳이 지들만 이걸 쓰기로 했는지는 알 수가 없다. 영어권에선 별 문제가 안되는 듯 하지만, 특히나 한국어/한글은 이 문제가 사람을 짜증나게 할 때가 많다.

다음을 보자.

정렬에 문제가 없는 듯 보이지만..??
엄청나.txt 가 맨 위에 정렬이 돼 있다.

이유는??
나머지는 다 nfc 고, 엄청나.txt 만 nfd 라 그렇다. 이상한게, 내가 가진 거의 모든 CLI 도구는 대부분 위와 같은 결과를 보여줬다. 즉, 엄청나.txt 만 위에 있고, 나머지는 제대로 정렬되었다. gnu-ls, exa, ranger, Double Commander 모두 동일했다. 단지, M.C 만 nfc/nfd 관계없이 제대로 정렬된 모습을 보여줬다. macOS 전용 GUI 도구들에선 nfc/nfd 간 정렬 문제는 없었다. nfc 와 nfd 가 섞여있어도 아무 이상이 없었다.

이 문제를 잘 모르겠는데.. macOS 전용 프로그램들은 파일을 생성(저장)했을 때 nfd 형식을 취한다. 헌데, 범용 프로그램(?) 중에선 nfc 인 것들도 있다. VS Codium 이 이런데.. 이게 어디 설정하는게 있는건지??

** nfc/nfd 확인은 어떻게?

변환은 convmv 로 하지만, 확인은 unicode-nfd2c 로 할 수 있다.

Linux 와 nnn

Linux 에선 macOS 와 동일한 현상은 나타나지 않는다. 하지만 여기엔 뭔가 좀 더 복잡한 사정이 깔려있었다. 이 글에 덧붙이기엔 내용이 좀 복잡해서 따로 글을 올렸다.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.