如何使用自定义函数在org-mode中删除一些标记

时间:2013-08-11 02:24:48

标签: emacs org-mode

任何人都可以请我帮我删除标题为:event:event:的标记,这些标记可能会或可能不会出现在标记为已完成的特定待办事项中。

如果没有其他标记,则要删除的表单为:event:。如果右边附加了一个附加标记,那么要删除的表单是:event - 因为连接到另一个标记的冒号需要保留 - 例如,:smith_john:我想将此功能用于所有待办事项,即使某些待办事项包含event标记。

这有点棘手,因为正常的搜索和替换仅限于todo列表中的这一个特定任务。我知道有关状态变化的标签删除功能,但我更喜欢使用自己的删除功能。

以下是附加到另一个标记的:event示例:

** Reference [#A] smith @ meeting; 08/09/2013; 8:30 a.m. :event:smith_john:
   DEADLINE: <2013-08-09 Fri 08:30 >  SCHEDULED: <2013-08-09 Fri >
   :PROPERTIES:
   :ToodledoID: 335265357
   :ToodledoFolder: EVENTS
   :Hash: 4a6b6cc7fbefa9b7695b12247bf84d15
   :END:
   These are some notes relating to the client named John Smith.

以下是不包含:event:event:标记的任务示例。 none函数应该能够像上面的任务一样关闭它。

** Next Action [#D] 0 @ kid's birthday -- 07/18/1993 :lawlist:
   DEADLINE: <2014-07-18 Fri >
   :PROPERTIES:
   :ToodledoID: 332902470
   :ToodledoFolder: TASKS
   :Hash: e7cf177f187d47c8fa8ca882f2725305
   :END:
   These are some notes relating to a task without an event tag.

以下是我用来将待办事项标记为None的函数,当与Toodledo同步时,它将被理解为等同于通常称为completed或{{1 }}。上面任务中的单词done是Toodledo todo状态,我选择用于我日历上​​的事件,单词Reference是我用于未来截止日期的任务。

Next Action

编辑:以下是上述(defun none (&optional default-heading) (interactive) (let ((lawlist-item default-heading) result) (unless lawlist-item (condition-case nil (progn (org-back-to-heading t) (setq lawlist-item (elt (org-heading-components) 4))) ) ) (org-todo "None") (org-priority ?E) (org-schedule 'remove) (org-deadline 'remove) (org-set-property "ToodledoFolder" "DONE") (setq org-archive-save-context-info nil) (setq org-archive-location "/Users/HOME/.0.data/*TODO*::* DONE") (org-archive-subtree) (goto-char (point-min)) (re-search-forward "^\* DONE" nil t) (condition-case err (progn (org-sort-entries t ?a) (lawlist-org-cleanup) ) ;; a custom pagination function. (error nil)) (re-search-forward lawlist-item nil t) (beginning-of-visual-line) (org-cycle-hide-drawers 'all) )) 函数中使用的清理函数,以防万一有人对以这种方式关闭特定待办事项的完整解决方案感兴趣:

none

4 个答案:

答案 0 :(得分:2)

只要点在标题上,以下内容应该有效:

(when (search-forward-regexp ":event\\|event:" (line-end-position) t)
  (replace-match "")
  (when (and (looking-at ":$\\|: ") (looking-back " "))
     (delete-char 1)))

答案 1 :(得分:1)

您可能会对以下内容感兴趣:

;; remove redundant tags of headlines (from David Maus)
(defun leuven--org-remove-redundant-tags ()
  "Remove redundant tags of headlines in current buffer.
A tag is considered redundant if it is local to a headline and inherited by
a parent headline."
  (interactive)
  (when (eq major-mode 'org-mode)
    (save-excursion
      (org-map-entries
       '(lambda ()
          (let ((alltags (split-string
                          (or (org-entry-get (point) "ALLTAGS") "")
                          ":"))
                local inherited tag)
            (dolist (tag alltags)
              (if (get-text-property 0 'inherited tag)
                  (push tag inherited) (push tag local)))
            (dolist (tag local)
              (if (member tag inherited) (org-toggle-tag tag 'off)))))
       t nil))))

答案 2 :(得分:1)

如果您只想在状态更改为DONE(或等效)时删除标记,则可以使用以下内容:

(defun zin/org-remove-tag (tag)
    "Removes `TAG' from current list of tags if present when todo
state is DONE."
  (when (org-entry-is-done-p)
    (org-toggle-tag tag 'off)))

(defun zin/remove-event ()
   "Removes `event' from list of tags when state is set to done."
  (zin/org-remove-tag "event"))

(add-hook 'org-after-todo-state-change-hook 'zin/remove-event)

(org-entry-is-done-p)将返回标题的DONE状态,如果未标记为已完成,则返回NIL。 org-toggle-tag将切换标记的当前状态,或者如果提供可选参数(在本例中为'on),则设置为'off'off

第一个函数对于任何给定标记都是通用的,而第二个函数特定于您想要的“事件”标记。

或者,您可以使用以下内容作为您的钩子:

(add-hook 'org-after-todo-state-change-hook '(lambda ()
                                               (zin/org-remove-tag "event")))

答案 3 :(得分:0)

虽然接受的答案很有效,但以下代码段使用org-mode函数来完成相同的结果 - org-set-tags-to可以使用字符串或列表作为其可选参数;并且,没有参数删除所有标签。

(let (tags)
  (save-excursion
    (org-back-to-heading t)
    (setq tags (org-element-property :tags (org-element-at-point))))
  (when (and tags (member "event" tags))
    (setq tags (delete "event" tags))
    (org-set-tags-to tags)))