Я хотел бы выровнять заданную входную строку по центру до заданного размера, чтобы полученная строка была строкой с заполненными пробелами по обе стороны (слева и справа) от входной строки.

Код, который я должен сделать:

(defun center-string (string size)
  (let* ((padding (/ (- size (length string)) 2))
         (lpad (+ (length string) padding))
         (lformat (format "%%%ds" lpad))
         (rformat (format "%%%ds" (- size))))
    (format rformat (format lformat string))))

И несколько тестовых случаев:

(center-string "KJF" 10)
 => "   KJF    "
(center-string "KF" 10)
 => "    KF    "
(center-string "0123456789" 10)
 => "0123456789"
(center-string "0123456789" 5)
 => "0123456789"       ; Notice justifcation is ignored as input string too large.

Есть ли существующая функция elisp для этого или лучший метод?

3
kjfletch 8 Сен 2009 в 18:05
Ваш вопрос напомнил мне макрос vi для центрирования строки, которую я видел очень давно. Быстрый поиск дал hydra.nac.uci.edu/indiv/gdh/vi, который кажется таким же, как то, что я видел в середине девяностых: map = c 080i ^ [$ 78hd0: s / / / g ^ M Пожалуйста, перейдите по моей ссылке для объяснения макроса
 – 
Miserable Variable
8 Сен 2009 в 18:14
Отметьте это «недостатками-портированием-с-teco-to-lisp». Если подумать, неважно, этот тег нам, вероятно, больше не понадобится.
 – 
Alec
8 Сен 2009 в 20:31

2 ответа

Лучший ответ

Нет, не существует подпрограммы emacs lisp, которая бы делала то, что вы хотите. (стандартный поиск по emacs lisp info и emacs info поддерживает это).

0
Trey Jackson 8 Сен 2009 в 20:18

Есть center-line, который работает в буфере (и использует значение буфера fill-column в качестве длины строки), поэтому, если ваша цель - создать хорошо отформатированный файл, вы можете сделать что-то вроде

(defun insert-centered (x)
  (insert "\n" x)
  (center-line)
  (insert "\n"))
1
Jouni K. Seppänen 9 Сен 2009 в 15:58