2010-03-12 74 views
7

我试图对Emacs进行第一次修改。我录一个小键盘宏有Emacs的吐出来的elisp的,导致:添加键盘绑定到现有的Emacs模式

(setq add-docstring 
    "\C-rdef\C-n\C-a\C-m\C-p\C-i\C-u6\"\C-u3\C-b") 
(global-set-key "\C-c\C-d" 'add-docstring)

搜索Emacs的参考,不过,透露C-C C-d在diff模式已经绑定。我没有计划上使用差异模式,但未来是不可知的,我不想为自己陷阱。所以我希望这个键绑定只能在python模式下运行,它试图帮助我添加文档字符串。

在我的/usr/share/emacs/23.whatever/list/progmodes中,我找到了python.elcpython.el.gz。我解压缩了python.el.gz并获得了elisp文件的可读版本。但是,现在,文档对我来说变得不透明。

如何将我的密钥绑定添加到python模式而不是全局?

对于奖励积分,是否可以将更改应用于python模式而无需重新启动emacs或关闭打开的文件?这是自我修改的编辑器,我认为这很有可能。

+0

不可避免的后续:当然我开始使用diff/ediff,所以我很高兴回答者指出我正确的方向。 – 2011-10-28 17:40:03

回答

15

事实证明,C-C C-d已经绑定在python-mode(以'python-pdbtrack-toggle-stack-tracking),所以你可能要重新审视你的密钥绑定的选择。

备注:如果您只是想剪切/粘贴解决方案,请跳至答案的末尾。请继续阅读关于如何到达那里的解释 - 如果您想再次使用。

宏是一个很好的开始,但是你拥有的东西不会很有效。为了让您可以绑定到一个关键的东西,尝试的Mx插入 - 大骨节病宏为宏,你会得到:

(fset 'add-docstring 
    (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("def ...unprintable characters...6\"3" 0 "%d")) arg))) 

(HM ....非打印字符,我可以”不要把它剪切/粘贴到SO中,但你可以自己做出正确的选择)。通过一些小工具,你得到的结果等同于:

(fset 'add-docstring 
     (lambda (&optional arg) 
     "Keyboard macro." 
     (interactive "p") 
     (kmacro-exec-ring-item `(,(kbd "C-r def C-n C-a C-m C-p C-i C-u 6 \" C-u 3 C-b") 0 "%d") 
           arg))) 

这是第一步。有了上述,你可以做M-x add-docstring并得到你想要的行为。

下一步是你问的问题 - 如何在本地绑定密钥。为keybindings begins here,和你的兴趣的文档是Local Keymaps section,这导致了以下内容:

(add-hook 'python-mode-hook 
      (lambda() (define-key python-mode-map (kbd "C-c C-d") 'add-docstring))) 

此设置了一个匿名函数时python-mode开启时被调用,以及功能做一件事情 - 它在专门针对python模式的keymap中设置所需的键绑定。

如果你仔细阅读Keymaps section,你会看到如下的Emacs,只有用户应该结合commads到CC A,其中一个是任何较低或大写字母(如抄送d公约抄送Ť曹淑英都可用),和包约束的模式特定的绑定抄送%,其中是任何标点字符或控制键(例如CC CCC-c [C-C C-z)。

因此,如果您将绑定更改为C-c d,那么您几乎可以保证不会与任何软件包发生冲突。 Emacs附带的python.el遵循这些约定,Emacs附带的大多数(所有)包都是如此。

您会注意到我使用kbd来读取关键序列。它是便携式的,我发现它更容易阅读。

有进一步的事情,你可以做些什么来打扫一下:

  1. 把自定义的,而不是钩named function
  2. rewrite the macro in elisp
  3. 使用eval-after-load(见这个问题)

以下是我为#1做的事情,它为您提供了一个方便您进行其他定制的场所:

(add-hook 'python-mode-hook 'my-python-customizations) 
(defun my-python-customizations() 
    "set up my personal customizations for python mode" 
    ;; put other customizations in here 
    (define-key python-mode-map (kbd "C-c C-d") 'add-docstring)) 
(defun add-docstring (&optional arg) 
    "Keyboard macro." 
    (interactive "p") 
    (kmacro-exec-ring-item `(,(kbd "C-r def C-n C-a C-m C-p C-i C-u 6 \" C-u 3 C-b") 0 "%d") 
         arg)) 

使用命名函数是一个小清洁,因为如果你愿意,你可以稍后做(remove-hook 'python-mode-hook 'my-python-customizations)。此外,如果您查看钩子的值(C-h v python-mode-hook RET),很明显被调用(匿名函数更长,更难以阅读)。

对于奖励积分,将代码粘贴到您的.emacs之后M-x eval-region,这将告诉Emacs评估该区域中的代码。要查看现有python缓冲区中的更改,只需打开一个新的python文件/缓冲区,这将触发键绑定更改 - 这对所有python缓冲区都是常见的。

快乐的黑客攻击。

+0

很好的工作回答了我_meant_问的问题,而不是我实际询问的问题。我认为,这使我指出了正确的方向。 – 2010-03-12 14:16:29

4

首先,不要乱用python.el。你想要做的是为python模式创建自己的自定义绑定。这通常在您的主目录中的.emacs文件中完成。

在该文件中加入类似以下的(我没有测试过这一点 - 所以可能会有一些语法错误,我不使用Python我自己)

(add-hook 'python-mode-hook 
    '(lambda() (define-key python-mode-map "\C-c\C-d" 'add-doc-string))) 

这是使用挂钩机制。这是每次调用python模式时调用的函数。此功能仅将C-c C-d绑定到您的add-doc-string函数。

这个答案非常简短。阅读emacs文档中的.emacs文件,定制和挂钩。

+0

我带着我的问题来到了SO,因为我已经试过对文档进行格式化,而且事情没有意义。 – 2010-03-12 14:18:23