Как с умом настроить org-archive-location в org-mode

ПРЕДПОСЫЛКА: В организационном режиме переменная org-archive-location по умолчанию имеет значение «%s_archive::», поэтому файл «toto.org» архивируется в файл «toto.org_archive». Вместо этого я хотел бы, чтобы он был заархивирован в «toto.ref». Я использую org-mode версии 7.4 (вне сервера git).

Я бы подумал, что это так просто, как

(setq org-archive-location 
      `(replace-regexp-in-string ".org" ".ref" %s)
      )

Но мне указали, что это неправильно в LISP (плюс, это не работает). Мое окончательное решение заключается в следующем: вы должны быть в состоянии адаптироваться к наиболее умным конфигурациям org-archive-location:

(setq org-archive-location "%s::* ARCHIVES")
(defadvice org-extract-archive-file (after org-to-ref activate)
  (setq ad-return-value
        (replace-regexp-in-string "\\.org" ".ref" ad-return-value)
    )
  )

Обратите внимание, что:

1) Я добровольно не добавлял $ в конце «.org», чтобы правильно изменить «test.org.gpg» на «test.ref.gpg».

2) Кажется, что следует использовать регулярное выражение «\.org» (а не, скажем, «.org») (более подробное объяснение ниже в ответах).


person Jeremy    schedule 18.02.2011    source источник
comment
вы устанавливаете переменную в список, состоящий из replace-regexp-in-string (функция), .org, .ref и любого другого %s. Я предполагаю, что в этой переменной ожидается какая-то строка, представляющая спецификацию формата. Список, который выглядит как вызов функции, ничего не сделает...   -  person    schedule 19.02.2011


Ответы (4)


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

Вы можете добиться описанного вами эффекта, уведомив функцию org-extract-archive-file, которая генерирует расположение архива из org-archive-location:

(defadvice org-extract-archive-file (after org-to-ref activate)
  (setq ad-return-value
        (replace-regexp-in-string "\\.org" ".ref" ad-return-value)))

Это работает для меня сейчас, но, конечно, внутренности org-mode могут быть изменены, и это решение может не работать вечно.

person Sean    schedule 18.02.2011
comment
Шон, какую версию org-mode вы используете (я использую версию 7.4)? - person Jeremy; 20.02.2011
comment
Спасибо, это работает. Я не уверен насчет \\.org: разве это не должен быть \.org, чтобы точно соответствовать .org? - person Jeremy; 20.02.2011
comment
Регулярное выражение — \.org, но чтобы выразить это в строковом литерале, вам нужно заменить обратную косую черту другой обратной косой чертой. В противном случае Emacs интерпретирует \. как экранированная точка, которая совпадает с неэкранированной точкой. Попробуйте оценить строковый литерал \. с C-M-:, и вы увидите, что он оценивается как .. - person Sean; 20.02.2011

Вы не должны quote выражение, которое хотите вычислить. Также обратите внимание, что в регулярном выражении . соответствует любому символу.

person Svante    schedule 18.02.2011

Вот пример того, как указать файл, местоположение (например, основной заголовок) в файле, а также указать, следует ли включать дополнительную информацию об архиве:

(let* (
    (org-archive-location "~/todo.org::* TASKS")
    (org-archive-save-context-info nil))

  ...)
person lawlist    schedule 06.03.2014

Вы можете попробовать это: #+ARCHIVE: %s.ref:: в начале вашего оргфайла. Подробнее об этом читайте здесь.

Кроме того, другой интересный вариант — установить внутри вашего заголовка следующее, например:

* Main Header of tree
:PROPERTIES:
:ARCHIVE: toto.ref:: * Main Header of tree in archive file
:END:
** sub tree of main header and so on

Последнее я взял из этого видео.

person Rafael Nagel    schedule 02.11.2017