LINUX.ORG.RU

elisp: создать новый список из последних элементов существующего

 ,


0

2

Привет.

Есть файлики(буферы) с фиксированным заголовком и различной длиной тела. Пример:

This
is
a
Header

This is a body.

Количество строк в заголовке всегда одинаково, а в теле различное. Вопрос: как мне выдернуть только тело? Делал так - работает не так, как я ожидаю.

(last (split-string f "\n") 3)

Пробовал еще через лупы по списку, но кажется, что я не в том направлении двигаюсь.

★★★★
Ответ на: комментарий от Kostafey

Дело в том, что я пишу пакет и не хотел бы тащить зависимости, а ограничиться встроенными функциями.

Difrex ★★★★
() автор топика

В смысле, как вернуть буфер без первых четырех строк?

Вы напрасно пытаетесь работать с ним, как со строкой, когда он буфер.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

В смысле, как вернуть буфер без первых четырех строк?

Мне не нужно возвращать буфер, мне нужно вернуть строку.

Функция выглядит так:

(defun get-message-body (msg)
    "Get MSG body text."
    (s-join "\n" (last (split-string msg "\n") 7)))

Потом уже эта строка принтится во временный буфер

Difrex ★★★★
() автор топика
Последнее исправление: Difrex (всего исправлений: 1)
Ответ на: комментарий от Difrex

Мне не нужно возвращать буфер, мне нужно вернуть строку.

Не важно, на входе-то все равно буфер.

(defconst test-header-height 5)

(defun test-return-body ()
  (save-excursion
    (goto-char (point-min))
    (forward-line test-header-height)
    (buffer-substring-no-properties (point) (point-max))))

Или не buffer-substring-no-properties, выясните, что́ вам на самом деле нужно. Возможно, вам еще и narrowing снять надо.

s-join

А это еще зачем? Вы же только совершенно справедливо говорили, что не хотите тянуть всякие левые функции.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Difrex

Зависимости в свих пакетах на сторонние - это нормальная практика. Тем более такие хорошие как dash.

Можно так, например, писать:

(setq text "This
is
a
Header

This is a body.")

(substring text (+ (string-match-p "\n\n" text) 2))
Kostafey
()
Последнее исправление: Kostafey (всего исправлений: 1)
Ответ на: комментарий от Difrex

get-message-body

И да, если не секрет, что́ пишете-то?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Так не работает. Вернее работает не так.

s-join

А это еще зачем?

Думал, что оно уже включено в Емакс начиная с 25.3

И да, если не секрет, что́ пишете-то?

Клиент для IDEC. Вот от сюда эта функция вызывается https://gitea.difrex.ru/Difrex/idec.el/src/store/idec.el#L342

Difrex ★★★★
() автор топика
Ответ на: комментарий от Difrex

«\n\n» - это не 2 пустые строки подряд, это конец строки после «Header\n» и конец строки в пустой строке (ожидается что без пробелов) «\n».
Так что в приведенном примере будет возвращено выражение «This is a body».
Можно более сложной регуляркой просто 3 строки отсекать (если мы не ожидаем ни одной пустой строки между шапкой и телом).

Всегда пожалуйста.

Kostafey
()
Последнее исправление: Kostafey (всего исправлений: 1)
Ответ на: комментарий от Difrex
(string-join "\n" (nthcdr 8 (split-string msg "\n")))

Вариант без внешних зависимостей. Но мне вариант Zmicier нравится больше.

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от Difrex

у большинства пользователей emacs (если они хоть немного осилили пакетный менеджер) dash уже есть

anonymous
()
Ответ на: комментарий от anonymous

Это точно. Есть еще нюанс, при использовании внешних библиотек охват аудитории часто может даже увеличиться за счет того, что эти библиотеки очень часто поддерживают версии emacs, в которых аналогичная функциональность еще не была реализована.

feofan ★★★★★
()
Ответ на: комментарий от Difrex

Так не работает. Вернее работает не так.

Вэри спэсифик. А у меня работает (на твоём примере).

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от Difrex

Дело в том, что я пишу пакет и не хотел бы тащить зависимости, а ограничиться встроенными функциями.

Тысячи пакетов имеют зависимости (что значит тащить?) а твой какой-то особенный?

loz ★★★★★
()
Ответ на: комментарий от loz

Я просто изначально хотел, чтобы это все работало на чистом емаксе, но подумав понял, что в этом мало смысла. Тем более тот же dash оказалось, что стоит практически у всех.

Difrex ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.