事实证明,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
来读取关键序列。它是便携式的,我发现它更容易阅读。
有进一步的事情,你可以做些什么来打扫一下:
- 把自定义的,而不是钩named function
- rewrite the macro in elisp
- 使用
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缓冲区都是常见的。
快乐的黑客攻击。
不可避免的后续:当然我开始使用diff/ediff,所以我很高兴回答者指出我正确的方向。 – 2011-10-28 17:40:03