Emacs,更改默认的reftex引用

Emacs,更改默认的reftex引用,emacs,latex,Emacs,Latex,我想在使用reftex时修改emacs的行为,以便在按下“C-C[”并选择引用格式后,出现的默认正则表达式将给出我上次使用的引用(正常行为是默认为光标前的单词,这很少有任何用途).我经常连续多次引用同一来源,特别是在一张纸上做笔记时,因此这是一种节省一些击键的好方法,这就是我们都使用emacs的目的,对不对:) 我知道一点口齿不清,所以我希望我最终会自己想出一个办法来做这件事,但我认为值得问问周围是否有人先做了,再发明轮子也没有意义。(如果你确实想要这个功能,但也不知道如何实现,请告诉我,我完成

我想在使用reftex时修改emacs的行为,以便在按下“C-C[”并选择引用格式后,出现的默认正则表达式将给出我上次使用的引用(正常行为是默认为光标前的单词,这很少有任何用途).我经常连续多次引用同一来源,特别是在一张纸上做笔记时,因此这是一种节省一些击键的好方法,这就是我们都使用emacs的目的,对不对:)

我知道一点口齿不清,所以我希望我最终会自己想出一个办法来做这件事,但我认为值得问问周围是否有人先做了,再发明轮子也没有意义。(如果你确实想要这个功能,但也不知道如何实现,请告诉我,我完成后会给你发电子邮件。)


谢谢

重新定义
reftex get bibkey default
在加载reftex后(例如,在您的AUCTeX模式挂钩中)应该执行此操作。因此,最简单的方法是:

   (defun reftex-get-bibkey-default () (car reftex-cite-regexp-hist) )
但是,这将破坏默认行为,如果历史记录为空,则不会返回任何内容。在这种情况下,要保留reftex中的“上一个单词在点”行为,然后使用历史记录,可以通过以下方式重新定义它:

(defun reftex-get-bibkey-default () (if reftex-cite-regexp-hist
                                            (car reftex-cite-regexp-hist)
                                          (let* ((macro (reftex-what-macro 1)))
                                            (save-excursion
                                              (if (and macro (string-match "cite" (car macro)))
                                                  (goto-char (cdr macro)))
                                              (skip-chars-backward "^a-zA-Z0-9")
                                              (reftex-this-word)))
                                          )
    )
(警告:这是我写过的第一个超过3行的elisp代码,它可能是很糟糕的代码。但是它似乎可以工作。但是任何关于风格或最佳实践的评论都将不胜感激。)

我已经解决了!只需将以下代码添加到.emacs,它的行为完全符合我的期望。如果您之前没有引用过任何内容,那么它的行为将正常,否则默认引用将是最后使用的引用

(defvar reftex-last-citation nil)

(defadvice reftex-citation (after reftex-citation-and-remember-citation activate)
  "Save last citation to 'reftex-last-citation after running 'reftex-citation"
  (setq reftex-last-citation ad-return-value))

(defadvice reftex-get-bibkey-default (around reftex-just-return-last-citation activate)
  "If there is a 'reftex-last-citation then just return that instead of running 'reftex-get-bibkey-default"
  (if reftex-last-citation
      (setq ad-return-value reftex-last-citation)
    ad-do-it))
谢谢你的帮助,莫蒂默,没有你的起点,我永远不会来到这里


(只是想知道,你的解决方案为什么没有使用
defadvice
?正如我在上面暗示的,elisp对我来说都是非常新的,所以知道最好的方法会很有用。)

谢谢,但这并不是我想做的。(但现在我至少知道了如何开始!)我希望它是默认的,这样默认显示的正则表达式不是我上次输入的正则表达式,而是一个可以保证我上次引用的论文作为默认(/唯一)选择的正则表达式。因此,如果我输入“McDowell”作为正则表达式,但随后继续向下滚动,从我的参考书目文件中选择他的一篇论文,它将默认为“McDowell”那篇论文的名字是regex,所以我不必再滚动找它了。不是真的,因为通常我最后插入的键会给我很多条目,我会从中选择一个。我希望我最后选择的条目总是默认的,所以一种方法是将我上次使用的条目的标题、作者和年份设置为默认值t他使用了默认键。(很抱歉回复太慢,没有收到您评论的电子邮件通知。)