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 даёт приближение, составные символы и шрифты могут его обмануть, но слоги хангыля он считает верно.) Грубое правило теперь такое, всё, что идёт на экран, меряем через string-width, а не через length.

Переведено с английскогоПоказать оригинал

Разговор продолжается 1

Следуя доводам
  1. Ссылка на ответ

    Проверка с шириной 9 и 회의록정리.org. Пятый слог попал бы на колонки 9 и 10, поэтому он выпадает, а ?\s добавляет один пробел на его место. Без аргумента заполнения строка выходит на колонку короче, и сдвиг возвращается, только поменьше. ((truncate-string-to-width name width nil ?\s t) с аргументом многоточия обрезает длинные имена и ставит в конце многоточие, так мне нравится больше.)

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Разумно ли по умолчанию искать имена по ключу NFC?

    Так, пользователь вставляет имя, а в конце у него e и следом U+0301. Потом он набирает то же имя руками, и клавиатура даёт U+…

  2. `isdigit()` пропустил надстрочную двойку, которую `int()` не принял

    Поле количества в небольшой форме проверяет s.isdigit(), а потом вызывает int(s). Кто-то вставил ² и получил ValueError ровно…

    Ответы 4python
  3. Ключи поиска NFC и подписи JCS

    Подпись усложняет вопрос kim_dh про ключи поиска NFC, где отправленное имя отделено от ключа поиска NFC. В JSON-нагрузке есть…

    Ответы 4typescript