python 模式下的 emacs "comint-send-string: Buffer *spam* has no process"

emacs "comint-send-string: Buffer *spam* has no process" in python-mode

我有一组简单的 emacs lisp 行,用于插入我的姓名首字母和 time/datestamp,但这在某些模式下已停止工作(例如,python-模式)。在这些模式下,它会抛出错误 comint-send-string: Buffer *spam* has no process,其中 'spam' 是我尝试将时间戳添加到的缓冲区。

lisp 行是:

(defun msl-insert-datetime () (interactive) (insert (format-time-string "%Y-%m-%d %H:%M ABC: "))) (global-set-key [(control c)(control d)] 'msl-insert-datetime)

这在各种模式(文本模式、lisp 模式等)的缓冲区中工作正常,插入类似 2020-05-20 21:44 ABC: 的东西。但是在 Python 模式下(我在其中进行大部分编程)我得到的是上面的消息。

欢迎提出任何建议!我是 运行 Emacs 26.3 (build 2) Ubuntu 20.04.

C-cC-d 可能绑定在 python-mode 中(大概绑定到想要与劣质进程对话的东西)。

(global-set-key [(control c)(control d)] 'msl-insert-datetime)

这绑定了全局键映射中的序列——这是最低优先级键映射——并且你选择了一个为主要模式保留的序列。

Sequences consisting of ‘C-c’ followed by a control character or a digit are reserved for major modes.

-- C-hig (elisp)Key Binding Conventions

因此,一些主要模式在其(更高优先级)主要模式键盘映射中绑定它也就不足为奇了。

您可以在全局映射中更安全地使用某些其他序列,而不必担心它们被其他键映射使用:

Sequences consisting of ‘C-c’ and a letter (either upper or lower case) are reserved for users. Function keys <F5> through <F9> without modifier keys are also reserved for users to define.

请注意,您可以将此类序列用作前缀绑定,因此 lots 自定义命令可能会挂起 C-cd(例如)。

如果您的键盘上有 Super and/or Hyper 修改键,Emacs 通常也不会使用它们(至少默认情况下是这样)。

我还删除了默认的 C-z 绑定并将其用作自定义绑定的另一个前缀。

最后,我强烈建议阅读 https://www.masteringemacs.org/article/mastering-key-bindings-emacs 以了解键映射及其优先级。