Как я получаю доступ к содержанию текущего региона в Lisp Emacs?

Если вы хотите «весить» результаты по определенным критериям или иметь какое-либо «вычисленное значение» в «сортировке», тогда вам понадобится метод .aggregate() . Это позволяет использовать «прогнозируемые» значения в операции $sort , для которой может использоваться только настоящее поле в документе:

db.messages.aggregate([
    { "$match": { "messages": userId } },
    { "$project": {
        "recipients": 1,
        "unread": 1,
        "content": 1,
        "readYet": {
            "$setIsSubset": [ [userId], "$unread" ] }
        }
    }},
    { "$sort": { "readYet": -1 } },
    { "$limit": 20 }
])

Здесь $setIsSubset позволяет сопоставить «непрочитанный» массив с преобразованным массивом [userId], чтобы увидеть, имеются ли какие-либо совпадения. Результат будет либо true, где существует userId, либо false, где это не так.

Затем это можно передать в $sort, который заказывает результаты с предпочтениями совпадений (сортировка сортировки является true сверху), и, наконец, $limit просто возвращает результаты до указанной суммы.

Итак, чтобы использовать заданный термин для «сортировки», значение должно быть «проецировано» в документ, чтобы его можно было отсортировать. Структура агрегации - это то, как вы это делаете.

Также обратите внимание, что $elemMatch не требуется только для того, чтобы соответствовать одному значению в массиве, и вам нужно только указать значение напрямую. Это цель, где «несколько» условий должны выполняться на одном элементе массива, что, конечно, здесь не применяется.

43
задан Singletoned 3 March 2009 в 20:13
поделиться

2 ответа

buffer-substring вместе с region-beginning и region-end может сделать это.

58
ответ дан Clint 4 August 2019 в 17:41
поделиться

Как starblue говорит, (buffer-substring (mark) (point)) возвраты содержание региона, если метка установлена. Если Вы не хотите эти свойства строки , можно использовать 'buffer-substring-no-properties вариант.

Однако, если Вы пишете интерактивный команда, существует лучший способ получить конечные точки региона, с помощью формы (interactive "r"). Вот пример от simple.el:

(defun count-lines-region (start end)
  "Print number of lines and characters in the region."
  (interactive "r")
  (message "Region has %d lines, %d characters"
       (count-lines start end) (- end start)))

При вызове от кода Lisp, эти (interactive ...) форма проигнорирована, таким образом, можно использовать эту функцию для подсчета строк в [1 113] любой часть буфера, не только регион, путем передачи соответствующих аргументов: например, (count-lines-region (point-min) (point-max)) для подсчета строк в суженной части буфера. Но при интерактивном вызове, эти (interactive ...) форма оценена, и "r", код предоставляет точку и метку, как два числовых аргумента, самые маленькие сначала.

См. Руководство Lisp Emacs, разделы 21.2.1 Используя Интерактивный и 21.2.2 Кодовых символа для интерактивного .

70
ответ дан Razzi Abuissa 4 August 2019 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: