Вставить ссылку на идентификатор организации в точке через завершение контура пути

11

В настоящее время для вставки внутренних ссылок org-id в режиме org, я перемещаюсь к заголовку или поднимаю его в виде повестки дня (поиск по заголовку Ca s, поиск RET), сохраняю ссылку с помощью Cl (org-store-link), возвращаясь туда, где Я хочу вставить ссылку, затем вставить ссылку с помощью Cc Cl (org-insert-link).

Вместо этого я предпочел бы сопоставить ключ, который позволяет мне вставить ссылку в текущей точке, используя завершение табуляции, аналогично org-refile (Cc Cw). Ожидаемым результатом будет внутренняя ссылка org-id в форме:

[[id:d7534b2f-c221-4dea-8566-d5ce3e4e1b78][Example Link]]

Просматривая org-id.el, кажется, что для этой цели был разработан org-id-get-with-outline-path-завершении. Я попытался:

(global-set-key "\C-ci" (lambda () (interactive) (org-id-get-with-outline-path-completion)))

но это не сработало как задумано.

В моем файле init.el есть следующее:

;; Use global IDs
(require 'org-id)
(setq org-id-link-to-org-use-id t)

;; Update ID file .org-id-locations on startup
(org-id-update-id-locations)

;; Refile options
(setq org-refile-targets (quote ((nil :maxlevel . 9) (org-agenda-files :maxlevel . 9))))
(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps t)
(setq org-refile-allow-creating-parent-nodes t)
sk8ingdom
источник
Вы пропускаете "-" в org-id-get-with outline-path-completion. Это проблема?
erikstokes
К сожалению, нет - это была просто опечатка. Я обновил вопрос.
sk8ingdom
Жаль. Как это терпит неудачу? Это работает, когда я пытаюсь это сделать.
erikstokes
Функция определенно называется. Он запрашивает у меня ввод, позволяет переходить через завершение табуляции (что замечательно и работает как задумано), но когда я нажимаю клавишу ввода, вместо вставки ссылки, он просто перемещает курсор к текущему заголовку, как Cc Cu (контурный заголовок).
sk8ingdom
Я думал, что это может быть вызвано устаревшей версией org, но попробовал самую последнюю версию в Emacs 24.5, так что это должно быть что-то в моей конфигурации. Кто-нибудь может подтвердить, что мой код выше действительно вставляет ссылку для них?
sk8ingdom

Ответы:

6

Я изучил источник в режиме org и обнаружил минимально документированную функцию. Если вы определяете функцию org-TYPE-complete-link, она будет использоваться для обеспечения завершения для ссылок типа TYPE. Так что нам просто нужно определить функцию, org-id-complete-linkкоторая выполняет наше завершение и возвращает ссылку (включая префикс «id:»).

(defun org-id-complete-link (&optional arg)
  "Create an id: link using completion"
  (concat "id:"
          (org-id-get-with-outline-path-completion)))

Вставьте ссылку обычным способом (с помощью C-c C-l), выберите «id:» в качестве типа и сработает функция завершения.

РЕДАКТИРОВАТЬ: Начиная с org-modeверсии 9.0 просто определение функции, как указано выше, больше не работает ( ссылка ). Вместо этого вы должны добавить функцию завершения к org-link-parametersиспользованию

(org-link-set-parameters "id"
                         :complete 'org-id-complete-link)
erikstokes
источник
Это отлично и работает как задумано! Единственной модификацией, которую я сделал, было добавление org-refile-target в качестве аргумента для org-id-get-with-outline-path-complete. Таким образом, я могу получить ссылки из ЛЮБОГО из моих файлов org. Спасибо за вашу помощь!
sk8ingdom
@ sk8ingdom Можете ли вы обновить вопрос, чтобы включить ваше окончательное решение? Я не уверен, что документ имеет в видуTARGETS may be a setting for ‘org-refile-targets’ to define eligible headlines.
кшеной
Окончательное решение состоит в том, чтобы просто определить вышеуказанную функцию, а также вызвать ее, org-link-set-parametersесли вы используете org-mode9. Дополнительный аргумент, org-id-get-with-outline-path-completionпозволяющий вам ограничить заголовки, которые вы выбрали, точно так же, как org-refile-targetsи при повторной пересылке. См. Справку по всем вопросам, но общий параметр - ((org-agenda-files :maxlevel . 3) (nil :maxlevel . 2))это 3 уровня в файлах повестки дня и 2 уровня в текущем буфере.
erikstokes