是否可以将变量传递到Emacs组织模式捕获?

时间:2013-11-15 18:56:35

标签: emacs org-mode

我正在使用emacs-24.3 for Windows,特别是Org-Mode,这太棒了。我正在尝试设置一个新的捕获模板,用于处理我工作的缺陷,并希望模板输出如下内容:

  • TODO 缺陷描述 链接到缺陷jira

e.g。

  • TODO用户登录到站点COM-19112的问题

我遇到的问题是URL与此http://www.jira.com/browse/COM-19112类似,我希望将其输出为COM-19112。要在emacs中正常执行此操作,我会这样做:

[[http://www.jira.com/browse/COM-19112][COM-19112]]

但是,在尝试设置组织捕获模板时,我只想输入一次COM-19112并在两个地方填充它。这是迄今为止我能得到的最好的 - 它给了我想要的东西,但我必须在提示时两次输入'COM-19112':

(setq org-capture-templates
  '(("d" "Defects" entry (file+headline "C:/EmacsOrg/Defects.org" "Tasks")
      "* TODO %? [[http://www.jira.com/browse/%^{Defect}][%^{Defect}]]")))

我在http://orgmode.org/manual/Template-expansion.html#fn-2上看不到任何可以解释如何创建可以在多个地方使用的变量的内容,但我确信有一种方法可以做到这一点。

如果有人能指出我正确的方向,我将非常感激。

此致

BebopSong

2 个答案:

答案 0 :(得分:4)

template expansion上的页面确实包含有关如何重新插入现有变量的信息。

 %\n         Insert the text entered at the nth %^{prompt}, where n is
             a number, starting from 1.

假设您的模板如上:

(setq org-capture-templates
      '(("d" "Defects" entry (file+headline "C:/EmacsOrg/Defects.org" "Tasks")
      "* TODO %? [[http://www.jira.com/browse/%^{Defect}][%^{Defect}]]")))

您可以将其替换为

(setq org-capture-templates
      '(("d" "Defects" entry (file+headline "C:/EmacsOrg/Defects.org" "Tasks")
      "* TODO %? [[http://www.jira.com/browse/%^{Defect}][%\\1]]")))

您可能需要根据正在定义的其他变量更改%\\1。 (它需要双反斜杠才能工作,因为\是一个转义字符)

答案 1 :(得分:2)

我有类似的情况,我使用类似于以下代码:

(defun org-at-special (type)
  "Check whether point is at a special link of the form [[TYPE:address]]
TYPE is given as string.
Returns the address."
  (save-excursion
    (when (and (looking-back (concat "\\[\\[\\(?:" type "\\([^][\n\r]+\\)?\\]\\[\\)?[^]]*\\(\\]\\)?"))
           (goto-char (match-beginning 0))
           (looking-at (concat "\\[\\[" type "\\([^][\n\r]+\\)\\]")))
      (match-string-no-properties 1))))

(require 'browse-url)

(defun org-open-google ()
  (let ((q (org-at-special "google:")))
    (when q
      (apply browse-url-browser-function  (list (concat "http://www.google.com/#q=" q)))
      t)))

(add-to-list 'org-open-at-point-functions 'org-open-google)

在此定义之后,您可以将[[google:stackoverflow]]之类的链接放入您的组织文件中。 您只需要定义自己的org-open-google函数,然后将其命名为org-open-defect或者您喜欢它。您必须将此名称添加到列表org-open-at-point-functions

我为你做了一些修改。因此,上述代码未经过严格测试。但是,我已经做了一些基本测试。

如果前缀始终为COM-您已经可以将其作为org-at-special的类型,则会重新识别[[COM-19112]]之类的链接,并且您具有所需的显示内容。那么你的特殊情况就是这样:

(defun org-open-COM- ()
  (let ((q (org-at-special "COM-")))
    (when q
      (apply browse-url-browser-function  (list (concat "http://www.jira.com/browse/COM-" q)))
      t)))

(add-to-list 'org-open-at-point-functions 'org-open-COM-)

之后,如下所示的捕获就足够了

(setq org-capture-templates
  '(("d" "Defects" entry (file+headline "/c/temp/Defects.org" "Tasks")
      "* TODO %? [[COM-%^{Defect}]]")))

因此,您只需要输入一次缺陷编号。