如何评估存储在emacs寄存器中的elisp?

如何评估存储在emacs寄存器中的elisp?,emacs,elisp,Emacs,Elisp,其动机如下: 我有各种文件绑定到注册表。这让我可以跳转到像我的 通过运行C-xrjh或带有C-xrje的my.emacs文件来配置xmonad 我希望能够使用C-xrjh跳转到我的运行haskell缓冲区。但是,运行C-xrj会运行跳转到register函数,因此我不能只绑定C-xrj H 对我来说,最简单的解决方法是评估存储在寄存器中的elisp,从而将(运行haskell)存储在寄存器H中 但寄存器中似乎没有内置用于评估elisp的内容,这让我觉得我处理问题的方法不正确 我怎样才能解决这个问

其动机如下: 我有各种文件绑定到注册表。这让我可以跳转到像我的 通过运行
C-xrjh
或带有
C-xrje
的my.emacs文件来配置xmonad

我希望能够使用
C-xrjh
跳转到我的
运行haskell
缓冲区。但是,运行
C-xrj
会运行
跳转到register
函数,因此我不能只绑定
C-xrj H

对我来说,最简单的解决方法是评估存储在寄存器中的elisp,从而将
(运行haskell)
存储在寄存器
H

但寄存器中似乎没有内置用于评估elisp的内容,这让我觉得我处理问题的方法不正确


我怎样才能解决这个问题?我知道这可能属于超级用户风格问题的范围,但我在这里发布,因为我认为解决方案在于编写elisp。

跳转到寄存器不直接支持这一点,但您可以轻松扩展它:

(defadvice jump-to-register (around jump-to-buffer-maybe
                                     (register &optional delete)
                                     activate compile)
  (let ((r (get-register register)))
    (if (bufferp r)
        (switch-to-buffer r)
      ad-do-it) ))
为了使其工作,您选择的寄存器需要包含一个缓冲区对象。为了方便起见,您可能还需要定义一个函数,用于将缓冲区对象放入寄存器:

(defun buffer-to-register (buf reg)
  (interactive "bBuffer: \ncRegister: ")
  (set-register reg (get-buffer buf)) )

如果您真的想
eval
一个寄存器,而不是
切换到buffer
,那么修改应该很简单。我不清楚如何准确地设置合理的保护措施,以避免执行任何随机的文本,但是如果您重新输入交互式命令,它甚至不应该太不安全。

我认为,如果不涉及扭转
跳转到寄存器的右臂,直到它不再是
跳转到寄存器
,任务会容易得多。你能考虑接受一个不同的击键吗?否则,您可以将
C-xrj
绑定到一个包装器,该包装器调用
跳转来注册除一个后缀以外的所有后缀,但这会变得非常粗糙……这正是我所想的。问题是,跳转到寄存器似乎会根据寄存器中的内容做不同的事情。文件名=>打开文件;窗口配置=>加载窗口配置;frame config=>load frame config,因此我希望为缓冲区名称添加一些分派。在查看register.el之后,它似乎只是对寄存器的内容执行一个大的case语句,插入寄存器内容以查看其类型。我可以在运行时扩展这个case语句吗?不容易,不,除了复制粘贴定义并覆盖它。我建议采用建议路线。如果使用,您可以使用
C-C-z
轻松切换到劣质进程缓冲区。那可能不是你的情况。我不太在意如何评估寄存器。毕竟,这就是变量/函数D的用途。那么像这样的吗<代码>(defadvice跳转到寄存器(大约跳转到缓冲区可能(寄存器和可选删除)激活编译)(让((r(获取寄存器))(如果(functionp r)(funcall r)ad这样做))