【问题标题】:emacs "comint-send-string: Buffer *spam* has no process" in python-modeemacs “comint-send-string: Buffer *spam* has no process” 在 python 模式下
【发布时间】:2020-05-21 02:47:15
【问题描述】:

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

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 模式下(我的大部分编程工作都是在其中),我得到了上面的消息。

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

【问题讨论】:

    标签: shell emacs process


    【解决方案1】:

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

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

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

    由“C-c”后跟一个控制字符或数字组成的序列保留用于主要模式。

    -- C-hig (elisp)Key Binding Conventions

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

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

    由‘C-c’和一个字母组成的序列(无论是大写还是小写) case) 是为用户保留的。功能键 不带修饰键的也保留给用户定义。

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

    如果您的键盘上有 Super 和/或 Hyper 修饰键,那么 Emacs 通常也不会使用它们(至少默认情况下)。

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

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

    【讨论】:

    • 这给了我所需的解决方案。我刚刚将 lisp 命令更改为 (global-set-key [(control c)(d)] 'msl-insert-datetime),现在它可以在 Python 模式下正常工作。谢谢!
    • 不客气。我建议切换到指定键序列的 kbd 方法,因为这意味着您可以获取 Emacs 使用的键描述(例如,当您使用 C-h k 询问时),并将其直接插入 kbd 并作为结果你永远不会猜测如何描述任何键。在这种情况下,它将是 (global-set-key (kbd "C-c d") 'msl-insert-datetime),因为 Emacs 将该序列描述为 C-c d
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多