Есть ли функция, соединяющая строку с разделительной строкой?
Есть ли функция в Emacs Lisp, которая выполняет обратную сторону split-string
, т.е. объединяет элементы списка в строку, ограниченную данным разделителем? Другими словами, существует ли функция, предоставляющая список, например. ("foo" "bar" "baz")
и разделитель, например. ", "
, возвращает этот список как строку, ограниченную этим разделителем, например. "foo, bar, baz"
.
Общий Lisp, похоже, имеет такую функцию, но функция с тем же именем в Emacs Lisp, format
, является совершенно другой функцией.
Ответы
Ответ 1
Я думаю, что вы ищете mapconcat:
mapconcat
применяет функцию к каждому элементу последовательности: результаты, которые должны быть строками, объединены. Между каждой парой результатов строки mapconcat
вставляет разделитель строк. Обычно разделитель содержит пробел или запятую или другую подходящую пунктуацию.
Ответ 2
Если вы сильно используете манипуляции с строками в своем Elisp, я рекомендую вам установить библиотеку s.el
, которая имеет обширный и последовательный API для строк. Для вашей задачи у него есть функция s-join
:
(s-join "+" '("abc" "def" "ghi")) ;; => "abc+def+ghi"
(s-join "\n" '("abc" "def" "ghi")) ;; => "abc\ndef\nghi"
Ответ 3
Emacs 25 имеет string-join
:
(string-join '("one" "two" "three") ", ") ; ==> "one, two, three"
Ответ 4
В зависимости от того, что вы делаете, может быть улучшена функция, например, если вы создаете аргументы командной строки, используйте combine-and-quote-strings
, который выполняет вашу работу.
(combine-and-quote-strings '("foo" "bar" "baz") ", ")
"foo, bar, baz"