openlang

버퍼 이름에 한글이 들어가면 모드 라인 열이 밀린다

모드 라인에서 버퍼 이름을 고정 폭으로 채워서 뒤에 오는 것들이 줄 맞게 해 뒀는데, 꽤 오랫동안 잘 됐어요(정확히는 제가 우연히 열어 본 버퍼들에서는요).

(defun my/pad-name (name width)
  (concat name (make-string (max 0 (- width (length name))) ?\s)))

그러다 회의록.org를 열었더니 그 오른쪽이 전부 세 칸 밀렸어요. length는 문자 수를 세는데, 한글 음절 세 개는 문자로는 세 개지만 화면에서는 하나가 두 칸씩 차지하거든요. (string-width "회의록")은 6, (length "회의록")은 3이에요. (M-:로 둘 다 쳐 보면 바로 보여요.)

처음부터 칸 단위로 세는 함수를 쓰면 해결돼요.

(defun my/pad-name (name width)
  (truncate-string-to-width name width nil ?\s))

짧은 이름은 채우고 긴 이름은 잘라서 같은 폭으로 맞춰 줘요. (매뉴얼에도 string-width는 근삿값이라고 솔직하게 적혀 있어요. 조합 문자나 글꼴에 따라 틀릴 수 있지만 한글 음절은 제대로 나와요.) 앞으로의 대충의 원칙은, 화면에 나갈 건 length가 아니라 string-width로 잰다는 거예요.

영어에서 번역원문 보기

이어지는 대화 1

서로의 근거를 따라
  1. 고유 링크

    폭 9에 회의록정리.org로 해 봤어요. 다섯 번째 음절은 9열과 10열에 걸치니까 빠지고, ?\s가 빈칸 하나를 채워 줘요. 패딩 인자를 빼면 그 줄이 한 칸 모자라게 나와서 밀림이 작게 다시 생겨요. (생략 인자까지 준 (truncate-string-to-width name width nil ?\s t)로 하면 긴 이름이 잘리면서 끝에 말줄임표가 붙는데, 저는 그쪽이 더 마음에 들었어요.)

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 이름 조회에 NFC 키를 기본으로 써도 될까요?

    자, 사용자가 이름을 붙여 넣었는데 끝이 e 다음에 U+0301이에요. 나중에 같은 이름을 직접 치면 키보드가 U+00E9를 넣어 줘요. 그 사람한테는 같은 이름이고 캐노니컬 등가이기도 한데, 문자열로는 여전히 달라요. 제…

  2. `isdigit()`는 통과시키고 `int()`는 거부한 위첨자 2

    작은 폼의 수량 입력란이 s.isdigit()로 검사한 다음 int(s)를 불러요. 누군가 ²를 붙여 넣었더니, 바로 그 검사가 지켜 주기로 한 줄에서 ValueError가 났어요. 둘은 서로 다른 규칙을 써요. isdigi…

    답글 4python
  3. NFC 조회 키와 JCS 서명

    kim_dh가 앞서 올린 NFC 조회 키 질문은 제출된 이름과 NFC 조회 키를 나눠서 봤는데, 서명이 끼면 더 복잡해져요. JSON 페이로드의 이름이 e 뒤에 U+0301을 붙인 형태이고, 그 문자열이 JCS 기반 서명에…