Интерактивно введите заголовок, под которым нужно разместить запись, используя захват

Используя шаблоны захвата, подобные приведенному ниже, я могу добавлять записи в различные заголовки в файле. Как я могу вручную ввести заголовок во время захвата, вместо того, чтобы настраивать каждый заголовок для ключа в файле.emacs, как я делаю сейчас?

(setq org-capture-templates
      '(
      ("l" "Log" entry
     (file+headline "c:/Org/log.org" "Log")
     "\n\n** %?\n<%<%Y-%m-%d %a %T>>"
     :empty-lines 1))

5 ответов

Решение

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

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

Тогда вместо того, чтобы закончить с C-c C-c выбрать для пополнения с C-c C-w Вам будет предложено выбрать заголовок, в который вы хотите отправить новую запись.


Шаблон захвата, который я использую для этого улова, выглядит следующим образом (адаптировано из настроек захвата Бернта Хансена)

      ("i"
       "Incidents"
       entry
       (file+headline "~/Work/work.org" "Refile")
       "* TODO %^{Ticket} - %^{User}\nSCHEDULED: %^t DEADLINE: %^t\n:PROPERTIES:  
       \n:DATE: %^U\n:END:\n%^{MANAGER}p%^{HOSTNAME}p%^{LOCATION}p%^{TEL}p\n%c"
       :empty-lines 1 :clock-in t :clock-resume t)

(Добавлены разрывы строк, чтобы избежать прокрутки при чтении здесь)

Заголовок настроен следующим образом

* Refile                                                             :refile:
:PROPERTIES:
:CATEGORY: Unsorted
:END:

С этим я в конечном итоге все не заправленные задачи отображаются как

Unsorted:     Deadline:    TODO <Headline>                          :refile::

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

Похоже, что в новых версиях org, по крайней мере, для этого можно использовать пользовательские функции в шаблонах захвата.

Вместо:

entry
(file+headline "~/Work/work.org" "Refile")

Ты можешь использовать:

entry
(file+function "~/Work/work.org" function-finding-location)

Где 'function-find-location' - это пользовательская функция, которую вы написали сами, которая может легко запросить заголовок.

Или вы можете пойти еще дальше и определить пользовательскую функцию, которая будет запрашивать как имя файла, так и заголовок (или что-нибудь еще, что вы можете придумать):

entry
(function function-finding-location)

Я действительно не знаю достаточно elisp, чтобы написать эти функции самостоятельно, но это похоже на то, с чего начать. Было бы хорошо, если бы кто-то мог предложить какой-то код. Соответствующая документация здесь:

http://orgmode.org/manual/Template-elements.html

Я написал функцию, которая будет использоваться с file+function, которая будет запрашивать местоположение при захвате.

Он использует внутреннюю функцию приглашения org-refile, поэтому мы получаем в заголовке дополнения к заголовкам (с максимальным уровнем, переопределяемым на 9). Когда пользователь вводит неизвестный заголовок, он создает его в конце файла.

(defun org-ask-location ()
  (let* ((org-refile-targets '((nil :maxlevel . 9)))
         (hd (condition-case nil
                 (car (org-refile-get-location nil nil t t))
               (error (car org-refile-history)))))
    (goto-char (point-min))
    (outline-next-heading)
    (if (re-search-forward
         (format org-complex-heading-regexp-format (regexp-quote hd))
         nil t)
        (goto-char (point-at-bol))
      (goto-char (point-max))
      (or (bolp) (insert "\n"))
      (insert "* " hd "\n")))
    (end-of-line))

В вашем случае вы используете это так:

(setq org-capture-templates
 '(("l" "Log" entry
    (file+function "c:/Org/log.org" org-ask-location)
    "\n\n** %?\n<%<%Y-%m-%d %a %T>>"
    :empty-lines 1))

Во время записи заметки, после окончания записи нажмите C-u C-c C-w перефразировать под желаемым новым заголовком.

вам также нужно установить эту переменную

 (setq org-refile-allow-creating-parent-nodes (quote confirm))

Вы можете установить его t вместо подтверждения. Но мне нравится это подтверждать, потому что я не часто перехожу к новым целям

Для версии 9.5.x в режиме организации вы можете использовать эту адаптацию кода из первоначальных ответов.

          (defun my/org-ask-headline-target (&optional prompt targets)
      (let* ((loc-prompt (or prompt "Headline"))
            (org-refile-targets (or targets '((nil :maxlevel . 2))))
            (hd (condition-case nil
                   (car (org-refile-get-location loc-prompt nil t))
                   (error (car org-refile-history)))))
        (goto-char (point-min))
        (outline-next-heading)
        (if (re-search-forward
             (format org-complex-heading-regexp-format (regexp-quote hd))
             nil t)
          (goto-char (point-at-bol))
        (goto-char (point-max)))))

в этой версии вам не нужно вставлять\n, вы можете использовать:empty-lines

      (setq org-capture-templates `("t" "Todo" entry
  (file+function "/path/to/todo.org" "My Headline" my/org-ask-headline-target)
  "* TODO %?"))

но в версии >= 9.5.5C-c C-w+:refile-targetsимеют тот же результат, и вы можете определить цели для каждого определения шаблона.

      (setq org-capture-templates `("t" "Todo" entry
  (file+headline "/path/to/todo.org" "My Headline")
  "* TODO %?" :refile-targets ((nil :maxlevel . 2))))
Другие вопросы по тегам