将键盘绑定添加到现有的Emacs Mod

2024-05-16 22:08:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试我对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.whatever/list/progmodes中,我找到了python.elc和{}。我解压缩了python.el.gz,得到了一个可读的elisp文件版本。不过,现在文档对我来说变得不透明了。在

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

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


Tags: 文件add模式diffglobaldocstringemacsset
2条回答

首先,不要乱来Python. 您要做的是为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文件、定制和钩子。在

结果是,C-C C-d已经绑定到python-mode(到'python-pdbtrack-toggle-stack-tracking),所以您可能需要重新考虑您选择的密钥绑定。在

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

宏是一个很好的开始,但你已经做的不太管用。要获取可以绑定到键的内容,请尝试对该宏执行M-x insert kbd macro,您将得到:

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

(嗯。。。。不可打印字符,我不能剪切/粘贴成这样,但你可以自己做得到正确的东西)。轻轻咀嚼一下,你得到的就相当于:

^{pr2}$

这是第一步。通过上面的方法,您可以执行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遵循的约定是只有用户才应该将commad绑定到C-ca,其中a是任何小写或大写字母(例如,C-C dC-C TC-C p,包将模式特定的绑定约束到C-C%,其中%是任何标点符号或控制键(例如C-C C-CC-C[C-C C-z)。在

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

您会注意到,我使用^{}读取键序列。它是便携的,我发现它更容易阅读。在

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

  1. 将自定义项放入named function
  2. rewrite the macro in elisp
  3. 使用^{}而不是钩子(参见这个问题)

以下是我要为#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)。另外,如果您查看hook的值(C-hv python mode hook RET),很明显会调用什么(匿名函数更长,更难读取)。在

对于加分,将代码粘贴到.emacsdoM-x eval区域之后,这将告诉Emacs在该区域中计算代码。要查看现有python缓冲区中的更改,只需打开一个新的python文件/缓冲区,这将触发keybinding更改,这是所有python缓冲区都通用的。在

快乐黑客。在

相关问题 更多 >