Python 将键盘绑定添加到现有Emacs模式

Python 将键盘绑定添加到现有Emacs模式,python,emacs,keyboard-shortcuts,elisp,Python,Emacs,Keyboard Shortcuts,Elisp,我正在尝试对Emacs进行第一次修改。我录制了一个小键盘宏,并让Emacs将其作为elisp输出,结果是: (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-d已经绑定到diff模式。我不打算使用diff模式,但未来是不可知的,我不想给自己设陷阱。所以我希望这个keybindin

我正在尝试对Emacs进行第一次修改。我录制了一个小键盘宏,并让Emacs将其作为elisp输出,结果是:

(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-d已经绑定到diff模式。我不打算使用diff模式,但未来是不可知的,我不想给自己设陷阱。所以我希望这个keybinding只在python模式下运行,它试图帮助我添加docstring

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

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


是否可以在不重新启动emacs或关闭打开的文件的情况下将更改应用到python模式以获得额外的积分?这是一个自我修改的编辑器,我想这很有可能

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

在该文件中添加如下内容(我没有测试过——因此语法中可能有一些错误,我自己也不使用python)

这是使用挂钩机制。它是一个每次调用python模式时都会调用的函数。此函数仅将
C-C-d
绑定到您的
adddocstring
函数

这个答案很简单。阅读emacs文档中的.emacs文件、定制和钩子。

事实证明,C-C-d已经在
python模式下绑定(到
'python-pdbtrack-toggle-stack-tracking
),因此您可能需要重新选择键绑定

注意:如果您只想剪切/粘贴解决方案,请跳到答案的末尾。请继续阅读,了解如何到达目的地的说明,以防您想再次到达目的地

宏是一个很好的开始,但是您所拥有的不会很有效。要获得可以绑定到某个键的内容,请尝试为该宏使用M-x insert kbd宏,您将获得:

(fset 'add-docstring
   (lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("def ...unprintable characters...6\"3" 0 "%d")) arg)))
(嗯……不可打印的字符,我不能剪切/粘贴成这样,但你可以自己做得到正确的东西)。稍微咀嚼一下,你得到的相当于:

(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添加docstring
并获得所需的行为

下一步就是您要问的——如何在本地绑定到密钥。您感兴趣的文档是,这导致以下内容:

(add-hook 'python-mode-hook
          (lambda () (define-key python-mode-map (kbd "C-c C-d") 'add-docstring)))
这将设置一个匿名函数,当
python模式
打开时调用该函数,该函数只做一件事——它在keymap中专门为python模式设置所需的密钥绑定

如果仔细阅读,您会发现Emacs遵循的约定是,只有用户才能将commads绑定到C-CA,其中a是任何小写或大写字母(例如C-C-d C-C-C-C-C-p都可用),包将特定于模式的绑定约束到C-C%,其中%是任何标点字符或控制键(例如C-C-C-C-C-C[C-z])

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

你会注意到,我习惯于阅读关键序列。它是便携式的,我发现它更容易阅读

你还可以做更多的事情来清理这个问题:

  • 将定制放在一个文件夹中
  • 使用而不是挂钩(参见此问题)
  • 下面是我为#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))
    
    使用命名函数会更简洁一些,因为您可以稍后执行
    (删除hook'python mode hook'my python自定义)
    ,如果您愿意的话。此外,如果您查看hook的值(C-h v python mode hook RET),很明显会调用什么(匿名函数更长,更难阅读)

    另外,在将代码粘贴到
    .emacs
    do M-x eval区域后,该区域将告诉emacs对该区域中的代码进行求值。要查看现有python缓冲区中的更改,您只需打开一个新的python文件/缓冲区,这将触发keybinding更改,这是所有python缓冲区所共有的


    愉快的黑客行为。

    很好地回答了我本想问的问题,而不是我实际问的问题。我认为,这为我指明了正确的方向。我提出这个问题是因为我已经尝试过将文档变灰,但事情没有意义。
    (lambda…)
    被引用?不可避免的后续行动:当然,我开始使用diff/ediff,所以我很高兴回答者为我指明了正确的方向。
    (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))